当前位置:   article > 正文

SpringSecurity登录和校验流程简述_springsecurity登录流程

springsecurity登录流程

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

一、入门案例实现

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

SpringSecurity完整流程

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

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

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

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

整体流程概述

在这里插入图片描述

验证用户名和密码正确性

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

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

在这里插入图片描述

需要拦截那些接口

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

在这里插入图片描述

自定义LoginService接口

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

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

过滤器

这一步的目的是为了访问其他接口的时候需要校验是否有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)
  • 1

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

从数据库查询权限信息

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

List<String> permissionKeyList =pper.selectPermsByUserId(user.getId());
return new LoginUser(user,permissionKeyList);
  • 1
  • 2
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号