代码之家  ›  专栏  ›  技术社区  ›  albogdano

如何覆盖J_Security_Check in Glassfish?

  •  6
  • albogdano  · 技术社区  · 15 年前

    我正在使用 FORM 基于glassfish 2.1版的身份验证来登录用户,它工作正常。我想换成 ProgrammaticLogin 我希望能够获得最初请求的URL(即,在重定向到登录页面之前),并在我的编程登录代码中使用它,以便用户在身份验证后重定向回请求的页面。

    我已经看到的源代码 j_security_check -在我的情况下,那是 FormAuthenticator (catalina codebase)并将初始请求保存在 SavedRequest 对象,但该会话是 StandardSession 而不是 HttpSession 所以没有直接的方法来访问它。

    或者我应该将身份验证机制从 形式 去别的地方?

    谢谢!

    2 回复  |  直到 15 年前
        1
  •  8
  •   albogdano    12 年前

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

    基本上,我试图实现的是在Glassfish中实现一个基于OpenID的身份验证机制。一种方法是使用 ProgrammaticLogin 但这有一些缺点——不容易重定向回请求的URL,编程认证意味着程序员可以做更多的工作。所以在阅读了周围的文章之后,我找到了更好的方法来实现我的目标- 服务器身份验证模块 或者SAMS。这是中描述的标准流程的一部分。 JSR-196 并提供了一种为Glassfish创建可插入身份验证模块的方法(即不同于标准 FORM , BASIC 等等)。此方法允许您在保留声明性安全模型的同时,将新的身份验证模块插入servlet容器。

    所以我需要做的就是写我自己的定制山姆。下面是一个快速的操作方法:

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

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

    2. 将您的sam打包到一个jar中,并将jar放在glassfish lib目录中。

    3. 配置用于应用程序的SAM。分两步完成:

      • 在domain.xml中将SAM定义为消息安全提供程序。
      • 绑定SAM以与应用程序一起使用。您可以通过在应用程序的sun-web-app.xml中定义httpservlet安全提供程序属性来实现这一点。将属性值设置为在步骤1中分配给您的SAM的名称。

    欲了解更多信息,请阅读 this great tutorial by Ron Monzillo.

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

        2
  •  1
  •   stevedbrown    15 年前

    如果表单身份验证对您不起作用,我建议切换到使用servletfilter进行身份验证。您只需去掉基于表单的身份验证,并为想要保护的页面添加一个到过滤器的映射。