2009-02-09 40 views
4

我想在我的SOAP應用程序中使用他們的角色訪問完整模型的用戶。例如,我可能想知道名爲「Fred」的用戶的角色。如何在代碼中的任意點訪問JAAS角色?

如何進入某種全局JAAS註冊表並執行(僞代碼)globalRegistry.getUser(「Fred」)。getPrincipals()? (請注意,在JAAS,角色由主要表示。)

我知道如何讓主題LoginContext的主要,但有兩個問題。

  1. 只有在登錄時的那一刻,我不想編寫上述註冊表和存儲主題主要對象自己,因爲他們已經通過應用程序服務器存儲。
  2. 優選地,即使Fred不是當前用戶,我也希望能夠訪問這些信息。

我正在使用Jetty,但我認爲這些行爲對JAAS是標準的。

回答

3

我們使用一個ThreadLocal變量來引用當前用戶爲已在系統入口點(在servlet或EJB被驗證我們案件)。這允許「全局」訪問當前用戶。這不是直接綁定到JAAS或任何其他安全協議,但可以從它們初始化。

編輯:從ThreadLocal的返回是當前用戶的主題。

訪問其他用戶通常會通過某種類型的管理模塊完成。

1

對我來說,這看起來像appsever的用戶,組等與J2EE應用程序角色。

  • 獲取certaion用戶的權限是管理任務,通常必須使用特定於應用程序服務器的API來完成。
  • JAAS編程模型工作在更高層次的抽象。它只是提供了一個用戶是否在J2EE角色的相關信息(在應用程序中定義)
1

我相信JAAS的設計目的並不是真正地允許你試圖做什麼。我知道在我構建的應用程序中,我需要這種功能,我必須對JAAS進行旁路並直接編程到任何實際身份存儲庫,無論是LDAP,ActiveDirectory還是其他任何設備。

5

我看到的圖案是:

AccessControlContext acc = AccessController.getContext(); 
Subject subject = Subject.getSubject(acc); 
Set<Principal> principals = subject.getPrincipals(); 

本質上,這發現當前與當前線程相關聯的主題,並要求其主體。

使用這個的一個例子是Apache JackrabbitRepositoryImpl。它在extendAuthentication方法中,其作用是確定當前線程在創建新會話時擁有的Jackrabbit權限(我認爲)。

但是,我應該注意到,這可能不一定實際上工作,至少在J2EE上下文中。我在JBoss AS7下使用這個代碼,並沒有找到一個主題。雖然這可能只是一個錯誤。

0

在任何點使用EJB

@Resource(mappedName = "java:comp/EJBContext") 
protected SessionContext sessionContext; 

,並嘗試與context.lookup("java:comp/EJBContext")。


這段代碼適用於JBoss服務器系列,其他的代碼可以在它們的JNDI中找到它。

相關問題