详细分析SpringSecurity中的@PreAuthorize注解

目录

  • 1. 基本知识
  • 2. 使用方式
    • 2.1 配置类
    • 2.2 直接使用

1. 基本知识

在Java中,@PreAuthorize 是Spring Security框架中的一个注解,用于在方法调用之前对用户的权限进行验证。

允许在方法级别定义访问控制规则,确保只有满足指定条件的用户才能调用该方法

这个注解通常与Spring的AOP(面向切面编程)结合使用,推荐阅读:

  1. Spring框架从入门到学精(全)
  2. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

本身的作用主要如下:

  • 权限控制: 主要用于实现基于方法调用的权限控制,确保只有经过验证的用户才能访问受保护的方法
  • 条件判断: 允许在注解中定义条件表达式,这些表达式决定是否允许方法调用

使用方式:

@PreAuthorize 注解的参数是一个 SpEL(Spring Expression Language)表达式,用于定义权限规则(SpEL支持在表达式中使用各种功能,包括方法调用、条件判断等)

表达式的结果应该是布尔值,如果为 true,则允许方法调用,否则抛出权限异常。
示例:@PreAuthorize("hasRole('ROLE_ADMIN')") 表示只有具有 ROLE_ADMIN 角色的用户可以调用该方法。

除了在方法级别使用 @PreAuthorize,还可以在全局配置中定义方法安全性

通过配置类,指定应用于整个应用程序的全局安全性规则。

2. 使用方式

要么以配置类要么直接使用

2.1 配置类

如果通过配置类的方式:

一般通过继承 WebSecurityConfigurerAdapter 类,通过这个类配置应用程序的安全性

大致的Demo如下:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {// 配置内存中的用户@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password("{noop}password").roles("USER").and().withUser("admin").password("{noop}admin").roles("ADMIN");}// 配置访问控制规则@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasRole("USER").anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}
}

