在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
答案 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包装器的情况下不起作用,奇怪但它现在正在工作......