Spring Security授权 - 拒绝管理员访问

时间:2013-05-05 14:55:06

标签: spring security spring-mvc spring-security

管理员角色的授权被拒绝访问整个系统 - 管理员和主页。所以我将ROLE_ADMIN添加到/ main / home intercept-url。

这是安全xml

<http auto-config="true" use-expressions="true">

<intercept-url pattern="/**" requires-channel="https" />
<intercept-url pattern='/main/home/' access="hasRole('ROLE_USER' 'ROLE_ADMIN')" />
<intercept-url pattern='/admin/admin/**' access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern='/main/user/setter/settingpage' access="hasRole('ROLE_USER')" />
<intercept-url pattern='/main/user/setter/addpage' access="hasRole('ROLE_USER')" />
<intercept-url pattern='/login.jsp' access='IS_AUTHENTICATED_ANONYMOUSLY' /> 

<form-login login-page="/login.jsp" default-target-url="/main/home" authentication-failure-url="/auth/loginfail?error=true"/>

</http>  

但这使整个程序停止工作,因为当我运行代码时,错误是

  

无法解析表达式'hasRole('ROLE_USER''ROLE_ADMIN')'

当我删除系统工作的ROLE_ADMIN时,可以对用户进行身份验证,而不是现在被拒绝访问所有页面的ROLE_ADMIN。我在db中设置了角色,直到最近才开始工作。

2 个答案:

答案 0 :(得分:14)

如错误消息所示,

  

无法解析表达式'hasRole('ROLE_USER''ROLE_ADMIN')

您需要将hasAnyRole()与逗号分隔的权限列表一起使用。

  

如果当前主体具有任何提供的角色,则返回true   (以逗号分隔的字符串列表给出)see

所以改变

<intercept-url pattern='/main/home/' access="hasRole('ROLE_USER' 'ROLE_ADMIN')" />

<intercept-url pattern='/main/home/' access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN')" />

由于您已将use-expressions设为true,因此需要更改

IS_AUTHENTICATED_ANONYMOUSLY

isAnonymous()

答案 1 :(得分:0)

SpEL:Spring Expression Language

access="hasRole('ROLE_USER') and hasRole('ROLE_ADMIN')"

也:

access="hasRole('USER_ADMIN') and hasIpAddress('192.168.1.10')"