Spring Security 优化鉴权注解:自定义鉴权注解的崭新征程

news2024/9/29 13:24:14

文章目录

    • 1. 引言
    • 2. Spring Security基础
      • 2.1 Spring Security概述
      • 2.2 @PreAuthorize注解
    • 3. 自定义鉴权注解的优势
      • 3.1 业务语义更明确
      • 3.2 参数化鉴权更灵活
      • 3.3 可维护性更好
    • 4. 实现自定义鉴权注解
      • 4.1 创建自定义注解
      • 4.2 实现鉴权逻辑
      • 4.3 注册自定义注解和逻辑
      • 4.4 使用自定义注解
    • 5. 拓展:其他自定义鉴权注解场景
    • 6. 总结

在这里插入图片描述

🎉Spring Security 优化鉴权注解:自定义鉴权注解的崭新征程


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:架构设计
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

1. 引言

在Spring Security中,鉴权是保障系统安全的关键环节之一。而Spring Security提供的@PreAuthorize注解是一种常见的鉴权方式,但在实际应用中,我们可能需要更灵活、可维护性更好的鉴权方案。本文将探讨如何通过自定义鉴权注解来优化Spring Security中的鉴权机制,使其更符合实际业务需求,提高代码的可读性和可维护性。在这里插入图片描述

2. Spring Security基础

在深入研究自定义鉴权注解之前,让我们简要回顾一下Spring Security的基础概念和@PreAuthorize注解的使用。

2.1 Spring Security概述

Spring Security是一个功能强大且灵活的安全框架,用于保护Spring应用程序中的资源。它提供了身份验证(Authentication)和授权(Authorization)等安全性功能,可用于Web应用程序和非Web应用程序。

2.2 @PreAuthorize注解

@PreAuthorize是Spring Security提供的一个注解,用于在方法执行前进行权限验证。它的使用方式如下:

@PreAuthorize("hasRole('ROLE_ADMIN')")
public void adminOperation() {
    // 执行需要管理员权限的操作
}

上述代码表示只有拥有ROLE_ADMIN角色的用户才能执行adminOperation方法。虽然@PreAuthorize非常灵活,但在实际应用中,我们可能需要更直观、可维护性更好的鉴权方式。

3. 自定义鉴权注解的优势

自定义鉴权注解是指根据业务需求,在Spring Security基础上创建符合具体场景的鉴权注解。相对于@PreAuthorize,自定义鉴权注解具有以下优势:

3.1 业务语义更明确

自定义鉴权注解可以根据业务场景命名,使得代码更符合业务语义,提高代码的可读性。例如,如果有一个业务场景是需要VIP用户才能访问,可以创建一个名为@VipAccess的自定义注解。

@VipAccess
public void vipOperation() {
    // 执行需要VIP权限的操作
}

3.2 参数化鉴权更灵活

通过自定义鉴权注解,我们可以实现参数化的鉴权,根据方法参数或其他上下文信息来动态决定是否具有权限。这在某些场景下比静态的@PreAuthorize更灵活。

@CustomPermission(role = "ROLE_USER", level = 3)
public void customOperation() {
    // 执行需要特定权限级别的操作
}

3.3 可维护性更好

将鉴权逻辑封装在自定义注解中,使得鉴权逻辑与业务逻辑分离,提高了代码的可维护性。当鉴权逻辑需要调整时,只需修改自定义注解的实现,而不影响业务逻辑。

4. 实现自定义鉴权注解

接下来,让我们通过一个实际的例子来演示如何实现自定义鉴权注解。假设我们有一个场景,只有在特定时间段内才能执行某个操作,我们可以创建一个@AccessDuringOfficeHours注解。

4.1 创建自定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessDuringOfficeHours {
}

上述代码定义了一个名为AccessDuringOfficeHours的自定义注解,它可以用于方法和类上。

4.2 实现鉴权逻辑

import org.springframework.security.access.prepost.PreAuthorize;

import java.lang.annotation.Annotation;
import java.time.LocalTime;

public class AccessDuringOfficeHoursSecurityExpressionRoot extends CustomSecurityExpressionRoot {

    public AccessDuringOfficeHoursSecurityExpressionRoot(Authentication authentication) {
        super(authentication);
    }

    public boolean hasAccessDuringOfficeHours() {
        LocalTime now = LocalTime.now();
        return now.isAfter(LocalTime.of(9, 0)) && now.isBefore(LocalTime.of(18, 0));
    }
}

上述代码继承了CustomSecurityExpressionRoot,并实现了判断是否在办公时间内的逻辑。

4.3 注册自定义注解和逻辑

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;

@Configuration
public class SecurityConfig {

    @Autowired
    private CustomPermissionEvaluator customPermissionEvaluator;

