• 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中获取用户信息

  • 相关阅读:
    java计算机毕业设计微留学学生管理系统源程序+mysql+系统+lw文档+远程调试
    Go语法实现分析之chan、go func、类型转换
    【操作系统】聊聊不可中断进程和僵尸进程
    MyBatis 多对一映射和一对多映射的处理
    《痞子衡嵌入式半月刊》 第 64 期
    Java实现3DES加密解密(DESede/ECB/PKCS5Padding使用)
    JavaScript算法43- 分类求和并作差(leetCode:100103easy)周赛
    pytorch + tensorboard +jupyter
    【Django 03】QuerySet 和 Instance应用
    华为机试(od德科)面试数据算法必备基础知识(java)
  • 原文地址:https://blog.csdn.net/sssxlxwbwz/article/details/126108842