2015-10-04 77 views

回答

1

這應該通過檢查AuthConfigProvider,可以通過做是可行的:

首先定義helper方法:

String getAppContextID(ServletContext context) 
return context.getVirtualServerName() + " " + context.getContextPath(); 
} 

然後在@WebListener調用此代碼時ServletContext中可以使用,如:

AuthConfigFactory factory = AuthConfigFactory.getFactory(); 

String appContextID = getAppContextID(context); 

AuthConfigProvider provider = factory.getConfigProvider("HttpServlet", appContextID, null); 
2

德克斯特邁爾斯approach應該工作得很好,但前提是:

  1. 您的應用程序使用單個ServerAuthModule(SAM),
  2. 沒有AS-寬-i.e.已登記的AuthConfigFactorynull appContext"HttpServlet"null layer arguments- AuthConfigProvider已經建立,
  3. 你不提供自己的AuthConfigProviderServerAuthConfigServerAuthContext實現,並且
  4. 您唯一關心的是收到運行時確認該SAM已經「激活」您的應用程序。

否則,AuthConfigFactory#getConfigProvider(String, String, RegistrationListener)null回報可能是誤導性的,在某種意義上說,它並不一定斷言你的應用程序使用SAM,只有一個AuthConfigProvider已在兼容層和已到位如果其他所需組件(ServerAuthConfig等)也已註冊,則可以滿足您的應用程序的身份驗證需求。

如果您還需要知道您的應用程序已配置爲使用哪個SAM,則沒有標準方式來執行此操作,因爲首先,ServerAuthContext不會公開其封裝的SAM(以及它的非常因爲無論如何,通過ServerAuthConfig#getAuthContext(String, Subject, Map)收購併不簡單,因爲JASPIC的Servlet Profile將authContextID任意)。這基本上意味着您需要實現自己的ServerAuthContext(以及另外兩個間接指令)以獲得該功能,或者附加一個標識符來表示SAM到HttpServletRequestHttpSession,如果您足夠了解哪些SAM已得到觸發個別請求。請注意,如果您希望使用javax.servlet.http.authType MessageInfo回撥屬性來設置HttpServletRequest#getAuthType()返回的值,則它將僅在身份驗證成功時起作用,也就是說,當您的SAM的validateRequest(...)創建非null調用者Principal和/或至少一個AS組Principal並返回AuthStatus.SUCCESS;否則,儘管設置了回叫屬性,您仍將獲得null