认证鉴权框架SpringSecurity-5--权限管理篇

上面两篇我们重点介绍了如何在代码上集成springSecurity,同时完成登录认证和token认证的过程。我们直到springSecurity处理能帮我们完成认证外,还可以帮助我们完成权限校验的工作,这篇我们来重点介绍下springSecurity是如何实现鉴权的。

一、springSecurity鉴权原理

在 Spring Security 中,权限控制可以通过多种方式进行,包括配置类中的 HttpSecurity 配置和方法级别的注解(如 @PreAuthorize、@PostAuthorize、@Secured 等)。

(1)、FilterSecurityInterceptor过滤器

Spring Security提供了一个核心鉴权过滤器FilterSecurityInterceptor。
FilterSecurityInterceptor主要负责 HttpSecurity 配置中的权限规则校验,如果用户请求URL 资源和配置种校验口可以放行,则通过。FilterSecurityInterceptor本身不直接处理方法级别的注解。

(2)、安全注解

springSecurity是一组过滤器链,当所有过滤器执行完成后,请求就会放行到具体的接口上。
接口上可以通过添加安全注解的方式,更细粒度的控制权限,如(@PreAuthorize、@Secured 等)。如果方法级别的注解不允许访问,请求也将被拒绝。注解由MethodSecurityInterceptor处理实现。

(3)、总结

1、请求到达:
用户发送请求到某个 URL(例如 /product1)。
2、优先HttpSecurity 配置检查:
Spring Security 会首先根据 HttpSecurity 配置进行权限检查。
如果 HttpSecurity 配置中不允许访问该 URL,请求将被拒绝,不会到达控制器方法。
3、控制器方法的注解检查:
如果 HttpSecurity 配置允许访问该 URL,请求将继续到达控制器方法。在控制器方法调用之前,Spring Security 会检查方法级别的注解(如 @PreAuthorize、@Secured 等)。如果方法级别的注解不允许访问,请求也将被拒绝,即使 HttpSecurity 配置允许访问了也不行。

二、鉴权的实现

1、基于核心配置类的鉴权

(1)、httpSecurity中设置鉴权规则

指定匹配的接口或资源,需要角色,权限还是ip等才可以访问。
在这里插入图片描述

(2)、webSecurity设置放行白名单

在这里插入图片描述

2、基于方法注解鉴权

(1)、开启注解鉴权

需要在配置类中开启注解鉴权
在这里插入图片描述

(2)、接口上添加鉴权注解
(1)、@PreAuthorize

注解在接口执行前被校验,校验失败会抛出异常。一般是校验权限用的最多的注解。

常用的参数包含如下:

1hasAuthority(String)
判断用户是否具有特定权限,相当于配置的
http.authorizeRequests().antMatchers(/main1.html”).hasAuthority(“admin”)

2hasAnyAuthority(String)
判断用户具备给定权限中某一个,就允许访问,相当于配置
http.authorizeRequests().antMatchers(/admin/read”).hasAnyAuthority(“xxx”,“xxx”)

3hasRole(String)
判断用户具备给定角色就允许访问,否则出现403,相当于配置的
http.authorizeRequests().antMatchers(/admin/read”).hasRole(“ROLE_管理员”)

4、注意:
hasRole与hasAuthority的区别:hasRole的值会添加ROLE_开头进行判断,而hasAuthority不会
(2)、@PostAuthorize

注解会在接口执行完成后校验,校验失败会抛出异常。

代码示例:

@GetMapping("/admin")
    @PreAuthorize("hasAuthority('p2')")  //拥有p2权限才可以访问
    public String printAdmin(){
        System.out.println("hello admin");
        return "admin";
    }

    @GetMapping("/user")
    @PreAuthorize("hasAnyRole('USER')")   // 拥有任何一个角色会执行
    public String printUser(){
        System.out.println("hello user");
        return "user";
    }

    @GetMapping("/admin1")
    @PostAuthorize("returnObject.owner == 'admin1'")  // 返回属性等于admin1时放行
    public SomeObject printAdmin1(){
        System.out.println("hello admin1");
        return new SomeObject("admin1");
    }
	
	
	@Secured("ROLE_ADMIN")  //  具有 ROLE_ADMIN 角色的用户才能调用此方法
    public void adminOnlyMethod() {
        // 只有具有 ROLE_ADMIN 角色的用户才能调用此方法
    }

    @PreAuthorize("#id == authentication.principal.id")  // 入参id和认证的用户id相同时
    public void getUserById(String id) {
        // 只有当请求的用户ID与当前认证用户ID相同时,才能调用此方法
    }

3、自定义鉴权方法

这个比较灵活,比较推荐使用。自定义校验方法,需要注入spring容器,使用@PreAuthorize指定自定义的这个校验方法。

示例代码:
在这里插入图片描述

学海无涯苦作舟!!!

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

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

相关文章

RK3588开发板Android12-SDK更新通知

迅为RK3588开发板Android12 SDK升级至RK的android-12.1-mid-rkr14版本 内核版本:升级至 5.10.160 版本,提供更好兼容性和性能。 rkbin 版本:支持最新的 1.17 版本 bin 和 1.46 版本的 bl31。

stm32教程:OLED屏显示字母、汉字、图片工程讲解

早上好啊,大佬们,今天带来的是我们 stm32系列的第一个外设——OLED,相信大家对于OLED都不陌生了吧,这个可以说每一个项目里的必需品了,单片机离不开OLED就像西方离不开耶路撒冷。 在生活中,我们见到的OLED的…

力扣 LeetCode 28. 找出字符串中第一个匹配项的下标(Day4:字符串)

