首页 > 其他分享 >SpringSecurity入门

SpringSecurity入门

时间:2024-08-03 19:28:02浏览次数:16  
标签:SpringSecurity 入门 登录 用户 认证 Authentication 权限

SpringSecurity

1、简介

Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。

一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单。

记住几个类:

  • WebSecurityConfigurerAdapter:自定义策略
  • AuthenticationManagerBuilder:自定义策略
  • @EnableWebSecurity:开启WebSecurity模式

Spring Security的两个主要目标是进行认证和授权(访问控制)。

认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户

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

而认证和授权也是SpringSecurity作为安全框架的核心功能。

2、快速入门

2.1、准备工作

​ 首先要搭建一个简单的SpringBoot工程

1、添加依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

2、创建Controller

@RestController
public class HelloController {
    
    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }
}

3、引入SpringSecurity依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

必须依赖后我们在尝试去访问之前的接口就会自动跳转到一个SpringSecurity的默认登录页面,默认用户名是user,密码会输出在控制台,必须登录之后才能对接口进行访问

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、认证

3.1、登录校验流程

在这里插入图片描述

3.2、原理初探

3.2.1、SpringSecurity完整流程

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

在这里插入图片描述

图中只展示了核心过滤器

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

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

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

3.2.2、认证流程详解在这里插入图片描述

概念:

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

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

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

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

  • 登录
    1. 自定义登录接口
      • 调用ProviderManager的方法进行认证,如果认证通过生成jwt
      • 把用户信息存入redis中
    2. 自定义UserDetailsService
      • 在这个实现类中去查询数据库
  • 校验
    1. 定义jwt认证过滤器
      • 获取token
      • 解析token获取其中的userid
      • 从redis中获取用户信息
      • 存入SecurityContextHolder中

4、授权

4.1、权限系统的作用

例如一个学校图书馆的管理系统,如果是普通学生登录就能看到借书还书相关的功能,不可能让他看到并且去使用添加书籍信息,删除书籍信息等功能。但是如果是一个图书馆管理员的账号登录了,应该就能看到并使用添加书籍信息,删除书籍信息等功能。

总结起来就是不同的用户可以使用不同的功能。这就是权限系统要去实现的效果。

我们不能只依赖前端去判断用户的权限来选择显示哪些菜单哪些按钮。因为如果只是这样,如果有人知道了对应功能的接口地址就可以不通过前端,直接去发送请求来实现相关功能操作。

所以我们还需要在后台进行用户权限的判断,判断当前用户是否有相应的权限,必须具有所需权限才能进行相应的操作。

4.2、授权基本流程

在SpringSecurity中,会使用默认的FilterSecurityInterceptor来进行权限校验。在FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。

所以我们在项目中只需要把当前登录用户的权限信息也存入Authentication。

然后设置我们的资源所需要的权限即可。

eptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。

所以我们在项目中只需要把当前登录用户的权限信息也存入Authentication。

然后设置我们的资源所需要的权限即可。

标签:SpringSecurity,入门,登录,用户,认证,Authentication,权限
From: https://blog.csdn.net/qq_62892403/article/details/140895410

相关文章

  • 文件系统 FTP Ubuntu 安装入门介绍
    文件服务系列文件存储服务系统(FileStorageServiceSystem)-00-文件服务器是什么?为什么需要?文件存储服务系统(FileStorageServiceSystem)-01-常见的文件协议介绍文件系统FTPUbuntu安装入门介绍文件存储服务系统(FileStorageServiceSystem)-02-SFTP协议介绍分布式文件服......
  • C++入门基础
    1.C++的第一个程序当然C++有⼀套自己的输入输出,严格说C++版本的helloworld应该是这样写的。 2.命名空间2.1namespace(命名空间)的价值在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名......
  • MySQL 入门知识详解
    MySQL入门知识详解在学习MySQL的过程中,初学者需要掌握一些基本概念、常用操作和设计原则。本文将详细讲解这些知识点,并通过具体示例帮助你更好地理解。1.基本概念数据库数据库是一个用来存储和组织化数据的容器。在MySQL中,一个数据库包含多个表。每个数据库通常代表......
  • python 爬虫入门实战——爬取维基百科“百科全书”词条页面内链
    1.简述本次爬取维基百科“百科全书”词条页面内链,仅发送一次请求,获取一个html页面,同时不包含应对反爬虫的知识,仅包含最基础的网页爬取、数据清洗、存储为csv文件。爬取网址url为“https://zh.wikipedia.org/wiki/百科全书”,爬取内容为该页面所有内链及内链标识(下图蓝......
  • 区块链入门基础课:《Nethereum教程》零基础玩转以太坊开发(三)合约状态
    今天我们要讨论的是如何与智能合约进行交互,获取合约状态。下面的示例将会详细讲解如何与合约进行交互,及一些概念性的解释,有需要的朋友们可以收藏一下。一:概念解释在下面示例之前呢,我先解释下为什么需要调用合约状态,以及合约状态对开发而言有什么作用。实时的了解合约状......
  • ONNXRuntime: 深度学习模型入门学习简介
    目录ONNXRuntime的作用主要功能跨平台支持性能优化易于集成如何使用ONNXRuntimeONNXRuntime的优缺点优点缺点应用领域1.自然语言处理(NLP)2.计算机视觉(CV)3.语音识别和处理4.推荐系统5.医疗健康6.金融科技(FinTech)具体应用案例微软产品与服......
  • Day16_1--JSP了解学习之EL表达式语言入门教程
    JSP(JavaServerPages)是一个用于生成动态网页的技术。EL(ExpressionLanguage)是JSP中的一种表达式语言,用于简化JSP页面中的Java代码,使其更易于书写和阅读。下面是对JSPEL表达式语言的简要介绍。1.什么是EL?EL(表达式语言)是JSP2.0引入的一种语言,它提供了一种简单的方法来访......
  • 使用SpringBoot+Vue3来实现前后端登录注册功能(新手入门,带你一步一步实现)
    目录一.所用技术栈:二.前端创建工程: 1.使用elementplus展开前端页面格式布局:2.基于Vue3的使用来实现登录与注册:(1)定义数据模型:(2):model绑定表单:(3)表单数据校验:①定义表单校验规则:②给表单绑定校验规则:(4)前端注册功能开发: ①创建request.js请求工具:②创建user.js来调用......
  • 【大数据开发语言Scala的入门教程】
    ......
  • STM32入门教程:自动驾驶
    在开始编写代码案例之前,首先需要了解一些基本概念和原理。自动驾驶是指车辆利用各种传感器、控制系统和算法来实现无人驾驶的功能。在实际应用中,常用的传感器有摄像头、激光雷达、超声波传感器等。而控制系统则负责对传感器数据进行分析和处理,并生成相应的控制指令来驱动车辆......