Spring Security @PreAuthorize注解

@PreAuthorize 注解在 Spring Security 中提供了一种声明式的方法,可以在您的 Spring Boot 应用中添加方法级别的安全检查。本教程将引导您设置并有效使用 @PreAuthorize,确保用户只能在具有特定角色或权限的情况下调用 REST API。

什么是 @PreAuthorize?

@PreAuthorize 是 Spring Security 的一个注解,用于指定在方法调用前应评估的表达式,以确定调用者是否有权执行该方法。

将 Spring Security 添加到项目中

确保您的项目中包含 Spring Security。对于 Maven,将以下依赖项添加到 pom.xml 文件中:

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

对于 Gradle,将以下内容添加到 build.gradle 文件中:

implementation 'org.springframework.boot:spring-boot-starter-security'

启用方法级安全

要在 Spring Boot 应用的 Rest Controller 类中对特定方法应用 Spring Security,必须启用方法级安全。为此,您需要使用 @EnableMethodSecurity 注解。

@Configuration
@EnableMethodSecurity
public class SpringSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers(HttpMethod.GET, "/api/user").hasRole("USER")
                .requestMatchers(HttpMethod.GET, "/api/admin").hasRole("ADMIN")
                .anyRequest().authenticated()
            )
            .httpBasic(Customizer.withDefaults());
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails ramesh = User.builder()
            .username("ramesh")
            .password(passwordEncoder().encode("password"))
            .roles("USER")
            .build();

        UserDetails admin = User.builder()
            .username("admin")
            .password(passwordEncoder().encode("admin"))
            .roles("ADMIN")
            .build();

        return new InMemoryUserDetailsManager(ramesh, admin);
    }
}

@EnableMethodSecurity 是一个 Spring 注解,用于在 Spring 应用中启用方法级安全。使用此注解后,Spring 将为包含安全方法的类创建代理,并在调用这些方法时拦截以检查调用者是否具有执行方法所需的权限。

此注解与其他注解(如 @PreAuthorize@PostAuthorize@Secured@RolesAllowed)一起工作,这些注解用于指定方法的访问控制规则。例如,您可以使用 @PreAuthorize 指定只有具有特定角色或权限的用户才能调用某个方法;或者使用 @PostAuthorize 指定方法只返回调用者有权查看的数据。

使用 @PreAuthorize 注解保护 REST API

以下代码展示了如何使用 Spring Security 进行基于角色的 RESTful 端点授权。

@RestController
@RequestMapping("/api/")
public class AdminController {

    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/admin")
    public ResponseEntity<String> helloAdmin() {
        return ResponseEntity.ok("Hello Admin");
    }

    @PreAuthorize("hasRole('USER')")
    @GetMapping("/user")
    public ResponseEntity<String> helloUser() {
        return ResponseEntity.ok("Hello User");
    }
}
  • @PreAuthorize("hasRole('ADMIN')"): 应用于 helloAdmin() 方法,表示只有具有 ‘ADMIN’ 角色的用户才能访问此端点。
  • @PreAuthorize("hasRole('USER')"): 应用于 helloUser() 方法,限制只有具有 ‘USER’ 角色的用户才能访问。

总结

本教程介绍了如何使用 Spring 方法级安全和 @PreAuthorize 注解来保护 RestController 方法。通过这些步骤,您可以确保只有具有适当角色或权限的用户才能访问特定的 REST API。

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

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

相关文章

Leecode刷题C语言之统计不是特殊数字的数字数量

执行结果:通过 执行用时和内存消耗如下&#xff1a; bool isPrime(int n){if(n<2){return false;}for(int i2;i*i<n;i){if(n%i0){return false;}}return true; } int nonSpecialCount(int l, int r) {int psqrt(l);int q sqrt(r);int len r-l1;for(int i p; i <q;…

影响电阻可靠性的因素

一、影响电阻可靠性的因素&#xff1a; 影响电阻可靠性的因素有温度系数、额定功率&#xff0c;最大工作电压、固有噪声和电压系数 &#xff08;一&#xff09;温度系数 电阻的温度系数表示当温度改变1摄氏度时&#xff0c;电阻阻值的相对变化&#xff0c;单位为ppm/C.电阻温度…

Typora-PicGo-OSS对象存储

Typora-PicGo-对象存储OSS 问题描述&#xff1a; 上次做完Gitee图床配置后&#xff0c;今天发现图床突然不能使用了&#xff0c;直到我查找到Gitee仓库变成私有后才发现做的图床被封禁了当前仓库因涉嫌外链滥用(RAW)&#xff0c;不支持设置为公开仓库&#xff0c;就导致我的笔…

ESP-KeyBoard:基于 ESP32-S3 的三模客制化机械键盘

概述 在这个充满挑战与机遇的数字化时代&#xff0c;键盘已经成为我们日常学习、工作、娱乐生活必不可少的设备。而在众多键盘中&#xff0c;机械键盘&#xff0c;以其独特的触感、清脆的敲击音和经久耐用的特性&#xff0c;已经成为众多游戏玩家和电子工程师的首选。本文将为…

nohup java -jar supporterSys.jar --spring.profiles.active=prod

文章目录 1、ps -ef | grep java2、kill 13713、ps -ef | grep java4、nohup java -jar supporterSys.jar --spring.profiles.activeprod &5、ps -ef | grep java1. 启动方式进程 1371进程 19994 2. 主要区别3. 可能的原因4. 建议 1、ps -ef | grep java rootshipper:~# p…

大公司如何实现打印机共享的?如何对打印机进行管控或者工号登录后进行打印?异地打印机共享的如何实现可以帮助用户在不同地理位置使用同一台打印机完成打印任务?

