JBoss AS 7:自定义登录模块
為什么要使用Java EE標(biāo)準(zhǔn)認(rèn)證? Java EE安全入門
Java EE規(guī)范的一部分是針對(duì)Web和EE應(yīng)用程序的安全性,這使得在web.xml中指定聲明性約束成為可能(例如,“角色X是訪問(wèn)URL“ / protected / *”的資源所必需的)”,并且以編程方式對(duì)其進(jìn)行控制,即驗(yàn)證用戶是否具有特定角色(請(qǐng)參見HttpServletRequest.isUserInRole )。
其工作方式如下:
- 自定義表單對(duì)發(fā)布操作和字段(以j_開頭)使用“魔術(shù)”值,這些值由服務(wù)器攔截并處理
如果這不是您的新手,那么我強(qiáng)烈建議您閱讀Java EE 5教程–示例:保護(hù)Web應(yīng)用程序 (使用JSP頁(yè)面進(jìn)行基于表單的身份驗(yàn)證,包括安全性約束規(guī)范,使用JAX-WS進(jìn)行基本身份驗(yàn)證,保護(hù)企業(yè)Bean,使用isCallerInRole和getCallerPrincipal方法)。
為什么要打擾?
- 聲明式安全性與業(yè)務(wù)代碼完全分離
- 在Web應(yīng)用程序與EJB之間傳播安全性信息很容易(在EJB中,您可以通過(guò)xml或@RolesAllowed之類的注釋以聲明方式保護(hù)完整的bean或特定方法)
- 切換到其他身份驗(yàn)證機(jī)制(例如LDAP)很容易,并且很可能會(huì)支持SSO
自定義登錄模塊實(shí)施選項(xiàng)
如果JBoss 提供的現(xiàn)成的登錄模塊(也稱為安全域)(例如UsersRoles,Ldap,Database,Certificate)不足以滿足您的需求,則可以調(diào)整其中之一或?qū)崿F(xiàn)自己的登錄模塊 。 您可以:
JBoss EAP 5 安全指南 12.2。 自定義模塊對(duì)基本模塊(AbstractServerLoginModule,UsernamePasswordLoginModule)以及子類或其他任何標(biāo)準(zhǔn)模塊的子類化如何進(jìn)行了出色的描述,包括對(duì)實(shí)現(xiàn)/覆蓋的關(guān)鍵方法的描述。 您必須閱讀它。 (在這方面,該指南仍然完全適用于JBoss AS7 。)定制的JndiUserAndPass模塊示例 (擴(kuò)展了UsernamePasswordLoginModule)也值得一讀–它使用模塊選項(xiàng)和JNDI查找。
示例:自定義UsernamePasswordLoginModule子類
請(qǐng)參閱MySimpleUsernamePasswordLoginModule的源代碼,該源代碼擴(kuò)展了JBoss的UsernamePasswordLoginModule 。
抽象的UsernamePasswordLoginModule ( 源代碼 )通過(guò)比較用戶提供的相等性密碼與從子類實(shí)現(xiàn)的getUsersPassword方法返回的密碼進(jìn)行比較。 您可以使用方法getUsername獲取嘗試登錄的用戶的用戶名。
實(shí)現(xiàn)抽象方法
getUsersPassword()
實(shí)現(xiàn)getUsersPassword()可以在任何地方查找用戶密碼。 如果您不以純文本格式存儲(chǔ)密碼,請(qǐng)閱讀下面的其他方法來(lái)自定義行為
getRoleSets()
實(shí)現(xiàn)getRoleSets()(來(lái)自AbstractServerLoginModule)以返回至少一個(gè)名為“ Roles”的組,其中包含分配給用戶的0+個(gè)角色,請(qǐng)參見此帖子的源代碼中的實(shí)現(xiàn)。 通常,您會(huì)在某個(gè)地方查找用戶的角色(而不是返回硬編碼的“ user_role”角色)。
(可選)擴(kuò)展initialize(..)以訪問(wèn)模塊選項(xiàng)等。
通常,您還需要擴(kuò)展initialize(Subject subject,CallbackHandler callbackHandler,Map sharedState,Map options) (每次身份驗(yàn)證嘗試都需要調(diào)用),
- 要獲取通過(guò)安全域配置中的<module-option ..>元素聲明的屬性的值– 請(qǐng)參見JBoss 5定制模塊示例
- 要進(jìn)行其他初始化,例如通過(guò)JNDI查找數(shù)據(jù)源–請(qǐng)參見DatabaseServerLoginModule
(可選)重寫其他方法以自定義行為
如果您不以純文本形式存儲(chǔ)密碼(明智的選擇!),并且不支持開箱即用的哈希方法,則可以覆蓋createPasswordHash(String username,String password,String摘要選項(xiàng))來(lái)哈希/加密用戶提供的密碼密碼與存儲(chǔ)的密碼進(jìn)行比較之前。
或者,您可以重寫validatePassword(String inputPassword,String ExpectedPassword)以在比較之前對(duì)密碼進(jìn)行任何轉(zhuǎn)換,甚至可以進(jìn)行比相等類型不同的比較。
自定義登錄模塊部署選項(xiàng)
在JBoss AS中,您可以
在每種情況下,您都必須在JBoss配置(standalone / configuration / standalone.xml或domain / configuration / domain.xml)中聲明一個(gè)對(duì)應(yīng)的安全域:
<security-domain name='form-auth' cache-type='default'><authentication><login-module code='custom.MySimpleUsernamePasswordLoginModule' flag='required'><!--module-option name='exampleProperty' value='exampleValue'/--></login-module></authentication> </security-domain>code屬性應(yīng)包含您的登錄模塊類的完全限定名稱,并且安全域的名稱必須與jboss-web.xml中的聲明匹配:
<?xml version='1.0' encoding='UTF-8'?> <jboss-web><security-domain>form-auth</security-domain><disable-audit>true</disable-audit> </jboss-web>編碼
下載包含自定義登錄模塊MySimpleUsernamePasswordLoginModule 的webapp jboss-custom-login ,并按照README中的部署說(shuō)明進(jìn)行操作。
參考: The Holy Java博客上的JCG合作伙伴 Jakub Holy 在JBoss AS 7(及更早版本)中創(chuàng)建自定義登錄模塊 。
翻譯自: https://www.javacodegeeks.com/2012/06/jboss-as-7-custom-login-modules.html
總結(jié)
以上是生活随笔為你收集整理的JBoss AS 7:自定义登录模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 泰康汇选悦泰混合1号周末没有收益吗?
- 下一篇: 使用Struts 2的查询网格(无插件)