    @Bean
    public MethodSecurityExpressionHandler methodSecurityExpressionHandler() {
        DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
        expressionHandler.setPermissionEvaluator(customPermissionEvaluator);
        expressionHandler.setExpressionParser(new DefaultSpelExpressionParser());
        return expressionHandler;
    }
}

上述代码通过DefaultMethodSecurityExpressionHandler注册了自定义的鉴权逻辑。

4.4 使用自定义注解

@AccessDuringOfficeHours
public void officeHourOperation() {
    // 执行需要在办公时间内操作的逻辑
}

上述代码表示officeHourOperation方法只有在办公时间内才能执行。

5. 拓展:其他自定义鉴权注解场景

通过上述例子,我们可以看到自定义鉴权注解的强大之处。除了上文提到的场景,还有很多其他可能需要自定义鉴权注解的情况,比如:

  • 特定用户组访问: 创建一个@UserGroupAccess注解,只有属于特定用户组的用户才能访问。
  • 特定请求来源: 创建一个@ValidRequestSource注解,只有来自合法请求来源的请求才能通过。
  • 过期访问: 创建一个@AccessExpired注解,只有在特定时间段之前或之后的请求才能通过。

通过这些自定义注解,我们能够更加直观地表达业务需求,使得代码更清晰,更容易维护。

6. 总结

通过本文的介绍,我们深入探讨了Spring Security中鉴权注解的优化方案,通过自定义鉴权注解实现了更灵活、更具语义化的鉴权方式。通过这种方式,我们能够更好地适应实际业务需求,提高代码的可读性和可维护性。在实际项目中,根据具体业务场景,我们可以创建更多自定义的鉴权注解,从而更好地满足系统安全性的要求。希望通过本文的介绍,读者对Spring Security中自定义鉴权注解的使用有更深入的了解。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

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

相关文章

去掉element-ui的el-table的所有边框+表头+背景颜色

实例: 1.去掉table表头(加上:show-header"false") <el-table:data"tableData":show-header"false"style"width: 100%"> </el-table> 2.去掉table所有边框 ::v-deep .el-table--border th.el-table__cell, ::v-deep .el…

.NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接

Flurl.Http-3.2.4 升级到 4.0.0 版本后&#xff0c;https请求异常&#xff1a;Call failed. The SSL connection could not be established. 如下图&#xff1a; Flurl.Http-3.2.4版本绕过https的代码&#xff0c;对于 Flurl.Http-4.0.0 版本来说方法不再适用&#xff0c;3.2.…

如何定义眼图测试模板

设计眼图模板时所需的参数列举如下&#xff1a; TCLK clock period&#xff0c;时钟周期&#xff1b;TSKEW the difference between the clock and data propagation time&#xff0c;时钟和数据之间的偏斜&#xff0c;默认为0&#xff1b;TJITTER clock data jitter (pea…

代码随想录 Leetcode459. 重复的子字符串(KMP算法)

题目&#xff1a; 代码&#xff08;首刷看解析 KMP算法 2024年1月18日&#xff09;&#xff1a; class Solution { public:void getNext(string& s,vector<int>& next) {int j 0;next[0] j;for (int i 1; i < s.size(); i) {while (j > 0 && s…

leetcode:1736. 替换隐藏数字得到的最晚时间(python3解法)

难度&#xff1a;简单 给你一个字符串 time &#xff0c;格式为 hh:mm&#xff08;小时&#xff1a;分钟&#xff09;&#xff0c;其中某几位数字被隐藏&#xff08;用 ? 表示&#xff09;。 有效的时间为 00:00 到 23:59 之间的所有时间&#xff0c;包括 00:00 和 23:59 。 …

【Qt】安装及环境搭建

概述&#xff1a;1. 搭建《QtCreator快速入门》一书中所使用的Qt版本qt6.2.3 文章目录 1 安装2 环境变量设置 1 安装 先下载下载器&#xff0c;然后在下载器中选择自己需要的版本下载并安装&#xff0c;有点像 LOL 下载器&#xff0c;先下个小的&#xff0c;然后再在这个下载器…

芯品荟 | 酒精测试仪市场调研报告

产品简介 酒精检测仪是一种可以测量人体酒精浓度的电子设备。 它可以通过呼气或血液等方式来检测酒精浓度&#xff0c;被广泛应用于交通安全、职业健康等领域。 酒精检测仪的工作原理&#xff1a; 1、酒精检测仪分为2种&#xff0c;基于化学传感器与基于光学传感器&#xff…

RDMA Scatter Gather List详解

1. 前言 在使用RDMA操作之前&#xff0c;我们需要了解一些RDMA API中的一些需要的值。其中在ibv_send_wr我们需要一个sg_list的数组&#xff0c;sg_list是用来存放ibv_sge元素&#xff0c;那么什么是SGL以及什么是sge呢&#xff1f;对于一个使用RDMA进行开发的程序员来说&#…

