我已经在Glassfish中启用了服务器身份验证模块(JSR196)。该模块按预期工作,但是我需要以编程方式确定servlet中身份验证模块的存在。
是否有任何方法可以使用java检查身份验证模块的存在?
Dexter meyers的方法应该可以很好地工作,只要:
- 您的应用程序使用单个
ServerAuthModule
(SAM), - 无as -即已在
AuthConfigFactory
中注册null appContext
和"HttpServlet"
或null layer
参数-AuthConfigProvider
已建立, - 你没有提供你自己的
AuthConfigProvider
,ServerAuthConfig
和ServerAuthContext
实现,并且 - 您唯一关心的是收到SAM已"激活"的运行时确认;
否则,从AuthConfigFactory#getConfigProvider(String, String, RegistrationListener)
返回的非null
可能会产生误导,因为它不一定断言您的应用程序使用SAM,只是在兼容层中放置了AuthConfigProvider
,并且可以满足应用程序的身份验证需求,如果所需的其余组件(ServerAuthConfig
等)也注册了。
如果您还需要知道您的应用程序已经配置为使用哪些sam,恐怕没有标准的方法可以做到这一点,因为首先,ServerAuthContext
不会公开其封装的sam(而且通过ServerAuthConfig#getAuthContext(String, Subject, Map)
获取sam并不简单,因为JASPIC的Servlet配置文件使authContextID是任意的)。这基本上意味着您要么需要实现自己的ServerAuthContext
(以及2个进一步的间接)来获得该功能,要么附加一个标识符来表示SAM到HttpServletRequest
或HttpSession
,如果它足以让您知道哪些SAM被单个请求触发。请注意,如果您更喜欢使用javax.servlet.http.authType MessageInfo
回调属性来设置HttpServletRequest#getAuthType()
返回的值,则只有在身份验证成功时才会起作用,也就是说,当您的SAM的validateRequest(...)
建立非null
调用者Principal
和/或至少单个AS组Principal
并返回AuthStatus.SUCCESS
时;否则你会得到一个null
,尽管已经设置了回调属性。
这应该可以通过检查AuthConfigProvider
来实现,这可以通过:
首先定义helper方法:
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);