一、Spring Security:
1、简介:
Spring Security 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。
1.1、用户认证:
指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。
Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。
1.2、用户授权:
指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。
Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制。
此外,Spring Security自动为我们做了安全防护。
安全这一块从来都有说不完的话题,一个简单的注册登录很好做,但是你要是考虑到各种各样的攻击,XSS、CSRF 等等,一个简单的注册登录也能做的很复杂。幸运的是,即使你对各种攻击不太熟悉,只要你用了 Spring Security,就能自动避免掉很多攻击了,因为 Spring Security 已经自动帮我们完成很多防护了。
2、结构:
通过继承
org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
实现权限配置,登录验证成功后初始化org.springframework.security.core.userdetails.UserDetails,存储当前登录用户。默认(可缺省)登录接口:/login。
Spring Security其实就是用filter,多请求的路径进行过滤。
(1)如果是基于Session,那么Spring-security会对cookie里的sessionid进行解析,找到服务器存储的sesion信息,然后判断当前用户是否符合请求的要求。
(2)如果是token,则是解析出token,然后将当前请求加入到Spring-security管理的权限信息中去。
如果系统的模块众多,每个模块都需要就行授权与认证,所以我们选择基于token的形式进行授权与认证,用户根据用户名密码认证成功,然后去数据库获取当前用户角色的一系列权限值,并以用户名为key,权限列表为value的形式存入redis缓存中,根据用户名相关信息生成token返回,浏览器将token记录到cookie中,每次调用api接口都默认将token携带到header请求头中,Spring-security解析header头获取token信息,解析token获取当前用户名,根据用户名就可以从redis中获取权限列表,这样Spring-security就能够判断当前请求是否有权限访问。
二、 spring security 依赖:
1、pom依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.14.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2、springBoot 和 spring security 版本对应关系:
springboot 版本 spring security版本
2.3.12.RELEASE 5.3.9.RELEASE
2.3.11.RELEASE 5.3.9.RELEASE
2.3.10.RELEASE 5.3.9.RELEASE
2.3.9.RELEASE 5.3.8.RELEASE
2.3.8.RELEASE 5.3.6.RELEASE
2.3.7.RELEASE 5.3.6.RELEASE
2.3.6.RELEASE 5.3.5.RELEASE
2.3.5.RELEASE 5.3.5.RELEASE
2.3.4.RELEASE 5.3.4.RELEASE
2.3.3.RELEASE 5.3.4.RELEASE
2.3.2.RELEASE 5.3.3.RELEASE
2.3.1.RELEASE 5.3.3.RELEASE
2.3.0.RELEASE 5.3.2.RELEASE
2.2.13.RELEASE 5.2.8.RELEASE
2.2.12.RELEASE 5.2.8.RELEASE
2.2.11.RELEASE 5.2.7.RELEASE
2.2.10.RELEASE 5.2.6.RELEASE
2.2.9.RELEASE 5.2.5.RELEASE
2.2.8.RELEASE 5.2.5.RELEASE
2.2.7.RELEASE 5.2.4.RELEASE
2.2.6.RELEASE 5.2.2.RELEASE
2.2.5.RELEASE 5.2.2.RELEASE
2.2.4.RELEASE 5.2.1.RELEASE
2.2.3.RELEASE 5.2.1.RELEASE
2.2.2.RELEASE 5.2.1.RELEASE
2.2.1.RELEASE 5.2.1.RELEASE
2.2.0.RELEASE 5.2.0.RELEASE
2.1.18.RELEASE 5.1.13.RELEASE
2.1.17.RELEASE 5.1.12.RELEASE
2.1.16.RELEASE 5.1.11.RELEASE
2.1.15.RELEASE 5.1.11.RELEASE
2.1.14.RELEASE 5.1.10.RELEASE
2.1.13.RELEASE 5.1.8.RELEASE
2.1.12.RELEASE 5.1.7.RELEASE
2.1.11.RELEASE 5.1.7.RELEASE
2.1.10.RELEASE 5.1.7.RELEASE
2.1.9.RELEASE 5.1.6.RELEASE
2.1.8.RELEASE 5.1.6.RELEASE
2.1.7.RELEASE 5.1.6.RELEASE
2.1.6.RELEASE 5.1.5.RELEASE
2.1.5.RELEASE 5.1.5.RELEASE
2.1.4.RELEASE 5.1.5.RELEASE
2.1.3.RELEASE 5.1.4.RELEASE
2.1.2.RELEASE 5.1.3.RELEASE
2.1.1.RELEASE 5.1.2.RELEASE
2.1.0.RELEASE 5.1.1.RELEASE
2.0.9.RELEASE 5.0.12.RELEASE
2.0.8.RELEASE 5.0.11.RELEASE
2.0.7.RELEASE 5.0.10.RELEASE
2.0.6.RELEASE 5.0.9.RELEASE
2.0.5.RELEASE 5.0.8.RELEASE
2.0.4.RELEASE 5.0.7.RELEASE
2.0.3.RELEASE 5.0.6.RELEASE
2.0.2.RELEASE 5.0.5.RELEASE
2.0.1.RELEASE 5.0.4.RELEASE
2.0.0.RELEASE 5.0.3.RELEASE
1.5.22.RELEASE 4.2.13.RELEASE
1.5.21.RELEASE 4.2.12.RELEASE
1.5.20.RELEASE 4.2.12.RELEASE
1.5.19.RELEASE 4.2.11.RELEASE
1.5.18.RELEASE 4.2.10.RELEASE
1.5.17.RELEASE 4.2.9.RELEASE
1.5.16.RELEASE 4.2.8.RELEASE
1.5.15.RELEASE 4.2.7.RELEASE
1.5.14.RELEASE 4.2.7.RELEASE
1.5.13.RELEASE 4.2.6.RELEASE
1.5.12.RELEASE 4.2.5.RELEASE
1.5.11.RELEASE 4.2.5.RELEASE
1.5.10.RELEASE 4.2.4.RELEASE
1.5.9.RELEASE 4.2.3.RELEASE
1.5.8.RELEASE 4.2.3.RELEASE
1.5.7.RELEASE 4.2.3.RELEASE
1.5.6.RELEASE 4.2.3.RELEASE
1.5.5.RELEASE 4.2.3.RELEASE
1.5.4.RELEASE 4.2.3.RELEASE
1.5.3.RELEASE 4.2.2.RELEASE
1.5.2.RELEASE 4.2.2.RELEASE
1.5.1.RELEASE 4.2.1.RELEASE
1.5.0.RELEASE 4.2.1.RELEASE
1.4.7.RELEASE 4.1.4.RELEASE
1.4.6.RELEASE 4.1.4.RELEASE
1.4.5.RELEASE 4.1.4.RELEASE
1.4.4.RELEASE 4.1.4.RELEASE
1.4.3.RELEASE 4.1.4.RELEASE
1.4.2.RELEASE 4.1.3.RELEASE
1.4.1.RELEASE 4.1.3.RELEASE
1.4.0.RELEASE 4.1.1.RELEASE
1.3.8.RELEASE 4.0.4.RELEASE
1.3.7.RELEASE 4.0.4.RELEASE
三、核心组件:
1、Authentication 认证:
Authentication接口就是用来携带认证信息的。认证信息包括用户身份信息,密码,及权限列表等;
2、UsernamePasswordAuthenticationFilter:
账号密码认证过滤器,用于认证用户信息,认证方式是由 AuthenticationManager 接口提供。
3、AuthenticationManager:
认证管理器,是认证相关的核心接口,也是发起认证的出发点。实际业务中可能根据不同的信息进行认证,所以Spring推荐通过实现 AuthenticationManager 接口来自定义自己的认证方式。Spring 提供了一个默认的实现 ProviderManager。
4、ProviderManager:
认证提供者管理器,该类中维护了一个认证提供者列表,只要这个列表中的任何一个认证提供者提供的认证方式认证通过,认证就结束。
5、AuthenticationProvider:
认证提供者,这是一个接口,具体如何认证,就看如何实现该接口。Spring Security 提供了 DaoAuthenticationProvider 实现该接口,这个类就是使用数据库中数据进行认证。
6、UserDetailsService:
根据用户名获取用户详细信息
7、UserDetails:
用户的详细信息,主要用于登录认证。
8、SecurityContextHolder:
是最基本的对象,它负责存储当前 SecurityContext 信息。SecurityContextHolder默认使用 ThreadLocal 来存储认证信息,意味着这是一种与线程绑定的策略。在Web场景下的使用Spring Security,在用户登录时自动绑定认证信息到当前线程,在用户退出时,自动清除当前线程的认证信息。
9、SecurityContext:
负责存储认证通过的用户信息(Authentication对象),保存着当前用户是什么,是否已经通过认证,拥有哪些权限等等。
10、AuthenticationSuccessHandler:
主要用于认证成功后的处理,比如返回页面或者数据。
11、AuthenticationFailureHandler:
主要用于认证失败后的处理,比如返回页面或者数据。
12、AccessDecisionManager:
主要用于实现权限,决定请求是否具有访问的权限。
13、AccessDeniedHandler:
主要用于无权访问时的处理