我在Glassfish中启用了服务器身份验证模块(JSR196)。该模块按预期工作,但我需要以编程方式确定servlet中是否存在认证模块。
我有什么方法可以使用java检查身份验证模块的存在吗?
答案 0 :(得分:2)
Dexter meyers' approach应该可以正常工作,前提是:
ServerAuthModule
(SAM),AuthConfigFactory
null appContext
,"HttpServlet"
或null layer
参数AuthConfigProvider
已成立,AuthConfigProvider
,ServerAuthConfig
和ServerAuthContext
实施,否则,来自null
的非AuthConfigFactory#getConfigProvider(String, String, RegistrationListener)
返回可能会产生误导,因为它不一定断言您的应用程序使用SAM,只有AuthConfigProvider
已经如果其他所需组件(ServerAuthConfig
等)也已注册,那么可以 满足您应用程序的身份验证需求。
如果您还需要知道您的应用程序已准确配置使用哪些SAM,那么就没有标准的方法,因为,首先,ServerAuthContext
不会暴露其封装的SAM(无论如何,它通过ServerAuthConfig#getAuthContext(String, Subject, Map)
的获取并不简单,因为JASPIC的Servlet配置文件使 authContextID 随意离开。这基本上意味着您需要实现自己的ServerAuthContext
(以及另外2个间接)以获得该功能,或者附加标识符以将SAM表示为HttpServletRequest
或{{1} },如果它足以让您知道哪些SAM被触发了各个请求。请注意,如果您希望使用HttpSession
回调属性来设置javax.servlet.http.authType MessageInfo
返回的值,则只有在身份验证成功时才会有效,也就是说,当您的SAM {{1}时建立非HttpServletRequest#getAuthType()
来电者validateRequest(...)
和/或至少一个AS群null
并返回Principal
;否则,尽管设置了回调属性,你仍然会获得Principal
。
答案 1 :(得分:1)
这应该可以通过检查AuthConfigProvider
来实现,可以通过以下方式完成:
首先定义辅助方法:
String getAppContextID(ServletContext context)
return context.getVirtualServerName() + " " + context.getContextPath();
}
然后在ServletContext可用时调用此代码,就像在@WebListener
:
AuthConfigFactory factory = AuthConfigFactory.getFactory();
String appContextID = getAppContextID(context);
AuthConfigProvider provider = factory.getConfigProvider("HttpServlet", appContextID, null);