Spring Security的开发

文章目录

    • 1,介绍
    • 2, 核心流程
    • 3, 核心原理
      • 3.1 过滤器链机制
      • 3.2 主体
      • 3.3 认证
      • 3.4 授权
      • 3.5 流程图
    • 4, 核心对象
      • 4.1 UserDetailsService 接口
      • 4.2 PasswordEncoder 接口
      • 4.3 hasAuthority方法
      • 4.4 hasAnyAuthority方法
      • 4.5 hasRole方法
      • 4.5 hasAnyRole方法
    • 5, 核心注解
      • 5.1 @PreAuthorize
        • 5.1.1 在启动类上开启注解
        • 5.1.2 在方法上使用注解
      • 5.2 @PostAuthorize
        • 5.2.1 启动类上开启注解
        • 5.2.2 方法上使用注解
      • 5.3 @PostFilter
        • 5.3.1 实体类
        • 5.3.2 在方法上使用注解
        • 5.3.3 访问接口
      • 5.4 @PreFilter
        • 5.4.1 在方法上使用注解
      • 5.5 @Secured
    • 6, 使用步骤
      • 6.1 导入依赖
      • 6.2 创建项目
      • 6.3 测试
      • 6.4 自定义用户名和密码
      • 6.5 More...

1,介绍

Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的 成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方 案。 正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”(或者访问控 制),一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权 (Authorization)两个部分,这两点也是 Spring Security 重要核心功能。

Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之 前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直 是 Shiro 的天下。 相对于 Shiro,在 SSM 中整合 Spring Security 都是比较麻烦的操作,所以,Spring Security 虽然功能比 Shiro 强大,但是使用反而没有 Shiro 多(Shiro 虽然功能没有 Spring Security 多,但是对于大部分项目而言,Shiro 也够用了)。

自从有了 Spring Boot 之后,Spring Boot 对于 Spring Security 提供了自动化配置方 案,可以使用更少的配置来使用 Spring Security。 因此,一般来说,常见的安全管理技术栈的组合是这样的:

• SSM + Shiro
• Spring Boot/Spring Cloud + Spring Security

2, 核心流程

权限的实现方式千千万,又有各种不同的权限模型,然而归结到代码上,无非两种:

  1. 基于 URL 地址的权限处理
  2. 基于方法注解的权限处理

Spring Security主要是从两个方面解决安全性问题:

  1. web请求级别:使用Servlet规范中的过滤器(Filter)保护Web请求并限制URL级别的访问。
  2. 方法调用级别:使用Spring AOP保护方法调用,确保具有适当权限的用户才能访问安全保护的方法(如:@PreAuthorize 注解)。

Spring Security两大重要核心功能:用户认证(Authentication)和用户授权(Authorization)。

  1. 用户认证:验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。
  2. 用户授权:验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,有的用户既能读取,又能修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

3, 核心原理

3.1 过滤器链机制

Spring Security最核心的是过滤器链,也就是一组过滤器(Filter),所有的访问服务的请求都会经过spring security的过滤器,服务的响应也会经过spring security的过滤器再返回给客户端,并且这些过滤器在系统启动时springboot会自动都配置完成。

Spring Security 在基于Servlet应用中,其底层是采用了Filter机制实现了对请求的认证、授权和漏洞防御等功能。
简单来说,可以理解为给Servlet设置一些Filters,这些Filters就构成了一个FilterChain。
每次当请求进来时,首先会被FilterChain中的Filters 依次捕获得到,每个Filter可以对请求进行一些预处理或对响应进行一些后置处理,最后才会到达Servlet。

3.2 主体

英文单词:principal
使用系统的用户或设备或从其他系统远程登录的用户等等。简单说就是谁使用系 统谁就是主体。

3.3 认证

英文单词:authentication
权限管理系统确认一个主体的身份,允许主体进入系统。简单说就是“主体”证 明自己是谁。

3.4 授权

英文单词:authorization
将操作系统的“权力”“授予”“主体”,这样主体就具备了操作系统中特定功 能的能力。所以简单来说,授权就是给用户分配权限。

3.5 流程图

