Java 如何在glassfish中覆盖j_安全检查?

Java 如何在glassfish中覆盖j_安全检查?,java,authentication,glassfish,jsr196,Java,Authentication,Glassfish,Jsr196,我目前正在使用glassfish v2.1中基于表单的身份验证来登录用户,效果很好。我想切换到programmaticologin,我想能够获得最初请求的URL(即,在重定向到登录页面之前),并在我的编程登录代码中使用它,以便用户在身份验证后重定向回请求的页面 我已经看到了j_security\u check——在我的例子中,这是FormAuthenticator(catalina codebase)它将初始请求保存在会话中的SavedRequest对象中,但该会话是StandardSessio

我目前正在使用glassfish v2.1中基于
表单的身份验证来登录用户,效果很好。我想切换到
programmaticologin
,我想能够获得最初请求的URL(即,在重定向到登录页面之前),并在我的编程登录代码中使用它,以便用户在身份验证后重定向回请求的页面

我已经看到了
j_security\u check
——在我的例子中,这是
FormAuthenticator
(catalina codebase)它将初始请求保存在会话中的
SavedRequest
对象中,但该会话是
StandardSession
而不是
HttpSession
,因此无法直接访问它

或者我应该将身份验证机制从
表单
更改为其他形式吗


谢谢

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

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

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

因此,我所需要做的就是编写自己的自定义SAM。下面是一个快速操作:

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

    AuthStatus validateRequest(MessageInfo,security.auth.Subject
    clientSubject,security.auth.Subject servicepubject)抛出AuthException

  • 将SAM打包到一个jar中,并将jar放在glassfish lib目录中

  • 配置SAM以与应用程序一起使用。此操作分为两个步骤:

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


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

    谢谢!我已经研究了SecurityFilter,但后来我发现了一种更好的方法,通过坚持glassfish的简洁声明式安全模型来实现我的目标。