一 概要

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/article/details/53954986

新建好项目之后在webapp下添加了两个jsp文件,adminPage.jsp和index.jsp。其中adminPage.jsp只有那些拥有ROLE_ADMIN,ROLE_USER其中一种权限的用户才能访问,而index.jsp只允许那些拥有ROLE_USER权限的用户才能访问。

三 配置过滤器

为了在项目中使用Spring Security控制权限,首先要在web.xml中配置过滤器,这样我们就可以控制对这个项目的每个请求了。
web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  6. version="3.0">
  7. <display-name>SpringSecurity</display-name>
  8.  
  9. <!-- 加载配置文件 -->
  10. <context-param>
  11. <param-name>contextConfigLocation</param-name>
  12. <param-value>WEB-INF/config/applicationContext*.xml</param-value>
  13. </context-param>
  14. <!-- spring security 的过滤器配置 -->
  15. <filter>
  16. <filter-name>springSecurityFilterChain</filter-name>
  17. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  18. </filter>
  19. <filter-mapping>
  20. <filter-name>springSecurityFilterChain</filter-name>
  21. <url-pattern>/*</url-pattern>
  22. </filter-mapping>
  23.  
  24. <listener>
  25. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  26. </listener>
  27.  
  28. </web-app>

  

四 Spring Security的配置

在WEB-INF/config/下新建applicationContext.xml,配置如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans:beans xmlns="http://www.springframework.org/schema/security"
  3. xmlns:beans="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-3.1.xsd
  9. http://www.springframework.org/schema/tx
  10. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
  11. http://www.springframework.org/schema/security
  12. http://www.springframework.org/schema/security/spring-security.xsd">
  13. <http auto-config='true'>
  14. <intercept-url pattern="/adminPage.jsp" access="ROLE_ADMIN" />
  15. <intercept-url pattern="/**" access="ROLE_USER" />
  16. </http>
  17. <authentication-manager>
  18. <authentication-provider>
  19. <user-service>
  20. <user name="admin" password="123" authorities="ROLE_USER, ROLE_ADMIN" />
  21. <user name="user" password="123" authorities="ROLE_USER" />
  22. </user-service>
  23. </authentication-provider>
  24. </authentication-manager>
  25. </beans:beans>

  

说明:

1、文件的头部为,声明在xml中使用Spring Security提供的命名空间。
http部分配置如何拦截用户请求。auto-config='true'将自动配置几种常用的权限控制机制,包括form, anonymous, rememberMe。

2、利用intercept-url来判断用户需要具有何种权限才能访问对应的url资源,可以在pattern中指定一个特定的url资源,也可以使用通配符指定一组类似的url资源。例子中定义的两个intercepter-url,第一个用来控制对/admin.jsp的访问,第二个使用了通配符/**,说明它将控制对系统中所有url资源的访问。

3、其实在实际使用中,Spring Security采用的是一种就近原则,就是说当用户访问的url资源满足多个intercepter-url时,系统将使用第一个符合条件的intercept-url进行权限控制。在我们这个例子中就是,当用户访问/admin.jsp时,虽然两个intercept-url都满足要求,但因为第一个intercept-url排在上面,所以Spring Security会使用第一个intercept-url中的配置处理对/adminPage.jsp的请求,也就是说,只有那些拥有了ROLE_ADMIN权限的用户才能访问/adminPage.jsp。

4、access指定的权限都是以ROLE_开头的,实际上这与Spring Security中的Voter机制有着千丝万缕的联系,只有包含了特定前缀的字符串才会被Spring Security处理。目前来说我们只需要记住这一点就可以了。

5、user-service中定义了两个用户,admin和user。为了简便起见,我们使用明文定义了两个用户对应的密码,这只是为了当前演示的方便,之后的例子中我们会使用Spring Security提供的加密方式,避免用户密码被他人窃取

6、最重要的部分是authorities,这里定义了这个用户登陆之后将会拥有的权限,它与上面intercept-url中定义的权限内容一一对应。每个用户可以同时拥有多个权限,例子中的admin用户就拥有ROLE_ADMIN和ROLE_USER两种权限,这使得admin用户在登陆之后可以访问ROLE_ADMIN和ROLE_USER允许访问的所有资源。与之对应的是,user用户就只拥有ROLE_USER权限,所以他只能访问ROLE_USER允许访问的资源,而不能访问ROLE_ADMIN允许访问的资源。

五 pom.xml文件:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4.  
  5. <groupId>com.zmc</groupId>
  6. <artifactId>SpringSecurityDemo</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>war</packaging>
  9.  
  10. <name>SpringSecurityDemo</name>
  11. <url>http://maven.apache.org</url>
  12.  
  13. <properties>
  14. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16. <java-version>1.7</java-version>
  17. <org.springframework-version>3.2.2.RELEASE</org.springframework-version>
  18. <org.aspectj-version>1.6.10</org.aspectj-version>
  19. <org.slf4j-version>1.6.1</org.slf4j-version>
  20. </properties>
  21.  
  22. <dependencies>
  23. <!-- Spring -->
  24. <dependency>
  25. <groupId>org.springframework</groupId>
  26. <artifactId>spring-context</artifactId>
  27. <version>${org.springframework-version}</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework</groupId>
  31. <artifactId>spring-webmvc</artifactId>
  32. <version>${org.springframework-version}</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework</groupId>
  36. <artifactId>spring-context-support</artifactId>
  37. <version>${org.springframework-version}</version>
  38. </dependency>
  39. <dependency>
  40. <groupId>commons-logging</groupId>
  41. <artifactId>commons-logging</artifactId>
  42. <version>1.1.3</version>
  43. </dependency>
  44. <!-- Spring security -->
  45. <dependency>
  46. <groupId>org.springframework.security</groupId>
  47. <artifactId>spring-security-core</artifactId>
  48. <version>3.1.4.RELEASE</version>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.springframework.security</groupId>
  52. <artifactId>spring-security-web</artifactId>
  53. <version>3.1.3.RELEASE</version>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.springframework.security</groupId>
  57. <artifactId>spring-security-config</artifactId>
  58. <version>3.1.3.RELEASE</version>
  59. </dependency>
  60. <dependency>
  61. <groupId>org.springframework.security</groupId>
  62. <artifactId>spring-security-crypto</artifactId>
  63. <version>3.1.3.RELEASE</version>
  64. </dependency>
  65. <dependency>
  66. <groupId>org.springframework.security</groupId>
  67. <artifactId>spring-security-taglibs</artifactId>
  68. <version>3.1.3.RELEASE</version>
  69. </dependency>
  70. <dependency>
  71. <groupId>junit</groupId>
  72. <artifactId>junit</artifactId>
  73. <version>3.8.1</version>
  74. <scope>test</scope>
  75. </dependency>
  76. </dependencies>
  77. </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配置应用。

Spring Security教程(一)的更多相关文章

  1. Spring Security教程(五):自定义过滤器从数据库从获取资源信息

    在之前的几篇security教程中,资源和所对应的权限都是在xml中进行配置的,也就在http标签中配置intercept-url,试想要是配置的对象不多,那还好,但是平常实际开发中都往往是非常多的资 ...

  2. Spring Security教程(八):用户认证流程源码详解

    本篇文章主要围绕下面几个问题来深入源码: 用户认证流程 认证结果如何在多个请求之间共享 获取认证用户信息 一.用户认证流程 上节中提到Spring Security核心就是一系列的过滤器链,当一个请求 ...

  3. Spring Security教程(三):自定义表结构

    在上一篇博客中讲解了用Spring Security自带的默认数据库存储用户和权限的数据,但是Spring Security默认提供的表结构太过简单了,其实就算默认提供的表结构很复杂,也不一定能满足项 ...

  4. Spring Security教程(二):通过数据库获得用户权限信息

    上一篇博客中,Spring Security教程(一):初识Spring Security,我把用户信息和权限信息放到了xml文件中,这是为了演示如何使用最小的配置就可以使用Spring Securi ...

  5. 临远的spring security教程

    为啥选择Spring Security 欢迎阅读咱们写的Spring Security教程,咱们既不想写一个简单的入门教程,也不想翻译已有的国外教程.咱们这个教程就是建立在咱们自己做的OA的基础上,一 ...

  6. Spring Security 教程 大牛的教程

    https://www.iteye.com/blog/elim-2247073 Spring Security 教程 Spring Security(20)——整合Cas Spring Securit ...

  7. Spring Security教程(三)

    在上一篇博客中讲解了用Spring Security自带的默认数据库存储用户和权限的数据,但是Spring Security默认提供的表结构太过简单了,其实就算默认提供的表结构很复杂,也不一定能满足项 ...

  8. Spring Security教程(二)

    上一篇博客中,Spring Security教程(一),我把用户信息和权限信息放到了xml文件中,这是为了演示如何使用最小的配置就可以使用Spring Security,而实际开发中,用户信息和权限信 ...

  9. Spring Security教程(二):自定义数据库查询

    Spring Security教程(二):自定义数据库查询   Spring Security自带的默认数据库存储用户和权限的数据,但是Spring Security默认提供的表结构太过简单了,其实就 ...

  10. Spring Security教程系列(一)基础篇-1

    第 1 章 一个简单的HelloWorld 第 1 章 一个简单的HelloWorld Spring Security中可以使用Acegi-1.x时代的普通配置方式,也可以使用从2.0时代才出现的命名 ...

随机推荐

  1. 兼容 .NET Core3.0, Natasha 框架实现 隔离域与热编译操作

    关于 Natasha    动态构建已经成为了封装者们的家常便饭,从现有的开发趋势来看,普通反射性能之低,会迫使开发者转向EMIT/表达式树等构建方式,但是无论是EMIT还是表达式树,都会依赖于反射的 ...

  2. Python - Win10系统下Python3.x环境配置

    Win10系统下Python3.x环境配置 https://blog.csdn.net/qq_41952474/article/details/82630551

  3. PIE截图方法的优化

    因为我们组的项目要通过截图获取数据,所以要经常使用截图工具,之前截图都是根据教程(https://www.cnblogs.com/PIESat/p/10243308.html)用的地图显示范围截图,而 ...

  4. Salesforce LWC学习(一)Salesforce DX配置

    LWC: Create a Salesforce DX Project and Lightning Web Component:https://www.youtube.com/watch?v=p268 ...

  5. MySQL——数据库操作

    1.创建数据库 登录MySQL服务后,使用create命令创建数据库 # 登录MySQL进入终端 mysql -u root -p # 之后输入命令 create database database_ ...

  6. 【夯实基础】-浅谈"单点登录"的几种实现方式

    单点登录 一.Session跨域 所谓Session跨域就是摒弃了系统提供的Session,而使用自定义的类似Session的机制来保存客户端数据的一种解决方案. 如:通过设置cookie的domai ...

  7. mysql 带外注入

    带外通道 有时候注入发现并没有回显,也不能利用时间盲注,那么就可以利用带外通道,也就是利用其他协议或者渠道,如http请求.DNS解析.SMB服务等将数据带出. payload SELECT LOAD ...

  8. 使用脚本安装elasticsearch7.3的记录

    使用脚本安装elasticsearch7.3的记录 #!/bin/sh # https://www.elastic.co/guide/en/elasticsearch/reference/curren ...

  9. Maven项目配置Logback输出JSON格式日志

    最近,项目提出需求,日志需要固定输出为JSON格式,以便后端Flink程序解析. 项目背景 项目为简单的Maven项目,日志由Filebeat采集,因此不需要配置输出至Logstash. 下面为pom ...

  10. 本机安装mysql步骤

    原文:https://www.cnblogs.com/dukeShi/p/6546024.html 本机安装mysql服务,步骤教程(另附SQLyog和Navicat工具) 因为这段时间不是装系统就是 ...