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



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

是否有任何方法可以使用java检查身份验证模块的存在?

Dexter meyers的方法应该可以很好地工作,只要:

  1. 您的应用程序使用单个ServerAuthModule (SAM),
  2. 无as -即已在AuthConfigFactory中注册null appContext"HttpServlet"null layer参数- AuthConfigProvider已建立,
  3. 你没有提供你自己的AuthConfigProvider, ServerAuthConfigServerAuthContext实现,并且
  4. 您唯一关心的是收到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到HttpServletRequestHttpSession,如果它足以让您知道哪些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);

相关内容

  • 没有找到相关文章

最新更新