request.isUserInRole("ADMIN") также возвращает true для пользователя не в роли ADMIN, а в роли USER
В настоящее время я пробую JDBCRealm в Glasshfish v3: у меня есть две роли: USER и ADMIN.
У меня есть LoginServlet, который перенаправляет на URL (скажем /admin или /user) на основе метода request.isUserInRole("ADMIN").
Проблема в том, что когда ADMIN вошел в систему, он возвращает true, поэтому он перенаправляется в /admin, но он также может получить доступ к /user. Когда пользователь USER зарегистрирован в request.isUserInRole("ADMIN") также возвращает true. request.isUserInRole("NONEXISTINGROLE") возвращает false для обоих.
Например:
request.isUserInRole("ADMIN") + "" + request.isUserInRole ("USER") + "" + request.isUserInRole ("NONEXISTINGROLE")
для пользователя loggedin: возвращает true true false
для входа в систему ADMIN возвращает true true false
Это часть моего 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>
Спасибо!
2 ответа
Исправил это, убедившись, что параметр Realm "Назначить группы" пуст. Glassfish загрузит их из таблицы групп.
Ваши карты безопасности выглядят хорошо на первый взгляд. Как насчет ваших пользовательских сопоставлений? Похоже, что одно и то же имя пользователя отображается как на роли пользователя, так и на администратора.