自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java帝國(guó)之安全爭(zhēng)斗

安全 應(yīng)用安全
在Java帝國(guó)第三代國(guó)王的推動(dòng)下,帝國(guó)對(duì)臣民們提供了一個(gè)叫做Java 認(rèn)證與授權(quán)服務(wù)(Java Authentication Authorization Service, 簡(jiǎn)稱JAAS)的東西, 在第四代國(guó)王的爭(zhēng)取下, JAAS成功地進(jìn)入了JDK,成為了標(biāo)準(zhǔn)包的一部分。

1.前言

在Java帝國(guó)第三代國(guó)王的推動(dòng)下,帝國(guó)對(duì)臣民們提供了一個(gè)叫做Java 認(rèn)證與授權(quán)服務(wù)(Java Authentication Authorization Service, 簡(jiǎn)稱JAAS)的東西, 在第四代國(guó)王的爭(zhēng)取下, JAAS成功地進(jìn)入了JDK,成為了標(biāo)準(zhǔn)包的一部分。

國(guó)王希望JAAS能夠一統(tǒng)安全領(lǐng)域,像JDBC那樣引發(fā)使用的狂潮,成為一個(gè)重要的基礎(chǔ)設(shè)施,特意設(shè)置了一個(gè)新職位JAAS大臣,任命了一個(gè)自己的心腹去推動(dòng)這件事情。

[[224340]]

可是希望越大,失望就越大,除了幾家利益相關(guān)的豪門(mén)望族在不斷地?fù)u旗吶喊之外,臣民們對(duì)JAAS不屑一顧,沒(méi)多少人使用。

2雷秀才

IO大臣這一天在家里閑得無(wú)聊, 帶著忠心耿耿的幕僚InputReader 出去微服私訪,來(lái)到了京城一個(gè)著名的酒館,點(diǎn)了幾樣精致小菜,一壺美酒。還沒(méi)開(kāi)吃,就看到鄰桌的一個(gè)書(shū)生在唉聲嘆氣。

IO大臣心中一動(dòng),就把他叫過(guò)來(lái)一起聊聊。

原來(lái)這位書(shū)生是雷秀才,說(shuō)是家鄉(xiāng)賦稅沉重,都沒(méi)法活下去了,特意來(lái)京城上訪,無(wú)奈不得其法,連門(mén)都進(jìn)不去。

IO大臣起了好奇心,忙問(wèn)是怎么回事。

雷秀才說(shuō):“都是JAAS惹得禍。”

“JAAS?”

“就是認(rèn)證和授權(quán)嘛!”  雷秀才看到對(duì)方不知道,略有失望之色。

“認(rèn)證? 授權(quán)?”

“認(rèn)證就是確定你是誰(shuí), 通常需要驗(yàn)證對(duì)方提供的用戶名和密碼。  授權(quán)就是確定你能做什么。比如能否創(chuàng)建賬號(hào),能夠刪除用戶等等。”

“呃呃,想起來(lái)了,為什么不用官方的JAAS,帝國(guó)的標(biāo)準(zhǔn)還是挺好的嘛,比如JDBC。”

“老先生您有所不知,JDBC標(biāo)準(zhǔn)自然是沒(méi)得說(shuō), 但是這個(gè)JAAS,唉,用起來(lái)極為繁瑣,大家都不愿意使用??墒悄莻€(gè)JAAS大臣根本不管這些,一直瘋狂地推廣JAAS, 如果不用,就要課以重稅, 我們都活不下去了。”

“這倒是有點(diǎn)麻煩,你們打算怎么辦?”  IO大臣先去試探對(duì)方套路。

雷秀才壓低了聲音:“不瞞老先生,我們家族已經(jīng)推出了一個(gè)新的認(rèn)證和授權(quán)的系統(tǒng),叫做JSecurity,想托京城的大人們獻(xiàn)給陛下,把JAAS替換掉。 ”

