spring-security3 配置和使用.
最近项目中要使用到spring-security,闲来没事就研究了下。发现入门挺简单的,在这里把自己的心得发下,希望对没有接触过想接触的朋友有帮助。
1、在spring-security官网下载最新jar然后拷贝jar到项目的lib下。
2、在classpath下添加security配置文件,例如applicationContext-security.xml.网上现在大多都是2.0的schema. 要根据自己使用的版本而定.下面是3.0的schema.
Xml代码
01.<?xml version="1.0" encoding="UTF-8"?>
02. <beans:beans xmlns="http://www.springframework.org/schema/security" 03. xmlns:beans="http://www.springframework.org/schema/beans" 04. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 05. xsi:schemaLocation="http://www.springframework.org/schema/beans 06. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
07. http://www.springframework.org/schema/security
08. http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 09.
10. </beans:beans> <?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
</beans:beans>
3、然后在web.xml中添加配置,内容如下:
Xml代码
01.<!-- spring security -->
02. <context-param> 03. <param-name>contextConfigLocation</param-name> 04. <param-value> 05. classpath*:/applicationContext*.xml
06. </param-value> 07. </context-param> 08.
09. <filter> 10. <filter-name>springSecurityFilterChain</filter-name> 11. <filter-class> 12. org.springframework.web.filter.DelegatingFilterProxy
13. </filter-class> 14. </filter> 15. <filter-mapping> 16. <filter-name>springSecurityFilterChain</filter-name> 17. <url-pattern>/*</url-pattern> 18. </filter-mapping> 19. <listener> 20. <listener-class> 21. org.springframework.web.context.ContextLoaderListener
22. </listener-class> 23. </listener> <!-- spring security -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/applicationContext*.xml
</param-value>
</context-param>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
配置起来很简单,由于我的security是整合到现有项目中的.一些jar可能已经存在. 单独做demo的朋友配置的时候可能会出现问题.
本想分开发挣点积分..但怕大家看起来累.. 就发到一起吧.. (*^__^*)
使用篇
1、建立login.jsp页面.内容如下:
Html代码
01.<form action="<%=path %>/j_spring_security_check" method="post">
02. USERNAME:<input type="text" name="j_username" value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}" /><br/> 03. PASSWORD:<input type="password" name="j_password" value="" /><br/> 04. <input type="checkbox" name="_spring_security_remember_me" />两周之内不必登陆<br/> 05. <input type="submit"> 06. </form> <form action="<%=path %>/j_spring_security_check" method="post">
USERNAME:<input type="text" name="j_username" value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}" /><br/>
PASSWORD:<input type="password" name="j_password" value="" /><br/>
<input type="checkbox" name="_spring_security_remember_me" />两周之内不必登陆<br/>
<input type="submit">
</form>
j_spring_security_check : 为security验证中心(不知道怎么说合适.暂时这么理解吧..).
j_username: 验证用户名;
j_password: 验证密码;
${sessionScope['SPRING_SECURITY_LAST_USERNAME']}:使用最后一次登录用户名.
_spring_security_remember_me:记住我...
2、xml配置,配置内容如下:
Xml代码
01.<?xml version="1.0" encoding="UTF-8"?>
02. <beans:beans xmlns="http://www.springframework.org/schema/security" 03. xmlns:beans="http://www.springframework.org/schema/beans" 04. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 05. xsi:schemaLocation="http://www.springframework.org/schema/beans 06. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
07. http://www.springframework.org/schema/security
08. http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 09.
10. <!-- auto-config = true 则使用from-login. 如果不使用该属性 则默认为http-basic(没有session). 11. access-denied-page:出错后跳转到的错误页面;
12. --> 13. <http auto-config="true" access-denied-page="/common/403.jsp"> 14. <!-- intercept-url:拦截器,可以设定哪些路径需要哪些权限来访问. filters=none 不使用过滤,也可以理解为忽略 --> 15. <intercept-url pattern="/index.jsp" access="ROLE_USER" /> 16. <intercept-url pattern="/login.jsp" filters="none" /> 17. <intercept-url pattern="/common/**" filters="none" /> 18. <intercept-url pattern="/script/**" filters="none" /> 19. <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> 20. <intercept-url pattern="/user.jsp" access="ROLE_USER" /> 21.
22. <!-- session-management是针对session的管理. 这里可以不配置. 如有需求可以配置. --> 23. <!-- id登陆唯一. 后登陆的账号会挤掉第一次登陆的账号 error-if-maximum-exceeded="true" 禁止2次登陆; 24. session-fixation-protection="none" 防止伪造sessionid攻击. 用户登录成功后会销毁用户当前的session. 25. 创建新的session,并把用户信息复制到新session中.
26. --> 27. <session-management session-fixation-protection="none"> 28. <concurrency-control/> 29. </session-management> 30.
31. <!-- login-page:默认指定的登录页面. authentication-failure-url:出错后跳转页面. default-target-url:成功登陆后跳转页面 --> 32. <form-login login-page="/login.jsp" 33. authentication-failure-url="/common/403.jsp" 34. default-target-url="/admin.jsp" /> 35. <!-- logout-success-url:成功注销后跳转到的页面; --> 36. <logout logout-success-url="/login.jsp"/> 37. <http-basic /> 38.
39. </http> 40.
41. <!--
42. 连接池.我spring配置文件中配的有.所以这里就注掉了.
43. <beans:bean id="dataSource" value="com.mysql.jdbc.Driver"/> 45. <beans:property name="url" value="jdbc:mysql://localhost/demo"/> 46. <beans:property name="username" value="root"/> 47. <beans:property name="password" value="root"/> 48. </beans:bean> 49. --> 50.
51. <!-- 权限管理操作 --> 52. <authentication-manager> 53. <authentication-provider> 54. <!--
55. 密码加密方式. 常用的有md5 和 sha.
56. salt-source:忘记了.. 手头api关了,网速卡就不上网查了. 类似在md5上又加了一层. 放置暴力破解. 追加安全性.
57. <password-encoder hash="md5"> 58. <salt-source user-property="username"/> 59. </password-encoder> 60. --> 61. <!-- 注入dataSource验证数据库中的用户名.密码.账号状态.和权限相关; --> 62. <jdbc-user-service data-source-ref="dataSource" 63. users-by-username-query="select username,password,enabled from user where username = ? and enabled = 1" 64. authorities-by-username-query="select u.username,r.name from user u join user_role ur on u.uid = ur.uid join role r on r.rid = ur.rid where u.username = ?" /> 65. <!--
66. 使用固定的用户名和密码及权限来做验证.
67. <user-service> 68. <user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" /> 69. <user name="user" password="user" authorities="ROLE_USER" /> 70. </user-service> 71. --> 72. </authentication-provider> 73. </authentication-manager> 74. <!-- 75. <beans:bean id="userDetailsServiceImpl" />
76. -->
77.
78. <!--
79. 此配置只是自己学习的一个小demo. 数据库也建的比较随意 比较简单. 使用的是角色权限. 个人比较推荐组权限来控制.. (由于工作经验限制,此处为个人理解)
80. 我的库如下:
81. user:username\password\enabled
82. role:name\desc
83. user_role:uid\rid
84. --> 85.</beans:beans> <?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
<!-- auto-config = true 则使用from-login. 如果不使用该属性 则默认为http-basic(没有session).
access-denied-page:出错后跳转到的错误页面;
-->
<http auto-config="true" access-denied-page="/common/403.jsp">
<!-- intercept-url:拦截器,可以设定哪些路径需要哪些权限来访问. filters=none 不使用过滤,也可以理解为忽略 -->
<intercept-url pattern="/index.jsp" access="ROLE_USER" />
<intercept-url pattern="/login.jsp" filters="none" />
<intercept-url pattern="/common/**" filters="none" />
<intercept-url pattern="/script/**" filters="none" />
<intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
<intercept-url pattern="/user.jsp" access="ROLE_USER" />
<!-- session-management是针对session的管理. 这里可以不配置. 如有需求可以配置. -->
<!-- id登陆唯一. 后登陆的账号会挤掉第一次登陆的账号 error-if-maximum-exceeded="true" 禁止2次登陆;
session-fixation-protection="none" 防止伪造sessionid攻击. 用户登录成功后会销毁用户当前的session.
创建新的session,并把用户信息复制到新session中.
-->
<session-management session-fixation-protection="none">
<concurrency-control/>
</session-management>
<!-- login-page:默认指定的登录页面. authentication-failure-url:出错后跳转页面. default-target-url:成功登陆后跳转页面 -->
<form-login login-page="/login.jsp"
authentication-failure-url="/common/403.jsp"
default-target-url="/admin.jsp" />
<!-- logout-success-url:成功注销后跳转到的页面; -->
<logout logout-success-url="/login.jsp"/>
<http-basic />
</http>
<!--
连接池.我spring配置文件中配的有.所以这里就注掉了.
<beans:bean id="dataSource" value="com.mysql.jdbc.Driver"/>
<beans:property name="url" value="jdbc:mysql://localhost/demo"/>
<beans:property name="username" value="root"/>
<beans:property name="password" value="root"/>
</beans:bean>
-->
<!-- 权限管理操作 -->
<authentication-manager>
<authentication-provider>
<!--
密码加密方式. 常用的有md5 和 sha.
salt-source:忘记了.. 手头api关了,网速卡就不上网查了. 类似在md5上又加了一层. 放置暴力破解. 追加安全性.
<password-encoder hash="md5">
<salt-source user-property="username"/>
</password-encoder>
-->
<!-- 注入dataSource验证数据库中的用户名.密码.账号状态.和权限相关; -->
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="select username,password,enabled from user where username = ? and enabled = 1"
authorities-by-username-query="select u.username,r.name from user u join user_role ur on u.uid = ur.uid join role r on r.rid = ur.rid where u.username = ?" />
<!--
使用固定的用户名和密码及权限来做验证.
<user-service>
<user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />
<user name="user" password="user" authorities="ROLE_USER" />
</user-service>
-->
</authentication-provider>
</authentication-manager>
<!--
<beans:bean id="userDetailsServiceImpl" />
-->
<!--
此配置只是自己学习的一个小demo. 数据库也建的比较随意 比较简单. 使用的是角色权限. 个人比较推荐组权限来控制.. (由于工作经验限制,此处为个人理解)
我的库如下:
user:username\password\enabled
role:name\desc
user_role:uid\rid
-->
</beans:beans>
以上配置结束后可以完成用户登录\权限验证等操作.
配置和使用到这里就结束了. 今天下午的小心得.. spring-security很强大. 在这里感谢family168的在线帮助. 谢谢.. 希望对没有接触过spring-security的朋友有所帮助.
本文来自http://www.cnblogs.com/wenxiu/archive/2011/01/22/1942084.html