【问题标题】:Tomcat user has principal role but request.isUserInRole() says otherwiseTomcat 用户具有主要角色,但 request.isUserInRole() 另有说明
【发布时间】:2015-05-29 09:38:54
【问题描述】:

在 tomcat-users.xml 中定义了用户和角色:

<user username="admin" password="admin" roles="user,admin,APP_ADMIN"/>
  <role rolename="user"/>
  <role rolename="APP_ADMIN"/>
  <role rolename="admin"/>

应用安全性定义为:

<security-constraint>
        <web-resource-collection>
                <web-resource-name>Dynamic pages</web-resource-name>
                <url-pattern>*.jsp</url-pattern>
        </web-resource-collection>
        <auth-constraint>
                <description>These are the roles who have access.</description>
                <role-name>*</role-name>
        </auth-constraint>
        <user-data-constraint>
                <description></description>
                <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>

但是当我以管理员身份登录应用程序时,它总是给我 HTTP 403 未授权。
我用 JSP 脚本检查了角色:

out.write(request.getUserPrincipal().toString()); 

然后打印出来:

用户用户名="admin",角色="user,admin,APP_ADMIN"

但是当我检查 isUserInRole:

out.write(request.isUserInRole("APP_ADMIN") ? "Yep" : "nope");

获取:

没有

Tomcat 版本是 7.0.55

【问题讨论】:

  • 你也定义了角色吗?
  • 嗨,是的,我将它们添加到问题中。
  • 哎呀。你也配置了内存领域吗?
  • 是的,也定义了一个,如果我输入错误,我也可以使用密码 admin-admin 登录,它不会让我登录,所以它看起来像是在加载 tomcat-users.xml跨度>
  • 那我不太确定:(我建议你把你的server.xmltomcat-users.xml的相关部分也贴出来,也许别人会有什么。

标签: java jsp security tomcat jakarta-ee


【解决方案1】:

1:您可能必须在 web.xml 中定义角色。请参阅此 SO 问题Why do I list security roles in web.xml when they're in jdbcRealm database?

2:角色名称中的通配符“*”可能会造成问题。也许尝试使用角色名称“用户”,看看它是否有效。

对于作为角色名称的通配符,您必须启用allRolesMode

此属性控制特殊角色名称 * 的处理方式 处理 web.xml 中的授权约束。默认情况下, 使用严格的规范兼容值,这意味着 必须为用户分配 web.xml 中定义的角色之一。这 替代值是 authOnly,这意味着用户必须是 经过身份验证但不检查分配的角色和 strictAuthOnly 这意味着用户必须经过身份验证并且没有 除非角色在 web.xml 在这种情况下,必须为用户分配至少其中一项 角色。

有关更多信息,请参阅 Tomcat 文档:https://tomcat.apache.org/tomcat-7.0-doc/config/realm.html

【讨论】:

    【解决方案2】:

    我终于找到了问题,我只需要替换 server.xml 中的行:

    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                 resourceName="UserDatabase"/>
    

    这些:

    <Realm className="org.apache.catalina.realm.LockOutRealm">
                   <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                   resourceName="UserDatabase"/>
      </Realm> 
    

    现在我不知道为什么 UserDatabaseRealm 在没有 LockOutRealm 包装器的情况下无法工作,奇怪但它现在可以工作了......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 2023-01-17
      • 2014-07-16
      相关资源
      最近更新 更多