【问题标题】:request.isUserInRole("ADMIN") also returns true for user not in role ADMIN but role USERrequest.isUserInRole("ADMIN") 也为不在角色 ADMIN 但角色 USER 的用户返回 true
【发布时间】:2010-02-04 23:22:39
【问题描述】:

我目前正在尝试 Glasshfish v3 中的 JDBCRealm: 我有 2 个角色 USER 和 ADMIN。

我有一个基于 request.isUserInRole("ADMIN") 方法重定向到 url(比如 /admin 或 /user)的 LoginServlet。

问题是当 ADMIN 登录时它返回 true,因此被重定向到 /admin 但他也可以访问 /user。当用户登录时 request.isUserInRole("ADMIN") 也返回 true。 request.isUserInRole("NONEXISTINGROLE") 两者都返回 false。

例如:

request.isUserInRole("ADMIN") +" "+ request.isUserInRole("USER")+" "+ request.isUserInRole("NONEXISTINGROLE")

对于已登录的用户:返回 true true false

对于已登录的 ADMIN 返回 true 真假

这是我的 web.xml 的一部分:

<security-constraint>
    <display-name>Constraint1</display-name>
    <web-resource-collection>
        <web-resource-name>adminProtected</web-resource-name>
        <description>Administrator restricted area</description>
        <url-pattern>/admin/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>ADMIN</role-name>
    </auth-constraint>
</security-constraint>
<security-constraint>
    <display-name>Constraint2</display-name>
    <web-resource-collection>
        <web-resource-name>userProtected</web-resource-name>
        <description>User restricted area</description>
        <url-pattern>/user/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>USER</role-name>
    </auth-constraint>
</security-constraint>
<security-constraint>
    <display-name>Constraint3</display-name>
    <web-resource-collection>
        <web-resource-name>LoginServlet</web-resource-name>
        <description>All restricted area</description>
        <url-pattern>/LoginServlet</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>USER</role-name>
        <role-name>ADMIN</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>securityJDBC</realm-name>
    <form-login-config>
        <form-login-page>/login.jsf</form-login-page>
        <form-error-page>/login.jsf</form-error-page>
    </form-login-config>
</login-config>

<security-role>
    <description></description>

    <role-name>USER</role-name>
</security-role>
<security-role>
    <description></description>
    <role-name>ADMIN</role-name>
</security-role>
<servlet>
    <description></description>
    <display-name>LoginServlet</display-name>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>controllers.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>

还有我的 sun-web.xml:

    <security-role-mapping>
    <role-name>USER</role-name>
    <group-name>USER</group-name>
</security-role-mapping>
<security-role-mapping>
    <role-name>ADMIN</role-name>
    <group-name>ADMIN</group-name>
</security-role-mapping>

谢谢!

【问题讨论】:

    标签: security servlets glassfish security-roles jsecurity


    【解决方案1】:

    通过确保领域设置“分配组”为空来修复它。 Glassfish 将从组表中加载它们。

    【讨论】:

      【解决方案2】:

      乍一看,您的安全映射看起来不错。你的用户映射怎么样?看起来用户和管理员角色都映射了相同的用户名。

      【讨论】:

      • 我有 2 个表: SecurityGroup: id;groupId;userid; 1;管理员;1 2;用户;2 安全用户; id;密码;用户名;雇主 1;21232f297a57a5a743894a0e4a801fc3;a;1 2;ee11cbb19052e40b07aac0ca060c23ee;u;2
      • Glassfish 领域属性:Jaas 上下文:jdbcRealm 用户表:securityuser 用户名列:userid 密码列:密码组表:securitygroup 组名列:groupId
      • 我发现了一些东西:如果我将领域设置“分配组”设置为 USER,ADMIN 我得到了原来的问题。如果您将其设置为空,我可以登录,但在所有安全限制条件下都拒绝访问...
      猜你喜欢
      • 2022-07-25
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 2019-06-04
      • 2019-12-30
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多