大公司如何实现打印机共享的&#xff1f;如何对打印机进行管控或者工号登录后进行打印&#xff1f;异地打印机共享的如何实现可以帮助用户在不同地理位置使用同一台打印机完成打印任务&#xff1f; 如果在局域网内&#xff0c;可以不需要进行二次开发&#xff0c;通过对打印机进…

数字反向输出

数字反向输出 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 小明听到广播里的数字后&#xff0c;总喜欢反着念给妈妈听。请聪明的你将小明听到的数字反向输出。 输入 输入为一个整型的四位数n 输出 …

Vue页面不显示也不报错是怎么回事?如何解决?

在使用Vue.js进行前端开发时&#xff0c;有时会遇到一种令人困惑的情况:页面既不显示任何内容&#xff0c;控制台也不报错。这种情况往往让开发者摸不着头脑&#xff0c;但不必过分担心&#xff0c;通过一系列的排查和调试步骤&#xff0c;我们可以找到问题的根源并解决它。 本…

利用 GitHub 和 Hexo 搭建个人博客【保姆教程】

利用 GitHub 和 Hexo 搭建个人博客 利用 GitHub 和 Hexo 搭建个人博客一、前言二、准备工作&#xff08;一&#xff09;安装 Node.js 和 Git&#xff08;二&#xff09;注册 GitHub 账号 三、安装 Hexo&#xff08;一&#xff09;创建博客目录&#xff08;二&#xff09;安装 H…

C#开发基础之借用dotnet CLI命令行参数的设计了解命令行构建用法

前言 在C#开发中&#xff0c;命令行参数是一种重要的机制&#xff0c;用于在程序启动时向应用程序传递配置或指令。无论是构建CLI工具还是配置化启动的桌面程序&#xff0c;掌握命令行参数的用法可以帮助我们设计更灵活的应用程序。 本文将详细介绍C#中命令行参数的基本用法、…

【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录

背景 Jetbrain IDE 支持生成 Test 类&#xff0c;其中选择JUnit5 和 JUnit&#xff0c;但是感觉这不是标准的单元测试&#xff0c;因为接口命名吧。 差异对比 两者生成的单测API名称同原API&#xff0c;没加test前缀的。使用差异主要表现在&#xff1a; setUp &#xff06; …

网页中调用系统的EXE文件,如打开QQ

遇到一个实际的问题&#xff0c;需要在网页中打开本地的某个工业软件。 通过点击exe文件就可以调用到程序。 比如双击qq的exe就可以启动qq的程序。 那么问题就变成了如何加载exe程序呢&#xff1f; 可以通过Java的 Process process Runtime.getRuntime().exec(command);通过…

FME教程:实现按属性字段合并图斑,同时合并属性字段值,对合并的属性值同步进行去重处理的案例思路方法

目录 一、实现效果 二、实现过程 1.读取数据 2.融合图斑 3.合并属性字段值&#xff0c;并去重 4.属性字段值排序、整理 5.输出成果 6.模板的使用 三、总结 今天介绍使用FME实现按属性合并图斑&#xff0c;同时合并属性字段值&#xff0c;并对合并的属性值同步进行去重…

ant-design-vue中table组件多列排序

antD中table组件多列排序 使用前注意实现效果图实现的功能点及相关代码1. 默认按某几个字段排序2. 点击排序按钮可同时对多个字段进行排序3. 点击重置按钮可恢复默认排序状态。 功能实现完整的关键代码 使用前注意 先要确认你使用的antD版本是否支持多列排序&#xff0c;我这里…

【LeetCode热题100】栈

这道题一共记录了关于栈的5道题目&#xff1a;删除字符串中所有相邻重复项、比较含退格的字符串、基本计算器II、字符串解码、验证栈序列。 class Solution { public:string removeDuplicates(string s) {string ret;for(auto c : s){if(ret.size() 0 || c ! ret.back()) ret …

IText创建加盖公章的pdf文件并生成压缩文件

第一、前言 此前已在文章&#xff1a;Java使用IText根据pdf模板创建pdf文件介绍了Itex的基本使用技巧&#xff0c;本篇以一个案例为基础&#xff0c;主要介绍IText根据pdf模板填充生成pdf文件&#xff0c;并生成压缩文件。 第二、案例 以下面pdf模板为例&#xff0c;生成一个p…

C语言——数组逐元素操作练习

定义一个能容纳10个元素的整形数组a&#xff0c;从键盘读取9个整数存放到前9个数组元素中。 一. 从键盘读取一个整数n和位置p(0<p<8)&#xff0c;插入n到数组a中&#xff0c;插入位置&#xff1a;下标p。要求插入点及后续的数组元素都要后移动。 代码如下&#xff1a; …

“iOS profile文件与私钥证书文件不匹配”总结打ipa包出现的问题

目录 文件和证书未加载或特殊字符问题 证书过期或Profile文件错误 确认开发者证书和私钥是否匹配 创建证书选择错误问题 申请苹果 AppId时勾选服务不全问题 ​总结 在上线ios平台的时候&#xff0c;在Hbuilder中打包遇见了问题&#xff0c;生成ipa文件时候&#xff0c;一…

网络安全之内网安全

下面给出了应对企业内网安全挑战的10种策略。这10种策略即是内网的防御策略&#xff0c;同时也是一个提高大型企业网络安全的策略。 1、注意内网安全与网络边界安全的不同 内网安全的威胁不同于网络边界的威胁。网络边界安全技术防范来自Internet上的攻击&#xff0c;主要是防…

项目总结模版

测试过程记录文档模版 我们经常测试经常需要做项目总结&#xff0c;所以小编这边就整理了一套项目总结模版&#xff0c;希望能够帮助到大家。 一、需求描述 对应指标&#xff1a;记录需求做的价值&#xff0c;用来评估后续项目上线后是否满足预期结果 1、需求文档 上传相关…