解题思路: KMP算法 需要先求得最长相等前后缀,并记录在next数组中,也就是前缀表,前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。 next[ j - 1 ] 记录了 …

我与Linux的爱恋:进程间通信 匿名管道

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:Linux的学习 文章目录 匿名管道pipe 匿名管道 匿名管道(Anonymous Pipes)是Unix和类Unix操作系统中的一种通信机制,用于在两个进程之间传递数据。匿名…

Java之JDBC,Maven,MYBatis

前言 就是用来操作数据库的 1.JDBC快速入门 注意在使用前一定要导入jar包 在模块那里新建目录,新建lib,粘贴复制jar包,我这个jar设置的是模块有效 package test1017;import java.sql.Connection; import java.sql.DriverManager; import…

基于Matlab的碎纸片的自动拼接复原技术

碎纸片的自动拼接复原技术 摘要:破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。目前发现对碎纸片的拼接大部分由人工完成,准确率较高,但耗费大量人力财力及时间,效率很低。随着计算机技术的…

STM32 设计的较为复杂的物联网项目,包括智能家居控制系统,涵盖了硬件和软件的详细设计。

使用 STM32 设计的较为复杂的物联网项目,包括智能家居控制系统,涵盖了硬件和软件的详细设计。 一、硬件设计 微控制器:选择 STM32F4 系列微控制器,如 STM32F407ZGT6,具有高性能和丰富的外设资源。 传感器模块&#x…

1.7 JS性能优化

从输入url到页面加载完成都做了些什么 输入 URL - 资源定位符 http://www.zhaowa.com - http 协议 域名解析 https://www.zhaowa.com > ip 1. 切HOST? > 浏览器缓存映射、系统、路由、运营商、根服务器 2. 实际的静态文件存放? 大流量 > 多个…

LPDDR4芯片学习(四)——DDR Training

一、ZQ Calibration DDR 学习时间 (Part B - 6):DRAM ZQ 校正 - 知乎 (zhihu.com) 从原理上解释什么是DDR的ZQ校准? - 知乎 (zhihu.com) LPDDR4的训练(training)和校准(calibration)--ZQ校准(Calibration)_wonder_coole-腾讯云开发者社区 01 ZQ校准的…

pycharm分支提交操作

一、Pycharm拉取Git远程仓库代码 1、点击VCS > Get from Version Control 2、输入git的url,选择自己的项目路径 3、点击Clone,就拉取成功了 默认签出分支为main 选择develop签出即可进行开发工作 二、创建分支(非必要可以不使用&#xf…

鸿蒙实战:页面跳转

文章目录 1. 实战概述2. 实现步骤2.1 创建项目2.2 准备图片素材2.3 编写首页代码2.4 创建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 实战概述:本实战通过ArkUI框架,在鸿蒙系统上开发了一个简单的两页面应用。首页显示问候语和“下一页”按钮&…

IDEA部署AI代写插件

前言 Hello大家好,当下是AI盛行的时代,好多好多东西在AI大模型的趋势下都变得非常的简单。 比如之前想画一幅风景画得先去采风,然后写实什么的,现在你只需描述出你想要的效果AI就能够根据你的描述在几分钟之内画出一幅你想要的风景…

深入理解 Spark 中的 Shuffle

Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…

常用在汽车PKE无钥匙进入系统的高度集成SOC芯片:CSM2433

CSM2433是一款集成2.4GHz频段发射器、125KHz接收器和8位RISC(精简指令集)MCU的SOC芯片,用在汽车PKE无钥匙进入系统里。 什么是汽车PKE无钥匙进入系统? 无钥匙进入系统具有无钥匙进入并且启动的功能,英文名称是PKE&…

人力资源招聘系统-提升招聘效率与质量的关键工具

在当今这个竞争激烈的商业环境中,企业要想在市场中立于不败之地,关键在于拥有高素质的人才队伍。然而,传统的招聘方式往往效率低下,难以精准匹配企业需求与人才特质,这无疑给企业的发展带来了不小的挑战。 随着科技的飞…

R语言贝叶斯分析:INLA 、MCMC混合模型、生存分析肿瘤临床试验、间歇泉喷发时间数据应用|附数据代码...

全文链接:https://tecdat.cn/?p38273 多模态数据在统计学中并不罕见,常出现在观测数据来自两个或多个潜在群体或总体的情况。混合模型常用于分析这类数据,它利用不同的组件来对数据中的不同群体或总体进行建模。本质上,混合模型是…

算法--解决二叉树遍历问题

第一 实现树的结构 class Node(): # 构造函数,初始化节点对象,包含数据和左右子节点 def __init__(self, dataNone): self.data data # 节点存储的数据 self.left None # 左子节点,默认为None self.rig…

华为eNSP:MSTP

一、什么是MSTP? 1、MSTP是IEEE 802.1S中定义的生成树协议,MSTP兼容STP和RSTP,既可以快速收敛,也提供了数据转发的多个冗余路径,在数据转发过程中实现VLAN数据的负载均衡。 2、MSTP可以将一个或多个VLAN映射到一个Inst…

从零到一:利用 AI 开发 iOS App 《震感》的编程之旅

在网上看到一篇关于使用AI开发的编程经历,分享给大家 作者是如何在没有 iOS 开发经验的情况下,借助 AI(如 Claude 3 模型)成功开发并发布《震感》iOS 应用。 正文开始 2022 年 11 月,ChatGPT 诞生并迅速引发全球关注。…

C++__day1

1、思维导图 2、如果登录失败&#xff0c;提示用户登录失败信息&#xff0c;并且提示错误几次&#xff0c;且重新输入&#xff1b;如果输入错误三次&#xff0c;则退出系统 #include <iostream> using namespace std;int main() {string id , pswd;string user"admi…