Tomcat用户具有主要角色,但request.isUserInRole()则另有说明

时间:2015-05-29 09:38:54

标签: java jsp security tomcat java-ee

在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 scriplet检查了角色:

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

它打印出来:

  

用户名=&#34;管理员&#34;,角色=&#34;用户,管理员,APP_ADMIN&#34;

但是当我检查isUserInRole时:

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

获取:

  

没了

Tomcat版本是7.0.55

2 个答案:

答案 0 :(得分:2)

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

2:角色名称中的通配符'*'可能会造成麻烦。也许尝试使用角色名称'user',看看它是否有效。

要将通配符作为角色名称,您必须启用allRolesMode

  

此属性控制何时处理特殊角色名称*的方式   处理web.xml中的授权约束。默认情况下   使用严格的规范标准值表示   必须为用户分配web.xml中定义的角色之一。该   替代值是authOnly,这意味着用户必须是   经过身份验证但未对指定的角色进行检查   strictAuthOnly表示用户必须经过身份验证且没有   除非定义了角色,否则将对已分配的角色进行检查   web.xml,在这种情况下,必须至少为其分配一个用户   作用。

有关详情,请参阅Tomcat文档:https://tomcat.apache.org/tomcat-7.0-doc/config/realm.html

答案 1 :(得分:0)

最后我发现了问题,我只需要替换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包装器的情况下不起作用,奇怪但它现在正在工作......