“哦?!”  IO大臣坐直了身體,這可是一件大事!

3JSecurity

IO大臣和InputReader 交換了一下眼色: 一個(gè)新的機(jī)會(huì)到來(lái)了!

之前和線程大臣斗,和XML大臣斗,和JDBC/JTA大臣斗,打來(lái)打去,殺來(lái)殺去,自己也占不到什么便宜。

這一次也許可以把安全領(lǐng)域給抓?。?/p>

InputReader問(wèn)道: “你說(shuō)說(shuō)這個(gè)JSecurity有什么好處? ”

“簡(jiǎn)單,靈活,好用!比JAAS好用多了!” 雷秀才說(shuō)。

“太抽象了,來(lái)點(diǎn)干貨。”

雷秀才突然警惕起來(lái),只是喝酒,笑而不語(yǔ)。

IO大臣決定打開(kāi)天窗說(shuō)亮話: “不瞞你說(shuō),我就是當(dāng)朝的IO大臣,你不用怕,我可以幫你上奏陛下。”

“啊?!” 雷秀才滿臉驚詫之色,沒(méi)想到在這里竟然偶遇當(dāng)朝大員, 看來(lái)上午去廟里拜佛是對(duì)的,趕緊站起來(lái)行禮: “失敬失敬!”

IO大臣說(shuō):“現(xiàn)在可以聊聊你的JSecurity了吧?”