在这里插入图片描述

  1. UsernamePasswordAuthenticationFilter: 用于对/login的POST请求做拦截,校验表单中的用户名和密码。
  2. ExceptionTranslationFilter: 异常过滤器,用来处理在认证授权过程中抛出异常。
  3. FilterSecurityInterceptor:是一个方法级的权限过滤器,位于过滤器链的最底部。

4, 核心对象

4.1 UserDetailsService 接口

若需要从数据库中获取用户名和密码,则需要把查询数据库的过程写在这个接口里。
当什么也没有配置的时候,账号和密码是由 Spring Security 定义生成的。而在实际项目中 账号和密码都是从数据库中查询出来的。 所以我们要通过自定义逻辑控制认证逻辑。
如果需要自定义逻辑时,只需要实现 UserDetailsService 接口即可

4.2 PasswordEncoder 接口

在密码的处理上,需要进行编解码器,该接口实现对密码进行加密。

4.3 hasAuthority方法

判断当前主体是否有指定的权限,有返回true,否则返回false
该方法适用于只拥有一个权限的用户。
1. 修改配置类
在配置类中设置当前主体具有怎样的权限才能访问。

@Override
protected void configure(HttpSecurity http) throws Exception {
   
    
    //注销的配置
    http.logout().logoutUrl("/logout") //注销时访问的路径
        .logoutSuccessUrl("/logoutSuccess").permitAll(); //注销成功后访问的路径
    
    //配置没有权限的跳转页面
    http.exceptionHandling().accessDeniedPage("/error.html");
    
    http.formLogin()
        .loginPage("/login.html") //设置自定义登陆页面
        .loginProcessingUrl("/usr/login") //登陆时访问的路径
        .defaultSuccessUrl("/index").permitAll() //登陆成功后跳转的路径
        .and().authorizeRequests()
        .antMatchers("/","/add","/user/login").permitAll() //设置可以直接访问的路径,取消拦截

        //1.hasAuthority方法:当前登陆用户,只有具有admin权限才可以访问这个路径
        .antMatchers("/index").hasAuthority("admin")

        .anyRequest().authenticated()
        .and().csrf().disable()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/468902.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十四、ReadWriteLock

ReadWriteLock 读写锁 又叫排他锁 如果使用互斥锁,一个线程在读,其他线程也不能读也不能写 换成读写锁的时候,读线程是读锁,写线程是写锁,写锁是排他的 在多线程大大提高效率,当一个线程在读的时候&…

MybatisPlus逆向工程

目录 🧂1.前提说明 🍿2.引入依赖 🌭3.使用导入模板 1.前提说明 注意 适用版本:mybatis-plus-generator 3.5.1 以下版本,3.5.1 及以上的请参考 3.5.1以上参考官网:3.5.1以上逆向工程 2.引入依赖 …

用 二层口 实现三层口 IP 通信的一个实现方法

我们一般用 undo portswitch 来将二层口转为三层口,但如果设备不支持的话,那么。。。 一、拓朴图: 二、实现方法: 起一个 vlan x,配置 vlanif地址,然后二层口划分到 vlan x 下,对端做同样的配置…

C语言 实用调试技巧

我们的博客已经更新到了数据结构,但是当我在深耕数据结构时我发现我在C语言是遗漏了一个重要的东西,那就是C语言的使用调试技巧。这篇博客对数据结构非常重要,请大家耐心观看。 1. 什么是bug? 第一次被发现的导致计算机错误的飞蛾…

Centos虚拟机忘记密码;重置虚机密码

虚拟机是一个好用的工具,在本地搭建的虚拟机可以给我们提供测试,但时间长了也会忘记密码;因此这里以centos系统的虚机为例,提供一个重置虚机密码的方法 1.在开机页面按“E”进入编辑模式 进入后长这样: 2.找到ro cras…

Python面向对象——架构设计【2】

练习1:打电话 请使用面向对象思想描述下列情景: 小明使用手机打电话,还有可能使用座机.... class People:def __init__(self,name):self.name namedef call_up(self,tool):print(self.name,end"")tool.call()class Tools:def __init__(self,way):self.wa…

【第十三章】改进神经网络学习方式-其他正则化技术

L1正则化 除了L2正则化之外,还有许多正则化技术。事实上,已经开发出了如此多的技术,以至于我不可能总结它们。在本节中,我简要介绍了三种减少过拟合的其他方法:L1正则化、dropout和人为增加训练集大小。我们不会像之前…

四.流程控制(顺序,分支,循环,嵌套)

c刚刚转过来的记得写在public static void main(String[] args)的花括号里 一.顺序结构 二.分支结构 if ,switch 1.if (条件判断) 2.if else 3.if else if else if ... else(它是一个一个否定来一个个执行判断的 4.s…

Gitee 实战配置

一、Gitee 注册帐号 官网:https://gitee.com点击注册按钮。填写姓名。填写手机号。填写密码。点击立即注册按钮 二、安装GIT获取公钥 1.官网下载git下载地址:https://git-scm.com/download/win 2.安装git,双击运行程序,然后一直下…

Android下的匀速贝塞尔

画世界pro里的画笔功能很炫酷 其画笔配置可以调节流量,密度,色相,饱和度,亮度等。 他的大部分画笔应该是通过一个笔头图片在触摸轨迹上匀速绘制的原理。 这里提供一个匀速贝塞尔的kotlin实现: class EvenBezier {p…

SD卡RAW故障解析与数据恢复全攻略

一、SD卡RAW现象解析 SD卡作为现代电子设备中常见的存储介质,其稳定性和可靠性直接关系到我们日常工作和生活的数据安全。然而,有时我们会遇到SD卡突然变成RAW格式的情况,这通常意味着SD卡的文件系统出现了严重的问题,导致无法正…

Python基础介绍 —— 使用pytest进行测试!

​编辑自动化测试 1319 篇文章62 订阅 订阅专栏 Pytest 是 Python 的一种单元测试框架,与 Python 自带的 unittest 测试框架类似,但是比 unittest 框架使用起来更简洁,效率更高。 Pytest 是一个成熟的全功能的 Python 测试工具,…

在VSCode中怎么配置Python开发环境?真的超简单!

前言:VS Code 里是不包括 Python 的,所以你首先得安装一个 Python。 1、终端运行 Python 安装完 python 之后,我们可以用任何一个文本编辑工具开始写 python 代码,然后在 cmd 中运行代码。 在 VS Code 中,在不安装任…

idea maven 项目融合

背景 :项目A 和项目B 是两个独立的多模块项目,项目A 和项目B ,均为独立的数据源 。其中项目B 有两个数据原。 需要将项目B 以多模块的方式融合进项目A。 解决版本。建立项目C,只含有pom的,空项目,项目A和项…

Springboot 整合Mybatis 实现增删改查(二)

续上篇:Springboot整合Mybatis的详细案例图解分析-CSDN博客 mapper层(StudentMapper) //通过id查询student方法Student searchStudentById(int id);//通过id删除student方法int deleteStudentById(int id);//通过id增加student方法int inser…

文件批量管理利器,一键复制备份安全删除原文件,让文件管理更高效!

在数字化时代,我们每天都在与各种文件打交道,从文档、图片到视频、音频,文件的管理和存储变得越来越重要。然而,手动逐个处理文件不仅繁琐,还容易出错。那么,有没有一种方法可以让我们轻松实现文件的批量管…

如何提高Verilog代码编写水平?

在IC设计端的诸多岗位中,只要提到基础知识和必备技能,就一定少不了Verilog。 按照20年芯片设计老兵的说法“1. 知道module的基本框架。2. 知道怎么写assign,和always块。3. 其他没有了。” 也就是说用VerilogHDL做设计不要追求花架子&#…

鸿蒙开发系列教程(二十五)--样式处理(一)

1、样式属性 参考网址:https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-text-style-0000001427902436-V3 属性方法以 . 链式调用的方式配置系统组件的样式和其他属性 Entry Component struct Index {build() …

由浅到深认识Java语言(1):前提概要

该文章Github地址:https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.c…

linux常用命令指南

什么是Linux命令? Linux命令是在Linux操作系统中用于执行特定任务的命令行工具。它们被用于管理文件和目录、执行程序、配置系统设置等。Linux命令通常由一个命令名称和一些选项或参数组成,并且可以通过命令行界面(CLI)或脚本文件…