日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

创建委托登录模块(用于JBoss EAP 6.1)

發(fā)布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 创建委托登录模块(用于JBoss EAP 6.1) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

[如果只想查看代碼,請向下滾動]

動機

在RHQ中,我們需要一個安全域,該域可用于通過容器管理的安全性來保護REST-api及其Web應(yīng)用程序。 過去,我只是使用經(jīng)典的DatabaseServerLoginModule對DatabaseServerLoginModule進行身份驗證。 現(xiàn)在RHQ還允許將用戶包含在LDAP目錄中,而上述模塊未涵蓋這些目錄。 我有兩個選擇開始:

  • 將LDAP登錄模塊復(fù)制到REST的安全域中
  • 將安全域用于已經(jīng)用于UI和CLI的REST-api

后一種選擇當(dāng)然有利于防止代碼重復(fù),所以我走了那條路。 并失敗了。

我失敗了,因為RHQ在啟動時刪除并重新創(chuàng)建了安全域,并且服務(wù)器檢測到該錯誤并抱怨從rhq-rest.war引用的安全域突然消失了。

因此,下一個嘗試:不要在啟動時重新創(chuàng)建域,而僅添加/刪除ldap-login模塊(我說的是模塊,因為實際上我們需要兩個)。

這也沒有按預(yù)期工作:

  • 基礎(chǔ)AS有時會進入需要重新加載的模式,并且未應(yīng)用更改
  • 除去ldap模塊后,它們中的主體仍被緩存
  • 刷新緩存不起作用,服務(wù)器進入需要重新加載的模式

因此,我現(xiàn)在要做的是為rest-security-domain實現(xiàn)一個登錄模塊,該模塊僅委派給另一個進行身份驗證,然后在成功時添加角色。

這樣,rhq-rest.war便具有對該rest-security-domain的固定引用,而另一個安全域則可以像以前一樣處理。

實作

讓我們從standalone.xml文件中的代碼段開始,該代碼段描述安全域并參數(shù)化模塊

<security-domain name="RHQRESTSecurityDomain" cache-type="default"><authentication><login-module code="org.rhq.enterprise.server.core.jaas.DelegatingLoginModule" flag="sufficient"><module-option name="delegateTo" value="RHQUserSecurityDomain"/><module-option name="roles" value="rest-user"/></login-module></authentication></security-domain>

因此,此定義設(shè)置了一個安全域RHQRESTSecurityDomain ,該域使用我將在稍后描述的DelegatingLoginModule。 傳遞了兩個參數(shù):

  • proxyTo:要驗證用戶身份的另一個域的名稱
  • 角色:以逗號分隔的要添加到主體的模塊列表(以及web.xml的security-constraint部分中需要的模塊)

對于代碼,我沒有顯示完整清單。 你可以在git中找到它 。

為了使我們的生活更輕松,我們并沒有自己實現(xiàn)所有功能,而是擴展了現(xiàn)有的UsernamePasswordLoginModule并僅覆蓋某些方法。

