是否有可能在glassfish中以编程方式识别服务器身份验证模块的存在

时间:2015-10-04 11:58:11

标签: java glassfish jaspic jsr196

我在Glassfish中启用了服务器身份验证模块(JSR196)。该模块按预期工作,但我需要以编程方式确定servlet中是否存在认证模块。

我有什么方法可以使用java检查身份验证模块的存在吗?

2 个答案:

答案 0 :(得分:2)

Dexter meyers' approach应该可以正常工作,前提是:

  1. 您的应用使用单个ServerAuthModule(SAM),
  2. 没有AS-wide -i.e.已经注册AuthConfigFactory null appContext"HttpServlet"null layer参数AuthConfigProvider已成立,
  3. 您未提供自己的AuthConfigProviderServerAuthConfigServerAuthContext实施,
  4. 您唯一关心的是接收运行时确认SAM已被激活"为您的申请。
  5. 否则,来自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);