2

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

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

4

2 回答 2

2

Dexter meyers 的方法应该可以正常工作,前提是:

  1. 您的应用程序使用单个ServerAuthModule(SAM),
  2. 没有建立 AS 范围 - 即已使用AuthConfigFactorywithnull appContext"HttpServlet"ornull layer参数注册AuthConfigProvider-
  3. 您不提供自己的AuthConfigProvider,ServerAuthConfigServerAuthContext实现,并且
  4. 您唯一关心的是收到运行时确认 SAM 已为您的应用程序“激活”。

否则,不null返回AuthConfigFactory#getConfigProvider(String, String, RegistrationListener)可能会产生误导,因为它不一定断言您的应用程序使用了 SAM,只是断言AuthConfigProvider已在兼容层放置,并且可以满足应用程序的身份验证需求,如果其余的所需的组件(ServerAuthConfig等)也已注册。

如果您还需要知道您的应用程序已配置为使用哪些 SAM,那么没有标准方法可以这样做,因为首先,ServerAuthContext它不会暴露其封装的 SAM(而且它的获取ServerAuthConfig#getAuthContext(String, Subject, Map)方式并不简单无论如何,因为 JASPIC 的 Servlet 配置文件让authContextID任意)。这基本上意味着您要么需要实现自己的ServerAuthContext(以及 2 个进一步的间接)来获得该功能,要么附加一个标识符来HttpServletRequest表示HttpSessionSAM要求。请注意,如果您更喜欢使用javax.servlet.http.authType MessageInfo回调属性来设置返回的值HttpServletRequest#getAuthType()相反,它只会在身份验证成功时起作用,也就是说,当您的 SAMvalidateRequest(...)建立一个非null调用者Principal和/或至少一个 AS 组Principal并返回时AuthStatus.SUCCESS;否则你会得到一个null尽管设置了回调属性。

于 2015-10-05T20:32:27.253 回答
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);
于 2015-10-05T14:42:28.693 回答