• SpringSecurity入门


    一、概述

            SpringSecurity是基于Spring的一个安全管理框架,他提供一般Web项目所需要的认证授权功能。
            认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户

            授权:经过认证后判断当前用户是否有权限进行某个操作

    引入SpringSecurity:

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-securityartifactId>
    4. dependency>

    二、认证

    2.1 登录校验流程

            实际的前后端分离项目中,我们的整个登录校验流程如下所示,其核心是使用token令牌对客户进行认证。

    2.2 认证原理 

            SpringSecurity的原理其实就是一个过滤器链内部包含了提供各种功能的过滤器。如下所示:

             上图只展示了核心过滤器,其它的非核心过滤器并没有在图中展示。上图中所示的核心过滤器功能如下:

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

            ExceptionTranslationFilter: 处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。

            FilterSecurityInterceptor: 负责权限校验的过滤器。

     2.3 认证流程详解

     概念速查:

            Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息

            AuthenticationManager接口:定义了认证Authentication的方法

            UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的方法。

            UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回。然后将这些信息封装到Authentication对象中

    认证流程:

    1、传入用户名和密码

    2、UsernamePasswordAuthenticationFilter会把用户名和密码封装成Authentication对象

    3、然后又再调用AuthenticationManager接口中的authenticate()方法进行认证,在AuthenticationManager接口的实现类ProviderManager中又调用了重写的authenticate()方法进行认证。抽象类AbstractUserDetailsAuthenticationProvider中重写了authenticate()方法

    4、AbstractUserDetailsAuthenticationProvider的authenticate()方法中调用了抽象方法retrieveUser()方法

    5、DaoAuthenticationProvider在重写方法retrieveUser()里调用了loadUserByUsername()方法

    6、loadUserByUsername()方法会返回UserDetails对象,认证成功逐一返回上一层

    2.5 前后端登录思路

    登录:

    1. 自定义登录接口(实现AbstractAuthenticationProcessingFilter接口
    2. 调用ProviderManager的方法,然后进一步调用DaoAuthenticationProvider方法进行认证,
    3. 自定义UserDetailsService,并在其LoadUserByUsername方法中查询数据库,
    4. 将查询数据库的结果返回到DaoAuthenticationProvider方法,并通过PasswordEncoder进行密码校验,如果认证通过生成jwt把用户信息存入redis中,
    5. 最终将生成的token令牌传输给前端。

    校验:

    1. 定义Jwt认证过滤器:

                    获取token

                    解析token获取其中的userid

                    从redis中获取用户信息

  • 相关阅读:
    2023年第九届数维杯国际大学生数学建模挑战赛
    pytorch激活函数
    基于大规模测量和多任务深度学习的电子鼻系统目标识别、浓度预测和状态判断
    java项目失败直接报Disconnected from server
    虚拟环境导致的段错误
    R语言主成分分析可视化(颜值高,很详细)
    Redis 性能影响因素分析
    【Filament】基于物理的光照(PBR)
    [4G/5G/6G专题基础-157]: 无线数据承载DRB与无线信令承载SRB
    黑马JVM总结(二十二)
  • 原文地址:https://blog.csdn.net/sssxlxwbwz/article/details/126108842