概要
Spring Security,这是一种基于 Spring AOP 和 Servlet 过滤器的安全框架。它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权。这里过多的 spring security 解释和作用就不在这里赘述了,请自行搜索。目前最新版本的 Spring Security 为 4.2.2,但是我这里用了稳定版本 3.1.3。下面例子为一个简单的 Spring Security 配置应用。
新建一个 web maven 项目
如果不知道怎么新建 web maven 项目的请参考我的另一篇博客:http://blog.csdn.net/AirMario…
新建好项目之后在 webapp 下添加了两个 jsp 文件,adminPage.jsp 和 index.jsp。其中 adminPage.jsp 只有那些拥有 ROLE_ADMIN,ROLE_USER 其中一种权限的用户才能访问,而 index.jsp 只允许那些拥有 ROLE_USER 权限的用户才能访问。
配置过滤器
为了在项目中使用 Spring Security 控制权限,首先要在 web.xml 中配置过滤器,这样我们就可以控制对这个项目的每个请求了。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0">
<display-name>SpringSecurity</display-name>
<!-- 加载配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/config/applicationContext*.xml</param-value>
</context-param>
<!-- spring security 的过滤器配置 -->
<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>
</web-app>
Spring Security 的配置
在 WEB-INF/config/ 下新建 applicationContext.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/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<http auto-config='true'>
<intercept-url pattern="/adminPage.jsp" access="ROLE_ADMIN" />
<intercept-url pattern="/**" access="ROLE_USER" />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin" password="123" authorities="ROLE_USER, ROLE_ADMIN" />
<user name="user" password="123" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>
说明:
- 文件的头部为,声明在 xml 中使用 Spring Security 提供的命名空间。
- http 部分配置如何拦截用户请求。auto-config=’true’ 将自动配置几种常用的权限控制机制,包括 form, anonymous, rememberMe。
- 利用 intercept-url 来判断用户需要具有何种权限才能访问对应的 url 资源,可以在 pattern 中指定一个特定的 url 资源,也可以使用通配符指定一组类似的 url 资源。例子中定义的两个 intercepter-url,第一个用来控制对 /admin.jsp 的访问,第二个使用了通配符
/**
,说明它将控制对系统中所有 url 资源的访问。 - Spring Security 采用的是一种就近原则,就是说当用户访问的 url 资源满足多个 intercepter-url 时,系统将使用第一个符合条件的 intercept-url 进行权限控制。在我们这个例子中就是,当用户访问 /admin.jsp 时,虽然两个 intercept-url 都满足要求,但因为第一个 intercept-url 排在上面,所以 Spring Security 会使用第一个 intercept-url 中的配置处理对 /adminPage.jsp 的请求,也就是说,只有那些拥有了 ROLE_ADMIN 权限的用户才能访问 /adminPage.jsp。
- access 指定的权限都是以 ROLE_开头的,实际上这与 Spring Security 中的 Voter 机制有着千丝万缕的联系,只有包含了特定前缀的字符串才会被 Spring Security 处理。目前来说我们只需要记住这一点就可以了。
- user-service 中定义了两个用户,admin 和 user。为了简便起见,我们使用明文定义了两个用户对应的密码,这只是为了当前演示的方便,之后的例子中我们会使用 Spring Security 提供的加密方式,避免用户密码被他人窃取
- 最重要的部分是 authorities,这里定义了这个用户登陆之后将会拥有的权限,它与上面 intercept-url 中定义的权限内容一一对应。每个用户可以同时拥有多个权限,例子中的 admin 用户就拥有 ROLE_ADMIN 和 ROLE_USER 两种权限,这使得 admin 用户在登陆之后可以访问 ROLE_ADMIN 和 ROLE_USER 允许访问的所有资源。与之对应的是,user 用户就只拥有 ROLE_USER 权限,所以他只能访问 ROLE_USER 允许访问的资源,而不能访问 ROLE_ADMIN 允许访问的资源。
pom.xml 文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zmc</groupId>
<artifactId>SpringSecurityDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>SpringSecurityDemo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java-version>1.7</java-version>
<org.springframework-version>3.2.2.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.1</org.slf4j-version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<!-- Spring security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>3.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
<version>3.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>3.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
这样一个项目就构建完成了,部署到 tomcat 进行测试。
结果
在浏览器上输入:http://localhost:8888/SpringSecurityDemo/
,因为没有登陆,所以无法访问 index.jsp 页面,这个时候 spring security 就起作用了,对资源进行拦截,因为没有符合权限的用户登陆,所以就跳转到登陆页面,其中这个登陆页面是 Spring Security 自动生成的,这也是 auto-config=”true”起的作用之一。
然后输入用户名和密码,成功跳转到 index.jsp 页面。
这里因为 admin 用户有 ROLE_ADMIN 和 ROLE_USER 权限,而 index.jsp 页面 ROLE_USER 权限即可访问,所以 admin 用户可以成功访问 index.jsp 和 adminPage.jsp 页面。
下面再来测试用户 user,注意已经登陆了的话,应该重启浏览器,要不然会一直记住用户,无法做测试。
从上图中可以看到,登陆用户 user,可以访问 index.jsp 页面但是无法访问 adminPage.jsp。这是因为 user 用户只有 ROLE_USER 权限,而 adminPage.jsp 页面需要 ROLE_USER 权限,所以就拒绝访问。
以上就是一个简单的 spring security 配置应用。
微信公众号关注:ByteZ,获取更多学习资料