我目前正在使用glassfish v2.1中基于FORM
的身份验证来记录用户,并且工作正常。我想切换到ProgrammaticLogin
,我希望能够获取最初请求的URL(即在重定向到登录页面之前)并在我的程序化登录代码中使用它,以便用户在重定向后返回到请求的页面认证。
我已经看到了j_security_check
的源代码 - 在我的情况下是FormAuthenticator
(catalina codebase),它将初始请求保存在会话中的SavedRequest
对象中但该会话是StandardSession
而非HttpSession
,因此无法直接访问它。
或者我应该将身份验证机制从FORM
更改为其他内容吗?
谢谢!
答案 0 :(得分:8)
好的,我找到了答案。所以这就是:
基本上我想要实现的是在glassfish中实现基于openid的身份验证机制。这样做的一种方法是使用ProgrammaticLogin
,但这有一些缺点 - 没有简单的方法可以重定向回请求的URL和程序化身份验证意味着程序员需要做更多的工作。所以在阅读后我找到了更好的方法来实现我的目标 - 服务器身份验证模块或SAM。这是JSR-196中描述的标准流程的一部分,并提供了为glassfish创建可插入auth模块的方法(即,与标准FORM
,BASIC
等不同)。此方法允许您在保留声明性安全模型的同时在servlet容器中插入新的auth模块。
所以我需要做的就是编写自己的自定义SAM。这是一个快速的方法:
实现ServerAuthModule接口,该接口主要归结为以下方法:
AuthStatus validateRequest(MessageInfo messageInfo, security.auth.Subject
clientSubject, security.auth.Subject serviceSubject) throws AuthException
将您的SAM打包在一个罐子里,然后将您的jar放在glassfish lib目录中。
配置SAM以与您的应用程序一起使用。这分两步完成:
有关详细信息,请参阅this great tutorial by Ron Monzillo.
更新:这个问题有一个更简单,更优雅的解决方案,名为AuthenticRoast。这是一个由Aike Sommer编写的Java库,它允许您编写自己的可插入身份验证器。
答案 1 :(得分:1)
如果表单身份验证不适合您,我建议您切换到使用ServletFilter进行身份验证。您只需删除基于FORM的身份验证,并为要保护的页面添加映射到过滤器。