Docker(三)使用 Docker 镜像:从仓库获取镜像;管理本地主机上的镜像;介绍镜像实现的基本原理

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 使用 Docker 镜像 在之前的介绍中&#xff0c;我们知道镜像是 Docker 的三大组件之一。 Docker 运行容器前需要本地存在对应的镜像&#x…

牛客周赛 Round 15 解题报告 | 珂学家 | 状态DP构造 + 树形DP

前言 整体评价 这场T3挺有意思的&#xff0c;只会3维状态DP进行构造。不过这题其实是脑筋急转弯&#xff0c;有规律可循。 T4是经典的树形DP&#xff0c;从比赛来看&#xff0c;T3难于T4. A. 游游的整数切割 枚举遍历就行&#xff0c;需要满足前后两段其末尾的元素奇偶一致 …

Docker 与 Linux Cgroups:资源隔离的魔法之旅

这篇文章主要介绍了 Docker 如何利用 Linux 的 Control Groups&#xff08;cgroups&#xff09;实现容器的资源隔离和管理。 最后通过简单 Demo 演示了如何使用 Go 和 cgroups 交互。 如果你对云原生技术充满好奇&#xff0c;想要深入了解更多相关的文章和资讯&#xff0c;欢迎…

Python OpenCV 影像处理:影像二值化

► 前言 本篇将介绍使用OpenCV Python对于图像上的二值化操作&#xff0c;二值化主要用途包括图像分割、物体侦测、文字识别等。这种转换可以帮助检测图像中的物体或特定特征&#xff0c;并提取有用的信息。透过程式码的说明&#xff0c;让各位了解OpenCV Python于图像处理上的…

mysql安装及部署

1.在/usr/local下创建mysql目录 cd /usr/local mkdir /mysql 2.在mysql目录中下载 cd mysql/ wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.34-1.el9.x86_64.rpm-bundle.tar 3.解压 tar xvf mysql-8.0.34-1.el9.x86_64.rpm-bundle.tar 4.安装 dnf localinst…

JS-WebAPIs-元素尺寸与位置(三)

使用场景&#xff1a; 前面案例滚动多少距离&#xff0c;都是我们自己算的&#xff0c;最好是页面滚动到某个元素&#xff0c;就可以做某些事。简单说&#xff0c;就是通过js的方式&#xff0c;得到元素在页面中的位置这样我们可以做&#xff0c;页面滚动到这个位置&#xff0…

137基于matlab的面和线接触的滑块润滑

基于matlab的面和线接触的滑块润滑&#xff0c;基于有限差分法求解面接触滑块润滑的油膜厚度、油膜压力&#xff0c;输出三维可视化结果。程序已调通&#xff0c;可直接运行。 137 matlab油膜压力油膜厚度 (xiaohongshu.com)

商用软件方案的多种交付方式有什么优势?

商用软件方案在交付上&#xff0c;往往存在多种模式&#xff0c;包括SaaS模式、私有化部署、SDK嵌入式等等&#xff0c;SaaS模式讲究一个标准化&#xff0c;旨在最大限度的降低部署成本&#xff0c;但对于一些定制化程度比较高的需求&#xff0c;往往企业仍然需要采用私有化部署…

暴雨信息与英特尔联合发布全球首个全液冷冷板服务器参考设计

科技之家 1 月 19 日消息&#xff0c;据暴雨服务器官方消息&#xff0c;1 月 18 日&#xff0c;暴雨信息与英特尔联合发布全球首个全液冷冷板服务器参考设计&#xff0c;并面向业界开放&#xff0c;推动全液冷冷板解决方案在全球数据中心的大规模部署应用。 基于该参考设计&am…

10个常考的前端手写题,你全都会吗?

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 今天来分享一下10个常见的JavaScript手写功能。 目录 1.实现new 2.call、apply、…

区域入侵检测AI边缘计算智能分析网关V4如何通过ssh进行服务器远程运维

智能分析网关V4是一款高性能、低功耗的AI边缘计算硬件设备&#xff0c;它采用了BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz&#xff0c;并且INT8峰值算力高达17.6Tops&#xff0c;FB32高精度算力达到2.2T&#xff0c;每个摄像头可同时配置3种算法&…

SD-WAN保障服务质量的五大核心功能

基于 MPLS 的传统专用网络极度结构化、僵化&#xff0c;缺乏灵活性和变通性。SD-WAN让传统的MPLS专用网络显得相形见绌。这种创新的网络架构不仅在管理灵活性和成本效益方面取得显著进展&#xff0c;更能够随着业务的扩张和新分支机构的增设而高效扩展。在SD-WAN中&#xff0c;…