demo下载:test_security.zip
网上讲这个主题的帖子很多,而且《spring in action》和《spring security reference》的Security Namespace Configuration节有详细的介绍。本文就提供一个基于maven的demo工程供大家快速起步好了。
本demo有两个请求路径
http://localhost:8080/test_security/admin/test2.do
http://localhost:8080/test_security/test1.do
添加了如下的用户信息
username ? 授权
--------------------------------------------------------
root ? ? ? ? ? ?ROLE_ADMIN,ROLE_COMMON
rex ? ? ? ? ? ? ?ROLE_ADMIN
hml ? ? ? ? ? ?ROLE_COMMON
有如下的权限映射信息:
1 2 3 4 5 6 7 |
<security:http use-expressions="true"> <security:form-login login-page="/login.jsp"/> <security:logout/> <security:intercept-url pattern="/login.jsp" access="isAnonymous()" /> <security:intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" /> <security:intercept-url pattern="/**" access="hasRole('ROLE_COMMON')" /> </security:http> |
所以root能访问这两个url,而rex能访问第一个,hml能访问第二个,具体参考applicationContext.xml文件的配置
注意点如下:
1、如果<security:http>元素的use-expressions='true',那么不能在<security:intercept-url>元素的access属性值中使用IS_AUTHENTICATED_ANONYMOUSLY等系统常量,只能使用access="isAnonymous()"这样的表达式。当<security:http use-expressions="true"> 激活SpEL表达式的时候,不支持使用角色名。
不然会抛出如下异常
java.lang.IllegalArgumentException: Failed to evaluate expression 'IS_AUTHENTICATED_ANONYMOUSLY'
2、当自定义登陆view的时候,要将login.jsp排查在spring security的验证范围,不然就没法登陆了。
3、如果启用了csrf机制,那么login.jsp页面要如下配置
<security:intercept-url pattern="/login.jsp" access="isAnonymous()" />
不能
<security:http pattern="/login.jsp" security="none"/>,不然我们没有办法获取csrf信息。
4、需要在login.jsp页面添加关于csrf的隐藏域
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
5、对于spring-security 4.0.3,不再支持spring-security-3.0.xsd,只支持全新的spring-security-4.0.xsd。
Posted in: spring practise
Comments are closed.