我已經在Glassfish中啓用了服務器驗證模塊(JSR196)。該模塊按預期工作,但是我需要以編程方式確定servlet中的身份驗證模塊。是否有可能通過編程方式在玻璃魚中識別服務器驗證模塊的存在
有沒有什麼辦法可以檢查使用java認證模塊的存在?
我已經在Glassfish中啓用了服務器驗證模塊(JSR196)。該模塊按預期工作,但是我需要以編程方式確定servlet中的身份驗證模塊。是否有可能通過編程方式在玻璃魚中識別服務器驗證模塊的存在
有沒有什麼辦法可以檢查使用java認證模塊的存在?
這應該通過檢查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);
德克斯特邁爾斯approach應該工作得很好,但前提是:
ServerAuthModule
(SAM),AuthConfigFactory
與null appContext
和"HttpServlet"
或null layer
arguments- AuthConfigProvider
已經建立,AuthConfigProvider
,ServerAuthConfig
和ServerAuthContext
實現,並且否則,AuthConfigFactory#getConfigProvider(String, String, RegistrationListener)
非null
回報可能是誤導性的,在某種意義上說,它並不一定斷言你的應用程序使用SAM,只有一個AuthConfigProvider
已在兼容層和已到位如果其他所需組件(ServerAuthConfig
等)也已註冊,則可以滿足您的應用程序的身份驗證需求。
如果您還需要知道您的應用程序已配置爲使用哪個SAM,則沒有標準方式來執行此操作,因爲首先,ServerAuthContext
不會公開其封裝的SAM(以及它的非常因爲無論如何,通過ServerAuthConfig#getAuthContext(String, Subject, Map)
收購併不簡單,因爲JASPIC的Servlet Profile將authContextID任意)。這基本上意味着您需要實現自己的ServerAuthContext
(以及另外兩個間接指令)以獲得該功能,或者附加一個標識符來表示SAM到HttpServletRequest
或HttpSession
,如果您足夠了解哪些SAM已得到觸發個別請求。請注意,如果您希望使用javax.servlet.http.authType MessageInfo
回撥屬性來設置HttpServletRequest#getAuthType()
返回的值,則它將僅在身份驗證成功時起作用,也就是說,當您的SAM的validateRequest(...)
創建非null
調用者Principal
和/或至少一個AS組Principal
並返回AuthStatus.SUCCESS
;否則,儘管設置了回叫屬性,您仍將獲得null
。