一个是普通用户,一个是管理员。
访问控制规则指定了 /admin/** 路径需要具有 “ADMIN” 角色的用户才能访问
/user/** 路径需要具有 “USER” 角色的用户才能访问
其他请求需要身份验证。登录页面配置为 /login,注销行为允许所有用户。

整体对于配置类来说:

  1. 定义认证规则: 指定用户认证的规则、设置用户的身份验证方式,例如基于内存、数据库、LDAP 等方式,并定义用户的角色和权限

  2. 配置访问控制规则:哪些路径需要身份验证,哪些路径允许匿名访问,哪些路径需要特定的角色或权限

  3. 定制登录和注销行为: 自定义登录页面、处理登录请求的 URL、注销行为等

  4. 启用或禁用特定的安全性功能: 启用或禁用各种安全性功能,例如 CSRF 保护、Session 管理等

2.2 直接使用

内部内置的方法,都在这个类上:

@PreAuthorize 注解内置了一些方便的方法,可以直接在表达式中使用,例如:

  • hasRole('ROLE_NAME') 检查用户是否具有指定角色。
  • hasAnyRole('ROLE1', 'ROLE2') 检查用户是否具有给定角色中的任意一个。
  • hasAuthority('AUTHORITY_NAME') 检查用户是否具有指定权限。
  • hasAnyAuthority('AUTHORITY1', 'AUTHORITY2') 检查用户是否具有给定权限中的任意一个。
  • hasPermission(targetObject, 'permission'): 检查用户是否具有特定对象的特定权限。

如图所示:

在这里插入图片描述
对于上述方法的基本细节操作如下:

方法参数传递:

在表达式中,可以引用方法的参数,例如:
@PreAuthorize("hasPermission(#entity, 'read')") 表示检查用户是否有对给定实体的读权限。

逻辑运算:

表达式支持逻辑运算符,如 and, or, not,允许构建更复杂的权限规则

@PreAuthorize("hasRole('ADMIN') and hasPermission(#entity, 'write')")

大致Demo如下:

import org.springframework.security.access.prepost.PreAuthorize;public class MyService {// 示例1: 仅允许具有ROLE_ADMIN角色的用户调用@PreAuthorize("hasRole('ROLE_ADMIN')")public void adminOperation() {// 实现管理员操作的代码}// 示例2: 允许具有READ权限并且是特定用户的调用@PreAuthorize("hasPermission(#username, 'READ')")public void userOperation(String username) {// 实现用户操作的代码}
}

@PreAuthorize 注解用于控制方法的访问权限。

  • 只有具有ROLE_ADMIN角色的用户才能调用adminOperation方法
  • 只有具有READ权限并且传入的用户名符合条件的用户才能调用userOperation方法

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

boost asio对于epoll关闭套接字顺序

其方法定义在 boost::system::error_code reactive_socket_service_base::close(reactive_socket_service_base::base_implementation_type& impl,boost::system::error_code& ec) {if (is_open(impl)){BOOST_ASIO_HANDLER_OPERATION(("socket", &impl,…

HarmonyOS ArkUI基础学习01

以下涉及的项目源码地址: https://gitee.com/jiangqianghua/harmony-test 更多学习资源资源点我获取 1. 一些常用组件方法 加载resource/base/element/string.json资源 Text($r("app.string.Username_label"))设置颜色 Color.red“#ff00ff”读取资源文…

Java基础 集合(二)List详解

目录 简介 数组与集合的区别如下: 介绍 AbstractList 和 AbstractSequentialList Vector 替代方案 Stack ArrayList LinkedList 前言-与正文无关 生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界…

nodejs+vue+ElementUi家庭美食菜谱分享网站_in9c2

(设计制作有一定的安全性;数据库方面主要采用的是MySQL来进行开发,其特点是稳定性好,数据库存储容量大,处理能力快等优势;服务器采用的是Tomcat服务,能够提供稳固的运行平台,确保系统…

JavaSE-项目小结-IP归属地查询(本地IP地址库)

一、项目介绍 1. 背景 IP地址是网络通信中的重要标识,通过分析IP地址的归属地信息,可以帮助我们了解访问来源、用户行为和网络安全等关键信息。例如应用于网站访问日志分析:通过分析访问日志中的IP地址,了解网站访问者的地理位置分…

TCP 三次握手

三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接…

Duplicate entry ‘2020045-2-1‘ for key ‘index_uid‘ 解决方案

项目场景: 今天小编在工作中编写接口对数据库增加相同的非主键数据的时候,突然出现了这样的一个错误: 下面我来给大家解答这个错误的出现原因以及解决办法。 问题描述 Duplicate entry 2020045-2-1 for key index_uid 这个错误大概意思就是…

企业的多域名SSL证书

多域名SSL证书作为一种加密通信的方式,可以有效保护多个网站的用户数据在传输过程中的安全。不管个人或者企事业单位 都可以申请多域名SSL证书,提高网站的安全性,保护网站数据传输安全。今天就随SSL盾了解多域名SSL证书旗下的企业多域名SSL证…

freertos 源码分析一 list链表数据结构

链表和任务管理是freertos 的核心,先分析链表源码,freertos的链表是双向环形链表,定义与数据结构在list.h中,表项的初始化,插入与删除在list.c中。 数据结构 一、表项数据结构 struct xLIST_ITEM {listFIRST_LIST_IT…

SQL题解之使用union和sum解决同时在线人数问题

现有各直播间的用户访问记录表(live_events)如下,表中每行数据表达的信息为,一个用户何时进入了一个直播间,又在何时离开了该直播间。 user_id (用户id)live_id (直播间id)in_datetime (进入直播间的时间)out_datetim…

MySql调优(一)综述

mysql的优化,除了硬件配置上的升级,还有以下一些方法 一、读写分离 二、表分区 三、拆表分为水平拆表和垂直拆表 见mybatis shardingjdbc篇。 四、SQL优化 1、新增 大数据批量新增 2、删除 delete from 删除语句加where条件,如果是删…

深度解读NVMe计算存储协议-3

在NVMe计算存储架构中,Copy命令用于在不同类型的命名空间之间进行数据复制: Memory Copy命令:定义于SLM(Subsystem Local Memory)命令集,主要用于从非易失性存储命名空间(NVM namespaces&#x…

Jenkins插件安装推荐

Jenkins插件安装推荐 注: 本教程由羞涩梦整理同步发布,本人技术分享站点:blog.hukanfa.com 转发本文请备注原文链接,本文内容整理日期:2024-01-31 csdn 博客名称:五维空间-影子,欢迎关注 说…

ERP系统助力车间生产:班组、设备、工序一网打尽!实现生产全流程可视化!

​随着企业生产规模的扩大和业务复杂性的增加,车间管理在企业运营中的地位日益突出。ERP系统作为企业资源管理的核心平台,为车间管理提供了全面的解决方案。通过合理配置和使用ERP系统的功能模块,企业可以优化生产流程、提高生产效率、确保产…

SOME/IP SD 协议介绍(二) SOME/IP-SD消息格式

SOME/IP-SD消息格式 通用要求 服务发现消息应通过UDP进行支持。准备将服务发现消息传输到TCP中以供将来使用情况。服务发现消息应以SOME/IP头开始,如图1所示: • 服务发现消息应使用0xFFFF的Service-ID(16位)。 • 服务发现消息…

榜单!高阶智驾冲刺10%搭载率,哪些玩家占据自研感知「高地」

得「感知」者,是智能化尤其是智能驾驶技术变革快速演进期的受益者。尤其是对于车企来说,规控自研易,感知自研难。 尤其是过去几年时间,基于机器学习和深度学习,TransformerBEV技术进一步提高对异常行为的预测准确性&am…

CHS_06.2.3.4_2+用信号量实现进程互斥、同步、前驱关系

CHS_06.2.3.4_2用信号量实现进程互斥、同步、前驱关系 知识总览信号量机制实现进程互斥信号量机制实现进程同步信号量机制实现前驱关系 知识回顾 各位同学 大家好 在这个小节中 我们要学习怎么用信号量机制来实现进程的同步互制关系 知识总览 那么 我们之前学习了互斥的几种软…

每日OJ题_算法_前缀和⑦_力扣525. 连续数组

目录 力扣525. 连续数组 解析代码 力扣525. 连续数组 525. 连续数组 难度 中等 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最…

只有一台显示器,如何实现同时显示4台主机的HDMI信号?

HDMI画面分割器概述 HDMI画面分割器属于画面分割器中的一种,因为其信号接口是HDMI接口而得其名,多用于监控、多媒体、视频会议等常见的场景 HDMI画面分割器-图 HDMI画面分割器工作原理 使用硬件方式将多路HDMI信号以多种不同的模式分割显示在同一个显示…

Delphi常用的4种过程函数传递参数的方式

在Delphi中,有多种方式可以传递参数给过程或函数。以下是其中几种常用的方式: 1. 值传递(By Value):将参数的值复制给过程或函数的形参。在过程或函数中对形参的修改不会影响实参的值。 procedure MyProc(a: Integer…