我在 Glassfish 中启用了服务器身份验证模块 (JSR196)。该模块按预期工作,但是我需要以编程方式确定 servlet 中是否存在身份验证模块。
有什么方法可以使用 java 检查身份验证模块的存在吗?
Dexter meyers 的方法应该可以正常工作,前提是:
ServerAuthModule
(SAM),AuthConfigFactory
withnull appContext
和"HttpServlet"
ornull 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 个进一步的间接)来获得该功能,要么附加一个标识符来HttpServletRequest
表示HttpSession
SAM要求。请注意,如果您更喜欢使用javax.servlet.http.authType MessageInfo
回调属性来设置返回的值HttpServletRequest#getAuthType()
相反,它只会在身份验证成功时起作用,也就是说,当您的 SAMvalidateRequest(...)
建立一个非null
调用者Principal
和/或至少一个 AS 组Principal
并返回时AuthStatus.SUCCESS
;否则你会得到一个null
尽管设置了回调属性。
这应该可以通过检查 来实现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);