Java基础之《spring security》

一、简介

Spring Security是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。
一般来说中大型项目使用Spring Security来做安全框架。小项目用Shiro的比较多,因为相比Spring Security,Shiro的上手更加的简单。
一般Web应用都需要进行认证和授权。
认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户
授权:经过认证后判断当前用户是否有权限进行某个操作
而认证和授权也是Spring Security作为安全框架的核心功能。

二、引入Spring Security

<!-- spring security 安全认证 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

引入依赖后我们再尝试访问之前的接口就会自动跳转到一个Spring Security的默认登录页面,默认用户名是user,密码会输出在控制台。
必须登录之后才能对接口进行访问。

三、认证

1、登录校验流程

(1)前端携带用户名密码访问登录接口
(2)服务器去和数据库中的用户名和密码进行校验
(3)如果正确使用用户名/用户id,生成一个jwt
(4)把jwt响应给前端
(5)前端登录后,访问其他请求需要在请求头中携带token
根据用户名去查询对应的用户及这个用户对应的权限信息,InMemoryUserDetailsManager是在内存中查找(可替换)
把对应的用户信息包括权限信息封装成UserDetails对象
(6)服务器获取请求头中的token进行解析,获取userId
(7)服务器根据用户id获取用户相关信息,如果有权限则允许访问相关资源
(8)访问目标资源,响应结果给前端
(9)响应信息

2、Spring Security完整流程
Spring Security的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。我们可以看看它的核心过滤器。
(1)UsernamePasswordAuthenticationFilter:负责处理我们在登录页面填写了用户名密码后的登录请求。入门案例的认证工作主要由它负责。
(2)ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException。
(3)FilterSecurityInterceptor:负责权限校验的过滤器。

3、认证流程

(1)用户在登录页面提交用户名、密码
(2)封装Authentication对象,这时候最多只有用户名和密码,权限还没有
(3)调用authenticate方法进行认证
(4)调用DaoAuthenticationProvider的authenticate方法进行认证
(5)调用loadUserByUsername方法查询用户
(6)返回UserDetails对象
(7)通过PasswordEncoder对比UserDetails中的密码和Authentication的密码是否正确
(8)如果正确就把UserDetails中的权限信息设置到Authentication对象中
(9)返回Authentication对象
(10)如果上一步返回了Authentication对象就使用SecurityContextHolder.getContext().setAuthentication方法存储该对象。其他过滤器中会通过SecurityContextHolder来获取当前用户信息

4、设计思路
参考一个开源项目的设计:
SysLoginController --> SysLoginService --> authenticationManager.authenticate(authenticationToken),authenticationManager实现类是ProviderManager --> 内部调用provider.authenticate(authentication) --> provider实现类是DaoAuthenticationProvider --> 内部调用this.getUserDetailsService().loadUserByUsername(username) --> 调用自定义类public class UserDetailsServiceImpl implements UserDetailsService,重写的loadUserByUsername方法

校验

猜你喜欢

转载自blog.csdn.net/csj50/article/details/129946574