使用 Spring 表达式语言配置访问控制,要实现这一功能的直接方式是在<http>配置元素上添加 use-expressions 属性:
<http auto-config="true" use-expressions="true">
这样就会在投票器中自动增加一个投票器:org.springframework.security.web.access.expression.WebExpressionVoter
但是,如果显示声明了accessDecisionManager,则需要手工加上这个投票器,参考:http://hanqunfeng.iteye.com/blog/1155226
我们以此为基础进行配置:
1.声明WebExpressionVoter
<!-- 启用表达式 为了后面的投票器做准备 --> <beans:bean class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler" id="expressionHandler"/> <beans:bean class="org.springframework.security.web.access.expression.WebExpressionVoter" id="expressionVoter"> <beans:property name="expressionHandler" ref="expressionHandler"/> </beans:bean>
2.在accessDecisionManager中增加WebExpressionVoter
<beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> <beans:property name="decisionVoters"> <beans:list> <beans:bean class="org.springframework.security.access.vote.RoleVoter" /> <beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter" /> <beans:bean class="com.netqin.common.security.DynamicRoleVoter" /> <beans:ref bean="expressionVoter"/> </beans:list> </beans:property> </beans:bean>
3.在http标签中增加use-expressions="true"
4.修改拦截规则为SpEL表达式
<intercept-url pattern="/demo.do*" access="authenticated" /> <intercept-url pattern="/**/*.do*" access="hasRole('HODLE')" />
ok,以上就配置完成了。
SpEL表达式说明:
用于匹配一个请求的IP 地址或一个地址的网络掩码
access="hasIpAddress('162.79.8.30')"
access="hasIpAddress('162.0.0.0/224')"
用于匹配一个使用GrantedAuthority 的角色(类似于 RoleVoter)
access="hasRole('ROLE_USER')"
用于匹配一个使用GrantedAuthority 的角色列表。用户匹配其中的任何一个均可放行。
access="hasRole('ROLE_USER','ROLE_ADMIN')"
任何用户均可访问
access="permitAll"
任何用户均不可访问
access="denyAll"
匿名用户可访问
access="anonymous"
检查用户是否认证过
access="authenticated"
检查用户是否通过remember me 功能认证的
access="rememberMe"
检查用户是否通过提供完整的凭证信息来认证的
access="fullyAuthenticated"
在 SpEL 中,使用 and,or 以及 not 作为逻辑操作符,例如:
access="hasRole('ROLE_USER') and fullyAuthenticated"
access="rememberMe or fullyAuthenticated"