如何覆盖glassfish中的j_security_check?

时间:2009-06-14 14:29:19

标签: java authentication glassfish jsr196

我目前正在使用glassfish v2.1中基于FORM的身份验证来记录用户,并且工作正常。我想切换到ProgrammaticLogin,我希望能够获取最初请求的URL(即在重定向到登录页面之前)并在我的程序化登录代码中使用它,以便用户在重定向后返回到请求的页面认证。

我已经看到了j_security_check的源代码 - 在我的情况下是FormAuthenticator(catalina codebase),它将初始请求保存在会话中的SavedRequest对象中但该会话是StandardSession而非HttpSession,因此无法直接访问它。

或者我应该将身份验证机制从FORM更改为其他内容吗?

谢谢!

2 个答案:

答案 0 :(得分:8)

好的,我找到了答案。所以这就是:

基本上我想要实现的是在glassfish中实现基于openid的身份验证机制。这样做的一种方法是使用ProgrammaticLogin,但这有一些缺点 - 没有简单的方法可以重定向回请求的URL和程序化身份验证意味着程序员需要做更多的工作。所以在阅读后我找到了更好的方法来实现我的目标 - 服务器身份验证模块或SAM。这是JSR-196中描述的标准流程的一部分,并提供了为glassfish创建可插入auth模块的方法(即,与标准FORMBASIC等不同)。此方法允许您在保留声明性安全模型的同时在servlet容器中插入新的auth模块。

所以我需要做的就是编写自己的自定义SAM。这是一个快速的方法:

  1. 实现ServerAuthModule接口,该接口主要归结为以下方法:

    AuthStatus validateRequest(MessageInfo messageInfo, security.auth.Subject clientSubject, security.auth.Subject serviceSubject) throws AuthException

  2. 将您的SAM打包在一个罐子里,然后将您的jar放在glassfish lib目录中。

  3. 配置SAM以与您的应用程序一起使用。这分两步完成:

    • 将您的SAM定义为domain.xml中的消息安全提供程序。
    • 绑定SAM以便与您的应用程序一起使用。您可以通过在应用程序的sun-web-app.xml中定义httpservlet-security-provider属性来完成此操作。将属性的值设置为您在步骤1中分配给SAM的名称。
  4. 有关详细信息,请参阅this great tutorial by Ron Monzillo.

    更新:这个问题有一个更简单,更优雅的解决方案,名为AuthenticRoast。这是一个由Aike Sommer编写的Java库,它允许您编写自己的可插入身份验证器。

答案 1 :(得分:1)

如果表单身份验证不适合您,我建议您切换到使用ServletFilter进行身份验证。您只需删除基于FORM的身份验证,并为要保护的页面添加映射到过滤器。