雷秀才早有準(zhǔn)備,從袖子中抽取出兩張寫(xiě)滿了代碼的紙,呈給IO大臣和InputReader:

  1. Subject currentUser = SecurityUtils.getSubject(); 
  2.  
  3. UsernamePasswordToken token = new UsernamePasswordToken("liuxin""123456"); 
  4.  
  5. currentUser.login( token ); 
  6.  
  7. if (currentUser.hasRole( "admin" )) { 
  8.     logger.info("You're Administrator!" ); 
  9.  
  10. if (currentUser.isPermitted( "user:delete" )) { 
  11.     logger.info("You can delete any users! be careful!"); 
  12. currentUser.logout(); 

(友情提示:代碼可左右滑動(dòng))

IO大臣戴上老花鏡,舉著紙看了半天:“你這里為什么叫做Subject?。?怎么不叫User?”

“回大人,這個(gè)Subject 是安全領(lǐng)域的一個(gè)術(shù)語(yǔ),表示了所謂的‘主體’,既可以代表用戶,也可以代表程序(網(wǎng)絡(luò)爬蟲(chóng)等),我老家的人也覺(jué)得這個(gè)術(shù)語(yǔ)有點(diǎn)難于理解,也想用User這樣通俗易懂的說(shuō)法,但是考慮到現(xiàn)在很多系統(tǒng)中都有User這個(gè)概念,為了避免沖突,還是叫做Subject好了。 ”

InputReader問(wèn)道:“你那個(gè)login方法,要是登錄失敗了怎么辦? ”

“其實(shí)那個(gè)方法會(huì)拋出異常,需要應(yīng)用程序處理,我們提供了很多Exception類,分別應(yīng)對(duì)各種情況,比如賬號(hào)未知( UnknownAccountException) , 密碼不正確(IncorrectCredentialsException) , 賬戶已鎖(LockedAccountException) ,  嘗試次數(shù)太多(ExcessiveAttemptsException) 等等。 “

IO大臣說(shuō):“但是程序給用戶提供錯(cuò)誤消息時(shí),一定要提供模糊的信息,不能被別有用心的人利用,對(duì)吧?”

“沒(méi)錯(cuò),大人,給用戶看的錯(cuò)誤消息一定得是模糊的,例如: 用戶名或者密碼不正確。 ” 雷秀才看到IO大臣開(kāi)始深入思考了,非常高興。

“這里可以判斷一個(gè)用戶擁有什么角色(Role), 以及有什么權(quán)限(Permission),這個(gè)角色和權(quán)限直接有什么關(guān)系?。?”  InputStream繼續(xù)問(wèn)道。

“這個(gè)比較簡(jiǎn)單,角色可以簡(jiǎn)單地認(rèn)為是一些權(quán)限的集合,比如admin這個(gè)角色,它的權(quán)限可能有刪除用戶,查看用戶,修改用戶等,再比如viewer這個(gè)角色,可能只有查看用戶的權(quán)限了。”

“那個(gè)user:delete又是什么意思?” IO大臣目光如炬 。

按照以往的宮廷斗爭(zhēng)經(jīng)驗(yàn),這些細(xì)節(jié)非得搞清楚不可,要不然被別人抓住把柄,在朝堂上可下不來(lái)臺(tái),文武大臣們表面上不動(dòng)聲色,心里早已把你鄙視千百遍了,自己可不能重蹈JTA大臣的覆轍。

雷秀才道:“那是我們定義的一種權(quán)限符號(hào)規(guī)則,格式是這樣的:資源:操作:實(shí)例, 用兩個(gè)冒號(hào)分開(kāi),例如:

user:create:U001 表示對(duì)用戶資源實(shí)例U001進(jìn)行create操作

user:create 表示對(duì)資源進(jìn)行create操作,相當(dāng)于user:create:*

user:*:U001    表示對(duì)用戶資源實(shí)例01進(jìn)行所有操作”

IO大臣點(diǎn)了點(diǎn)頭,格式由JSecurity定義,但是數(shù)據(jù)內(nèi)容需要應(yīng)用程序來(lái)確定。

InputReader突然說(shuō):“大人您記得提出Java注解的安翰林嗎, 如果這個(gè)JSecurity支持注解就好了。”

雷秀才說(shuō):“支持支持,那個(gè)注解挺好用的。”

  1. @RequiresAuthentication 
  2. public void updateAccount(Account userAccount) { 
  3.     //用戶認(rèn)證了以后才可以執(zhí)行該方法 
  4.     ... 
  5.  
  6. @RequiresPermissions("account:create"
  7. public void createAccount(Account account) { 
  8.     //用戶必須具備account:create這個(gè)權(quán)限 
  9.     //才能執(zhí)行該方法 
  10.     ... 
  11.  
  12. @RequiresRoles("admin"
  13. public void deleteUser(User user) { 
  14.     //只有具備admin這個(gè)角色的用戶才能執(zhí)行該方法 
  15.     ... 

IO大臣覺(jué)得此處耳目眾多,不宜久留,提議回自己府上繼續(xù)商談。

4Realm

三人回到IO大臣府中,還沒(méi)等上茶,InputReader就著急地問(wèn)道:“你那個(gè)代碼看起來(lái)挺簡(jiǎn)單,只是JSecurity去哪里驗(yàn)證這些用戶名,密碼,還有權(quán)限,角色啊?”

看到問(wèn)題越來(lái)越深入,雷秀才也越來(lái)越高興,看來(lái)今天真的遇到貴人了。

“這真是一個(gè)好問(wèn)題啊,大人,” 雷秀才說(shuō)道, “對(duì)于每個(gè)應(yīng)用來(lái)說(shuō),這些安全相關(guān)的數(shù)據(jù)保存的地方可能都不一樣,可能在文本文件中, 數(shù)據(jù)庫(kù)中,或者LDAP服務(wù)器中......  數(shù)據(jù)格式也不盡相同,有的把用戶叫做user, 有的可能叫做username, 有些把密碼叫做password,有些可能叫做pwd......  考慮到我們JSecurity是個(gè)框架,非得做出一個(gè)抽象的概念才行,這個(gè)概念就叫做Realm ,聽(tīng)起來(lái)也稍微有點(diǎn)古怪。”

雷秀才不好意思地笑了笑,繼續(xù)往下說(shuō):“這個(gè)Realm 是一個(gè)接口,就像一座橋梁,把應(yīng)用程序特定的數(shù)據(jù)和我們JSecurity框架能理解的格式給聯(lián)系起來(lái)! 它可以把用戶應(yīng)用特有的安全數(shù)據(jù)轉(zhuǎn)化成JSecurity能理解的格式。”

“ 難道每個(gè)應(yīng)用都得提供一個(gè)獨(dú)特的JDBCRealm/LDAPRealm/IniRealm這樣的實(shí)現(xiàn)類嗎? ”  IO大臣表示不滿。

“不不,”雷秀才急忙救火,“為了降低應(yīng)用程序的負(fù)擔(dān),我們的JSecurity框架已經(jīng)提供了這些缺省的實(shí)現(xiàn),大家在使用的時(shí)候只要稍微做點(diǎn)調(diào)整就可以, 比如說(shuō)大人您有個(gè)應(yīng)用程序,用數(shù)據(jù)庫(kù)表存儲(chǔ)了用戶名和密碼,usesr(id ,name, pwd......), 您只要提供一個(gè)sql 給JDBCRealm,我們框架就可以自動(dòng)完成認(rèn)證了。”

雷秀才又拋出了一張圖。

InputReader 看著這張圖,自動(dòng)腦補(bǔ)了整個(gè)認(rèn)證的過(guò)程:

1. 應(yīng)用配置使用JDBCRealm (當(dāng)然得提供數(shù)據(jù)庫(kù)的連接信息)

2. 應(yīng)用告訴JSecurity 怎么從用戶表中根據(jù)用戶名獲取password,關(guān)鍵是那條sql:

jdbcRealm.authenticationQuery = select pwd from users where name= ?

3. 用戶執(zhí)行subject.login操作,JSecurity 使用SQL進(jìn)行查詢,看看用戶名,密碼是否匹配數(shù)據(jù)庫(kù)的值。

(注: 簡(jiǎn)單起見(jiàn),這里故意忽略了使用salt對(duì)密碼做hash的場(chǎng)景)

對(duì)于角色和權(quán)限,也可以提供類似的sql ,讓JSeurity從數(shù)據(jù)庫(kù)表中獲取相關(guān)的數(shù)據(jù):

jdbcRealm.userRolesQuery = "SELECT role_name FROM user_roles WHERE user_name = ?"

jdbcRealm.permissionsQuery = "SELECT permission FROM roles_permissions WHERE role_name = ?"

“一個(gè)應(yīng)用程序要是配置了多個(gè)Realm ,認(rèn)證時(shí)該怎么處理?”  InputReader繼續(xù)刨根問(wèn)底。

雷秀才暗自佩服InputReader心思縝密, 說(shuō)道:“我們定義了一個(gè)接口,叫做AuthenticationStrategy, 用來(lái)定義認(rèn)證多個(gè)Realm時(shí)該怎么處理, 我們也提供了幾個(gè)默認(rèn)的實(shí)現(xiàn),比如FirstSuccessfulStrategy,只要遇到一個(gè)Realm認(rèn)證成功就算成功;或者AllSuccessfulStrategy,必須所有的Realm都認(rèn)證成功。”

InputReader點(diǎn)點(diǎn)頭,看來(lái)他們考慮得挺仔細(xì)。很明顯,對(duì)于授權(quán),也可以定義類似的策略。

雷秀才畫(huà)了一張圖,展示了認(rèn)證和授權(quán)的架構(gòu):

5Session管理

“嗯,我覺(jué)得對(duì)于認(rèn)證和授權(quán),你們做得很不錯(cuò)了!”  IO大臣試圖總結(jié)。

“大人,我們還支持一些很誘人的功能。例如Session管理。 ”

“Session ? 那不是Tomcat之類的 Web Container要做的事情嗎?”  InputReader 問(wèn)道。

“是啊,所以一般情況下,你想用Session,必須得有個(gè)像Tomcat, Jetty這樣的Web Container才行,但是如果你使用了我們的JSecurity, 根本不用什么Tomcat, Jetty,我們對(duì)Session內(nèi)置是支持的,也就是說(shuō)即使是桌面應(yīng)用,也可以使用Session:”

Subject currentUser = SecurityUtils.getSubject();

Session session = currentUser.getSession();

session.setAttribute( "someKey", someValue);

“這是個(gè)不錯(cuò)的賣點(diǎn)??!” InputReader 對(duì)IO大臣使眼色。

“還有什么功能? ” IO大臣胃口不小。

“我們還提供了一些工具類,可以進(jìn)行加密, 當(dāng)然了,我們還對(duì)Web開(kāi)發(fā)提供了強(qiáng)大的支持。”

“大人,屬下覺(jué)得這個(gè)API設(shè)計(jì)得確實(shí)挺簡(jiǎn)單的,比那個(gè)JAAS清爽多了”。InputReader對(duì)IO大臣說(shuō)道。

6尾聲

IO大臣很高興,意氣風(fēng)發(fā),充滿正義,他鏗鏘有力地說(shuō):“  我們陛下乃一代圣君,但是被JAAS這些大臣給蒙蔽了,這樣下去,民不聊生,Java帝國(guó)就要亡了,明天老夫就去參它一本!”

雷秀才看到當(dāng)朝大員肯為自己出頭,感動(dòng)得無(wú)以復(fù)加。

可是InputReader拉過(guò)IO大臣悄悄地說(shuō):“大人,這個(gè)JAAS歷經(jīng)兩代國(guó)王的努力才進(jìn)入JDK, 充分代表了豪門(mén)望族的利益,再說(shuō)JAAS大臣是國(guó)王身邊的紅人, 不可能說(shuō)廢就廢,您要這么上奏,肯定碰釘子, 還得曲線救國(guó)。”

“曲線救國(guó)?”

“屬下建議先讓這個(gè)JSecurity 開(kāi)源了, 讓它加入著名的民間組織Apache,先讓臣民們用起來(lái),咱們暗中再資助一下,這么好用的東西肯定能形成氣候, 等到呈星火燎原之勢(shì),我們的陛下也不得不讓步,到時(shí)候JAAS大臣估計(jì)就要倒臺(tái)了。”

IO大臣點(diǎn)頭贊許。

第二天,雷秀才被送往Apache , 在那里JSeurity被改名為Shiro,開(kāi)始向民間傳播。

果然,幾年以后,越來(lái)越多的人喜歡上了Shiro, JAAS備受冷落,國(guó)王見(jiàn)狀,只好讓JAAS大臣回家養(yǎng)老去了。

【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)coderising獲取授權(quán)】

戳這里,看該作者更多好文

 

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專欄
相關(guān)推薦

2017-08-16 15:11:29

JavaJDBCJTA

2017-10-12 14:56:11

2017-02-27 14:25:50

Java隊(duì)列Web

2017-02-28 08:57:41

JavaJMS隊(duì)列

2017-11-22 14:31:24

華為云

2017-11-14 14:41:11

Java泛型IO

2009-12-24 09:56:01

JDK.NET CLR

2010-10-12 11:02:42

職場(chǎng)

2009-02-01 14:59:38

服務(wù)器虛擬化云計(jì)算

2011-04-26 09:29:47

云計(jì)算

2014-01-08 10:50:27

12306

2010-09-20 11:39:50

2018-09-13 14:18:20

C語(yǔ)言Java程序員

2017-08-03 15:44:22

2020-08-30 14:34:42

Java語(yǔ)言安全編碼web安全

2009-09-08 10:36:11

云計(jì)算爭(zhēng)斗中國(guó)企業(yè)

2009-09-15 09:56:13

VMwareXen

2013-10-22 10:23:12

2020-09-10 14:18:35

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全技術(shù)周刊

2022-10-21 14:12:06

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)