glassfish jdbcrealm身份验证中的受限页面未触发登录

Posted

技术标签:

【中文标题】glassfish jdbcrealm身份验证中的受限页面未触发登录【英文标题】:Login not triggered for restricted page in glassfish jdbcrealm authentication 【发布时间】:2011-01-24 12:06:18 【问题描述】:

我对 EJB 安全性和 GlassFish 身份验证、授权机制非常陌生。我有一个jdbc 领域并配置了sun-web.xmlweb.xml 来映射角色并限制对页面的访问。

但是,我的问题是,当我限制对所有页面的访问时,它会起作用并在加载欢迎页面之前触发登录弹出窗口(使用 BASIC 身份验证)。

<web-resource-collection>
  <web-resource-name>All Pages</web-resource-name>
  <description/>
  <url-pattern>/*</url-pattern>
  <http-method>GET</http-method>
  <http-method>POST</http-method>
  <http-method>HEAD</http-method>
  <http-method>PUT</http-method>
  <http-method>OPTIONS</http-method>
  <http-method>TRACE</http-method>
  <http-method>DELETE</http-method>
</web-resource-collection>

但是当我限制对文件夹security 中页面的访问时,GlassFish 不会提示登录并将用户重定向到受限页面。

<web-resource-collection>
  <web-resource-name>All Pages</web-resource-name>
  <description/>
  <url-pattern>/security/*</url-pattern>
  <http-method>GET</http-method>
  <http-method>POST</http-method>
  <http-method>HEAD</http-method>
  <http-method>PUT</http-method>
  <http-method>OPTIONS</http-method>
  <http-method>TRACE</http-method>
  <http-method>DELETE</http-method>
</web-resource-collection>`

请帮我解决这个问题..提前非常感谢。

我打开安全管理器后也发现了这些条目



Processing login with credentials of type: class com.sun.enterprise.security.auth.login.PasswordCredential Logging in user [admin] into realm: admin-realm using JAAS module: fileRealm Login module initialized: class com.sun.enterprise.security.auth.login.FileLoginModule File login succeeded for: admin JAAS login complete. JAAS authentication committed. Password login succeeded for : admin permission check done to set SecurityContext Set security context as user: admin

[Web-Security] hasResource perm: (javax.security.jacc.WebResourcePermission /faces/security/UserRedirect.jsp GET)

似乎 admin-realm 中的 admin 主体已自动进行身份验证并用于我的应用程序,而不是使用我的 jdbcrealm。有关如何解决此问题的任何想法?

更新

对不起,我刚刚将身份验证更改为要检查的表单。我又把它改回了 BASIC。 是的,我将 jdbcrealm 名称作为默认领域。

你的权利..正是这样

GlassFish 不会重定向到登录表单页面,并且对受限资源的访问不受限制

我认为这是因为 admin-realm admin 自动经过身份验证,当我尝试访问受限页面时,它会检查经过身份验证的用户,并且由于它是 admin 并且它具有对页面的授权,因此该页面是可访问的并且不会提示登录。

当我运行应用程序而不是尝试登录到 glass fish 的管理控制台时,这些仍然会出现

Processing login with credentials of type: class com.sun.enterprise.security.auth.login.PasswordCredential
Logging in user [admin] into realm: admin-realm using JAAS module: fileRealm
Login module initialized: class com.sun.enterprise.security.auth.login.FileLoginModule
File login succeeded for: admin
JAAS login complete.
JAAS authentication committed.
Password login succeeded for : admin
permission check done to set SecurityContext
Set security context as user: admin

还有这些

(unresolved javax.security.jacc.WebUserDataPermission /security/* null)
 (unresolved javax.security.jacc.WebUserDataPermission /:/security/* null)
 (unresolved com.sun.corba.ee.impl.presentation.rmi.DynamicAccessPermission access null)
 (unresolved javax.security.jacc.WebResourcePermission /:/security/* null)
 (unresolved javax.security.jacc.WebResourcePermission /security/* !DELETE,GET,HEAD,OPTIONS,POST,PUT,TRACE)
 (unresolved com.sun.enterprise.security.CORBAObjectPermission * *)

更新 2

我尝试使用&lt;url-pattern&gt;/*&lt;/url-pattern&gt; 而不是&lt;url-pattern&gt;/security/*&lt;/url-pattern&gt;

有趣的是,这就是我在跟踪中得到的。

Processing login with credentials of type: class com.sun.enterprise.security.auth.login.PasswordCredential
Logging in user [employee] into realm: emsSecurity using JAAS module: jdbcRealm
Login module initialized: class com.sun.enterprise.security.auth.login.JDBCLoginModule
JDBC login succeeded for: employee groups:[Ljava.lang.String;@16bfca4
JAAS login complete.
JAAS authentication committed.
Password login succeeded for : employee
permission check done to set SecurityContext
Set security context as user: employee

然后它会进入拒绝访问页面。

'HTTP 状态 403 - 对所请求资源的访问被拒绝'

我不明白 glassfish 如何在没有用户提交登录凭据的情况下对用户员工进行身份验证。它甚至说“密码登录成功:员工”。请帮我解决这个问题。


首先非常感谢您的努力。我仍然坚持这个问题。我在这里发布 xml 文件。

sun-web.xml

<security-role-mapping>
<role-name>Employee</role-name>
<group-name>Employee</group-name>

web.xml

    <security-constraint>
    <display-name>Login Constraint</display-name>
    <web-resource-collection>
        <web-resource-name>User Redirect page</web-resource-name>
        <description/>
        <url-pattern>/security/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
        <http-method>HEAD</http-method>
        <http-method>PUT</http-method>
        <http-method>OPTIONS</http-method>
        <http-method>TRACE</http-method>
        <http-method>DELETE</http-method>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>Employee</role-name>
        </auth-constraint>
    </security-constraint>
<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>deliverySecurity</realm-name>
    <form-login-config>
        <form-login-page>/Login.jsp</form-login-page>
        <form-error-page>/index.jsp</form-error-page>
        </form-login-config>
    </login-config>
<security-role>
    <description/>
    <role-name>Employee</role-name>
</security-role>

也没有堆栈跟踪。没有例外.. 用户只是被重定向到安全页面,就好像没有身份验证要求一样。这是一个使用 Netbeans 6.5.1 和 Glassfish v2 的 jsf 可视化 Web 开发项目。 非常感谢。

【问题讨论】:

您运行的是哪个版本的 Glassfish?在管理控制台中点击“版本”。 【参考方案1】:

尝试在 url 模式中添加“/faces”。例如: /faces/security/*

【讨论】:

【参考方案2】:

能否请您发布您的web.xml 的所有相关部分,因为我用这个web.xml 进行了测试:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <display-name>Archetype Created Web Application</display-name>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Protected Area</web-resource-name>
      <url-pattern>/jsp/security/protected/*</url-pattern>
      <http-method>PUT</http-method>
      <http-method>DELETE</http-method>
      <http-method>GET</http-method>
      <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>role1</role-name>
    </auth-constraint>
  </security-constraint>

  <!-- Security roles referenced by this web application -->
  <security-role>
    <role-name>role1</role-name>
  </security-role>
  <login-config>
    <auth-method>BASIC</auth-method>
  </login-config>
</web-app>

请求受保护的资源(此处为http://localhost:8080/mywebapp/jsp/security/protected/)确实会提示我输入用户名和密码。换句话说,我无法重现该问题(我使用的是 GlassFish v3)。

更新:我完成了使用jdbc 领域保护我的示例 web 应用程序并确认一切正常。所以,正如我所说,请提供您的web.xmlsun-web.xml。另外,请将日志记录级别设置为 FINEST 以确保安全:

并加入相关的痕迹。

更新:我认为您显示的跟踪是 admin 用户在管理控制台中的登录。如果没有,您是否将 jdbc 领域设置为默认领域(database 在以下捕获中是我的 jdbc 领域)?

顺便说一句,我以为您使用的是 BASIC 身份验证。但是根据您提供的描述符,您使用的是 FORM。那么,您能否澄清一下您实际使用的是什么以及问题到底是什么(例如:“GlassFish 不会重定向到登录表单页面并且对受限资源的访问不受限制”)?

【讨论】:

【参考方案3】:

两种可能的解决方案:

1 - 您是否尝试过使用其他浏览器?因为登录信息可以被缓存,所以如果你输入一次,它不会再询问你,直到你执行注销操作。

2 - 实现 注销方法。我使用 JSF 2.0,我的注销方法是这样的:

public String logout() 
        FacesContext context = FacesContext.getCurrentInstance();

        // remove data from beans:
        for (String bean : context.getExternalContext().getSessionMap().keySet()) 
            context.getExternalContext().getSessionMap().remove(bean);
        

        // destroy session:
        HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
        session.invalidate();

        // using faces-redirect to initiate a new request:
        return "/security/index.xhtml?faces-redirect=true";

    

您可以尝试将此方法添加到您的 bean,然后从带有 'action="#yourBean.logout"' 的按钮调用它。

然后,当您刷新浏览器时,它会提示您输入登录凭据。

【讨论】:

您能给我们一些反馈吗?谢谢!【参考方案4】:

如果您使用的是 NetBeans 6.8,您可能需要验证是否未选中“Preserve Sessions Across Redeployment”属性。

The Server properties dialog from NetBeans 6.8 for GlassFish v3 http://blogs.sun.com/vkraemer/resource/preserve-session.png

为什么?听起来您已经先测试了“全部锁定”的情况(并且能够成功登录)。当您将 web.xml 更改为使用 /security/* 时,您的旧会话仍然有效并已登录,所以...您直接进入页面,而不是被要求进行身份验证。

Eclipse 的服务器适配器也有这个特性。

【讨论】:

您好,我使用的是 Netbeans 6.5.1,因为 Netbeans 6.8 不支持 jsf 可视化开发。还有 Glassfish v2。 即使我重新启动浏览器和Netbeans并直接将限制设置为/security/*文件夹,问题仍然存在。非常感谢。

以上是关于glassfish jdbcrealm身份验证中的受限页面未触发登录的主要内容,如果未能解决你的问题,请参考以下文章

Glassfish 4 中的密码加密算法

Shiro Spring JDBCRealm 身份验证和授权

Glassfish 认为 jdbcRealm 实际上是 fileRealm

使用 JDBCRealm 通过 Shiro 对用户进行身份验证

Glassfish 中的服务器身份验证模块转发

在 Glassfish 上进行领域身份验证后重定向