6

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

我已经看到了源代码j_security_check——在我的例子中是FormAuthenticator(catalina 代码库),它将初始请求保存在会话中的一个SavedRequest对象中,但该会话是一个StandardSession而不是HttpSession所以没有直接的方法来访问它。

还是我应该将身份验证机制从FORM其他东西更改?

谢谢!

4

2 回答 2

8

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

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

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

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

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

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

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

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

有关更多信息,请阅读Ron Monzillo 的这篇精彩教程。

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

于 2009-06-17T14:53:48.883 回答
1

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

于 2009-06-15T05:18:45.117 回答