SpringSecurity登录和校验流程简述

认证: 验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户
授权: 经过认证后判断当前用户是否有权限进行某个操作

一、入门案例实现

搭建springboot工程后,创建启动类和Controller,引入SpringSecurity依赖
尝试访问Controller接口就会自动跳转到SpringSecurity的默认登录界面
输入用户名是user,密码会在控制台输出

SpringSecurity完整流程

原理是一个过滤器链,内部提供了各种功能的过滤器

下面看看入门案例的过滤器链
在这里插入图片描述

UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请

ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和
AuthenticationException 。
FilterSecurityInterceptor:负责权限校验的过滤器。

整体流程概述

在这里插入图片描述

验证用户名和密码正确性

实现UserDetailsService接口重写其中的loadUserByUsername方法,
从数据库查询用户名和密码,查询成功就返回一个UserDetails对象(因为重写的这个方法需要返回这个对象)

实现这个方法后就可以访问接口就会通过这个方式进行登录校验,
如果要测试,需要往用户表中写入用户数据,并且如果你想让用户的密码是明文存储,需要在密码前加{noop}

在这里插入图片描述

需要拦截那些接口

设置SpringSecurity拦截除了登陆接口的一系列接口,继承WebSecurityConfigurerAdapter类,然后重写其中的 configure方法

在这里插入图片描述

自定义LoginService接口

该方法会默认执行第一步的登录校验方法,看是否能够校验成功,校验成功自然也就会返回对象,获取到id以及用户信息然后生成token并且将token返回给前端
在这里插入图片描述

经过前面的三步,已经实现了拦截除登陆接口的所有方法,并且实现了登陆接口的逻辑
其中实现UserDetailsService接口重写其中的loadUserByUsername方法来定义如何检验密码
通过在SpringSecurity配置类的configure方法指定需要拦截的方法
实现登陆接口,就能保证当访问没有被拦截的登陆方法就能根据需要生成token,供给后续SpringSecurity拦截的方法判断是否有访问权限

过滤器

这一步的目的是为了访问其他接口的时候需要校验是否有token 也就是是否已经登录
过滤器会获取请求头中的token,对token进行解析获取其中的userId,然后根据这个userid去redis获取对应的LoginUser对象,然后封装Authentication对象存入SecurityContextHolder(可以后续登出的时候获取到用户信息)
然后在配置类中通过http.addFilterBefore(jwtAuthenticationTokenFilter将token校验过滤器添加到过滤器链中。到此就实现了登陆接口进行校验密码生成token,其他接口访问前需要校验token
该方法需要继承OncePerRequestFilter类重写其中的doFilterInternal方法

在这里插入图片描述

在这里插入图片描述

登出接口

获取SecurityContextHolder中的认证信息,删除redis中对应的数据即可。
在这里插入图片描述
到这一步一个基本的登陆功能就实现了,能够实现登录接口进行登录校验,其他接口进行token校验

授权

授权基本流程

使用默认的FilterSecurityInterceptor来进行权限校验。在
FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。
所以我们在项目中只需要把当前登录用户的权限信息也存入Authentication。
然后设置我们的资源所需要的权限即可。

注解来指定对应的资源所需的权

首先需要先开启相关配置。

@EnableGlobalMethodSecurity(prePostEnabled = true)

在对应的资源使用@PreAuthorize注解,表示访问该资源需要test权限
在这里插入图片描述

从数据库查询权限信息

RBAC权限模型
基于角色的权限控制(具体应该是用户关联角色,角色关联权限)
所以可以在UserDetailsServiceImpl中去调用mapper的方法查询权限信息封装到LoginUser对象中即可,之后经过权限过滤器就可以校验权限了。
下面这段代码实现了封装权限信息到LoginUser

List<String> permissionKeyList =pper.selectPermsByUserId(user.getId());
return new LoginUser(user,permissionKeyList);
  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security登录验证流程主要包括以下几个步骤: 1. 用户在客户端(如浏览器)输入用户名和密码提交登录请求。 2. 服务器端接收到登录请求后,将请求交给Spring Security进行处理。 3. Spring Security会调用配置好的AuthenticationManager进行身份验证。 4. AuthenticationManager会调用配置好的AuthenticationProvider进行身份认证。 5. AuthenticationProvider会根据用户提供的用户名和密码查询数据库或其他存储方式,获取用户的详细信息(如密码、角色、权限等)。 6. 如果用户信息验证成功,则AuthenticationProvider会返回一个Authentication对象,其中包含了用户的详细信息。 7. AuthenticationManager将Authentication对象返回给Spring Security进行后续处理。 8. 如果身份验证成功,则Spring Security会在服务器端建立一个SecurityContext对象,并将Authentication对象存储在其中。 9. 服务器端会生成一个Session ID并返回给客户端,同时将SecurityContext对象保存在服务器端的Session中,以便后续的请求能够使用该Session ID进行访问。 10. 登录成功后,客户端可以携带Session ID进行后续访问,服务器端会根据Session ID获取对应的SecurityContext对象,并使用其中的Authentication对象进行身份验证和权限控制。 以上就是Spring Security登录验证流程。在实际开发中,我们需要根据具体的业务需求和安全策略,对相关的配置进行调整和优化,以确保系统的安全性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值