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

SpringSecurity

概述

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

核心功能主要包括:

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

快速上手

搭建项目

搭建一个简单的Springboot工程

  1. 创建maven工程
    在这里插入图片描述

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

   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

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

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

在这里插入图片描述

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

SpringSecurity还提供了退出功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VzilOF0n-1650970971722)(C:\Users\小刘同学\AppData\Roaming\Typora\typora-user-images\image-20220424102618547.png)]

SpringSecurity流程

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M6b4ydTL-1650970971723)(C:\Users\小刘同学\AppData\Roaming\Typora\typora-user-images\image-20220424111706866.png)]

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

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

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

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

核心功能(一)认证

登录校验流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UIWAavau-1650970971724)(C:\Users\小刘同学\AppData\Roaming\Typora\typora-user-images\image-20220424105520175.png)]

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

认证流程详解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I1LIuvnp-1650970971725)(C:\Users\小刘同学\Desktop\SpringSecurity\img\image-20211214151515385.png)]

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

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XImsqzS2-1650970971726)(C:\Users\小刘同学\AppData\Roaming\Typora\typora-user-images\image-20220425142854634.png)]

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

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

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

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sfdKY2B5-1650970971726)(C:\Users\小刘同学\AppData\Roaming\Typora\typora-user-images\image-20220425143016326.png)]

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

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

解决问题

  • 登录

    1. controller层自定义登录接口

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

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

    4. 把用户信息存入redis中

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oYuPgEEl-1650970971727)(C:\Users\小刘同学\Desktop\SpringSecurity\img\image-20211215095331510.png)]

  • 校验

    1. 自定义jwt认证过滤器
    2. 获取token
    3. 解析token中的userid
    4. 从redis中获取用户信息
    5. 存入SecurityContextHolder
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值