好的,我找到了答案。所以这里是:
基本上我想要实现的是在 glassfish 中实现基于 openid 的身份验证机制。这样做的一种方法是使用ProgrammaticLogin
,但这有一些缺点 - 重定向回请求的 URL 和编程身份验证的简单方法意味着程序员需要做更多的工作。因此,在阅读之后,我找到了实现目标的更好方法 -服务器身份验证模块或 SAM。这是JSR-196中描述的标准过程的一部分,并提供了一种为 glassfish 创建可插入身份验证模块的方法(即不同于标准FORM
等BASIC
)。此方法允许您在 servlet 容器中插入新的身份验证模块,同时保持声明式安全模型。
所以我需要做的就是编写我自己的自定义 SAM。这是一个快速的方法:
实现 ServerAuthModule 接口,主要归结为以下方法:
AuthStatus validateRequest(MessageInfo messageInfo, security.auth.Subject
clientSubject, security.auth.Subject serviceSubject) throws AuthException
将您的 SAM 打包到一个 jar 中,并将您的 jar 放在 glassfish lib 目录中。
配置 SAM 以用于您的应用程序。这分两步完成:
- 将您的 SAM 定义为 domain.xml 中的消息安全提供者。
- 绑定 SAM 以用于您的应用程序。您可以通过在应用程序的 sun-web-app.xml 中定义 httpservlet-security-provider 属性来做到这一点。将属性的值设置为您在步骤 1 中分配给 SAM 的名称。
有关更多信息,请阅读Ron Monzillo 的这篇精彩教程。
更新:这个问题有一个更简单、更优雅的解决方案,称为AuthenticRoast。这是一个由 Aike Sommer 编写的 Java 库,它允许您编写自己的可插入身份验证器。