SpringSecurity的使用和流程详解(一)

文章目录

  • SpringSecurity
    • 概述
    • 快速上手
      • 搭建项目
      • 引入SpringSecurity依赖
    • SpringSecurity流程
    • 核心功能(一)认证
      • 登录校验流程
      • 认证流程详解
      • 解决问题

SpringSecurity

概述

SpringSecurity是Spring框架中的一个安全管理框架.相比于另一个安全框架Shiro提供了更加强大的功能.

核心功能主要包括:

  1. 认证:验证当前访问系统的是不是存在的用户,并且要具体判断是那个用户
  2. 授权:经过认证后判断当前用户是否有权限进行某个操作
  3. 攻击防护

快速上手

搭建项目

搭建一个简单的Springboot工程

  1. 创建maven工程
    SpringSecurity的使用和流程详解(一)_第1张图片

2.在pom文件中引入springboot依赖

   <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.5.0version>
    parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <optional>trueoptional>
        dependency>
    dependencies>

3.创建启动类

@SpringBootApplication
public class SecurityApplication {
    public static void main(String[] args) {
        SpringApplication.run(SecurityApplication.class);
    }
}

4.创建conroller

package com.lsy.security.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/securityController")
public class SecurityController {
    @RequestMapping("/hello")
    public String  hello(){
        return "hello";
    }
}

测试:查看springboot是否创建成功
在这里插入图片描述

创建springboot项目成功

引入SpringSecurity依赖

<dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-securityartifactId>
        dependency>

引入依赖后,尝试刚才测试的url进行访问就会自动跳转到一个springsecurity的默认登录页面,默认用户名为user,密码在控制台输出
在这里插入图片描述

这时访问测试的url会自动跳转到这个成功页面

SpringSecurity的使用和流程详解(一)_第2张图片

进行登录后,可以正常进行访问其他接口

SpringSecurity还提供了退出功能

SpringSecurity的使用和流程详解(一)_第3张图片

SpringSecurity流程

SpringSecurity的原理就是一个过滤器链,内部包含了各种功能的过滤器

SpringSecurity的使用和流程详解(一)_第4张图片

上图只是展示了核心过滤器,其他的非核心过滤器并没展示

UsernamePasswordAuthenticationFilter:负责处理在登陆界面提交的账号密码的请求.

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

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

核心功能(一)认证

登录校验流程

SpringSecurity的使用和流程详解(一)_第5张图片

  1. 用户输入账号密码提交到后端服务
  2. 在后端中去和数据库连接进行账号密码比较
  3. 如果正确,生成jwt返回前端
  4. 用户成功登录后访问其他接口是需要在请求头中携带roken
  5. 后端获取请求头中的token进行解析获取当前用户,根据当前用户相关信息获取访问的资源,响应到前端

认证流程详解

SpringSecurity的使用和流程详解(一)_第6张图片

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

例如下面代码,就是将用户的账号密码封装到Authentication的一个实现类中

//进行用户认证 将用户账号 密码封装到Authentication实现类中
        UsernamePasswordAuthenticationToken authenticationToken =
                new UsernamePasswordAuthenticationToken(user.getUserName(),user.getPassword());

下图为封装的UsernamePasswordAuthenticationToken类中的信息,用这个类的信息进行认证

SpringSecurity的使用和流程详解(一)_第7张图片

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

例如,下面代码就是将用户信息进行认证

//调用Authenticate方法进行认证
Authentication authenticate = authenticationManager.authenticate(authenticationToken);

如果通过PasswordEncoder对比UserDeTails中的密码和封装的Authentication密码比对正确,就把UserDetails中的权限信息设置到Authentication对象中

注:UserDetails中的密码为通过用户名查询数据库中的密码,Authentication密码为前端返回到后端的密码

下图为密码输入正确返回的authentication对象

SpringSecurity的使用和流程详解(一)_第8张图片

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

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

解决问题

  • 登录

    1. controller层自定义登录接口

    2. 自定义UserDetailService的实现类,在实现类中的loadUserByUsername的方法中去数据库查询

    3. 在service层中调用ProviderManager的方法进行认证,如果认证通过生成jwt

    4. 把用户信息存入redis中

      SpringSecurity的使用和流程详解(一)_第9张图片

  • 校验

    1. 自定义jwt认证过滤器
    2. 获取token
    3. 解析token中的userid
    4. 从redis中获取用户信息
    5. 存入SecurityContextHolder

你可能感兴趣的:(springsecurity,spring,boot)