public class DelegatingLoginModule extends UsernamePasswordLoginModule {

首先,我們使用傳遞的選項初始化模塊,并使用我們委派給的域創(chuàng)建一個新的LoginContext:

@Overridepublic void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState,Map<String, ?> options) {super.initialize(subject, callbackHandler, sharedState, options);/* This is the login context (=security domain) we want to delegate to */String delegateTo = (String) options.get("delegateTo");/* Now create the context for later use */try {loginContext = new LoginContext(delegateTo, new DelegateCallbackHandler());} catch (LoginException e) {log.warn("Initialize failed : " + e.getMessage());}

有趣的部分是login()方法,在該方法中我們獲取用戶名/密碼并將其存儲以供以后使用,然后我們嘗試登錄到委托域,如果成功,則告訴super我們成功了,以便它可以發(fā)揮作用。 。

@Overridepublic boolean login() throws LoginException {try {// Get the username / password the user entred and save if for later useusernamePassword = super.getUsernameAndPassword();// Try to log in via the delegateloginContext.login();// login was success, so we can continueidentity = createIdentity(usernamePassword[0]);useFirstPass=true;// This next flag is important. Without it the principal will not be// propagatedloginOk = true;

這里需要loginOk標(biāo)志,以便超類將調(diào)用LoginModule.commit()并選擇主體和角色。

不將其設(shè)置為true將導(dǎo)致成功login()但沒有附加主體。

if (debugEnabled) {log.debug("Login ok for " + usernamePassword[0]);}return true;} catch (Exception e) {if (debugEnabled) {LOG.debug("Login failed for : " + usernamePassword[0] + ": " + e.getMessage());}loginOk = false;return false;}}

成功后,super將調(diào)用以下兩種方法來獲取主體及其角色:

@Overrideprotected Principal getIdentity() {return identity;}@Overrideprotected Group[] getRoleSets() throws LoginException {SimpleGroup roles = new SimpleGroup("Roles");for (String role : rolesList ) {roles.addMember( new SimplePrincipal(role));}Group[] roleSets = { roles };return roleSets;}

現(xiàn)在,最后一部分是回調(diào)處理程序,我們委托的其他域?qū)⑹褂迷摶卣{(diào)處理程序從我們那里獲取憑據(jù)。 它是經(jīng)典的JAAS登錄回調(diào)處理程序。 首先讓我感到困惑的一件事是,該處理程序在登錄期間被調(diào)用了幾次,我認(rèn)為這是錯誤的。 但是實際上,它被調(diào)用的次數(shù)與RHQUserSecurityDomain中配置的登錄模塊的數(shù)量相對應(yīng)。

private class DelegateCallbackHandler implements CallbackHandler {@Overridepublic void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {for (Callback cb : callbacks) {if (cb instanceof NameCallback) {NameCallback nc = (NameCallback) cb;nc.setName(usernamePassword[0]);}else if (cb instanceof PasswordCallback) {PasswordCallback pc = (PasswordCallback) cb;pc.setPassword(usernamePassword[1].toCharArray());}else {throw new UnsupportedCallbackException(cb,"Callback " + cb + " not supported");}}}}

同樣,完整的代碼在RHQ git倉庫中可用。

調(diào)試(在EAP 6.1 alpha或更高版本中)

如果您編寫了這樣的登錄模塊,但該模塊不起作用,則需要對其進行調(diào)試。 從通常的方法開始,以了解我的login()方法是否按預(yù)期工作,但登錄失敗。 我添加了打印語句等,以發(fā)現(xiàn)從未調(diào)用過getRoleSets()方法。 但是,一切看起來還不錯。 我進行了一些谷歌搜索,發(fā)現(xiàn)了這個不錯的Wiki頁面 。 可以告訴Web應(yīng)用進行審核日志記錄

<jboss-web><context-root>rest</context-root><security-domain>RHQRESTSecurityDomain</security-domain><disable-audit>false</disable-audit>

僅此標(biāo)志是不夠的,因為您還需要設(shè)置適當(dāng)?shù)挠涗浧?#xff0c;這在Wiki頁上進行了說明。 啟用此功能后,我看到了類似

16:33:33,918 TRACE [org.jboss.security.audit] (http-/0.0.0.0:7080-1) [Failure]Source=org.jboss.as.web.security.JBossWebRealm; principal=null;request=[/rest:….

因此很明顯,登錄模塊未設(shè)置主體。 然后查看超類中的代碼,將我?guī)У缴厦嫣岬降膌oginOk標(biāo)志。

現(xiàn)在,一切都正確設(shè)置了,自動日志看起來像

22:48:16,889 TRACE [org.jboss.security.audit] (http-/0.0.0.0:7080-1) [Success]Source=org.jboss.as.web.security.JBossWebRealm;Step=hasRole; principal=GenericPrincipal[rhqadmin(rest-user,)]; request=[/rest:cookies=null:headers=authorization=user-agent=curl/7.29.0,host=localhost:7080,accept=*/*,][parameters=][attributes=];

因此,在這里您看到主體rhqadmin已登錄并獲得了剩余用戶分配的角色,這是web.xml中security-constraint元素中的一個匹配對象。

進一步查看

我已將以上內(nèi)容作為環(huán)聊直播進行了介紹 。 不幸的是,當(dāng)我在解釋時打字時,G +會不時使我靜音。

視頻播放完后,我還有其他問題,最終讓我重新思考啟動階段,以防用戶安裝了啟用了LDAP的RHQ先前版本。 在這種情況下,安裝程序仍將安裝初始的僅基于DB的RHQUserSecurityDomain,然后在啟動bean中,檢查a)系統(tǒng)設(shè)置中是否啟用了LDAP,以及b)登錄模塊是否實際存在。 如果a)匹配并且不存在,我們將安裝它們。

此Bugzilla條目還包含有關(guān)整個故事的更多信息。

參考:從JCG合作伙伴 Heiko Rupp在“ 一些事情要記住”博客中創(chuàng)建一個委派的登錄模塊(用于JBoss EAP 6.1) 。

翻譯自: https://www.javacodegeeks.com/2013/05/creating-a-delegating-login-module-for-jboss-eap-6-1.html

總結(jié)

以上是生活随笔為你收集整理的创建委托登录模块(用于JBoss EAP 6.1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。