Spring Security tutorial 学习札记(一)
Spring Security 提供了一个tutorial例子,刚开始看的时候感觉没有头绪,通过看Reference和视频现在有一些进展了,我现在通过一些小例子把tutorial里面的东西一点一点加进去。
先新建一个Web项目,里面只有两个jsp页面,index.jsp和admin.jsp。index.jsp有一个链接指向admin.jsp页面,代码如下。
<body>
<p>任何人可以访问该页面!</p>
<p><a href="admin/admin.jsp">管理员管理页面</a></p>
</body>
下面我们用 Spring Security 来保护对admin页面的访问。
1.为项目添加 Spring Security 需要的jar包。为了方便,我直接从tutorial里面复制过来了。
2.配置web.xml。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext-security.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> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
context-param用来指定Spring Security配置文件的位置;
filter用来启动Spring Security的过滤器链;
listener用来启动Spring容器;
3.配置applicationContext-security.xml。
<?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"> <http use-expressions="true"> <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/> <intercept-url pattern="/**" access="permitAll" /> <form-login /> <logout /> <remember-me /> </http> <authentication-manager> <authentication-provider> <user-service> <user name="rod" password="rod" authorities="ROLE_ADMIN" /> <user name="peter" password="peter" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager> </beans:beans>
我们通过intercept-url 来判断用户需要什么权限才能访问对应的url资源。第一个用来控制对admin.jsp页面的访问,第二个使用了通配符,用来控制对系统所有资源的访问。
通过pattern匹配时,Spring Security采用就近原则。例如我们访问admin.jsp页面时,两个intercept-url 都满足,但因为pattern="/admin/**" 排在上面,所有Spring Security会采用这个来处理对admin.jsp页面的访问,也就是只有拥有ROLE_ADMIN权限的用户才可以访问。
OK,完成了。现在我们通过index.jsp的链接访问admin.jsp页面时会弹出一个login页面(这个页面是Spring Security默认提供的,如果不喜欢可以用自己的login页面来替换它),要求输入用户名和密码。我们输入rod/rod,可以访问admin.jsp。如果输入peter/peter会提示拒绝访问,因为peter不是管理员。如果我们登录时选中remember me,登录成功后关闭浏览器,再打开浏览器通过index.jsp访问admin.jsp时就不会弹出登录页面了,可以直接访问到admin.jsp。Spring Security通过cookie找到了用户名和密码。