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

文章目录

    • 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 {@Autowiredprivate CustomPermissionEvaluator customPermissionEvaluator;@Beanpublic 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.mzph.cn/news/636796.shtml

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

相关文章

Divisibility Problem-codefordes

题目链接&#xff1a;Problem - A - Codeforces 解题思路&#xff1a; 如果 a 能被 b整除&#xff0c;就不需要进行改变&#xff0c;直接输出0&#xff0c;否则输出((a / b) 1) * b - a&#xff0c;找到最小的能被b整除的数。 下面是c代码&#xff1a; #include<iostrea…

探索JAVA神秘运行机制:揭秘JVM内存区域

目录 1. 前文回顾 2.内存区域的划分 2.1 存放类的方法区 2.2 程序计数器 2.3 Java虚拟机栈 2.4 Java堆内存 2.5 其他内存区域 3. 核心内存区域运行流程 4. 总结 1. 前文回顾 上一篇我们一起探索了Java的整体运行流程&#xff0c;类加载器以及类的加载机制&#xff0…

去了字节跳动,才知道年薪 30w 的测试工程师有这么多?

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

会体言一心文-码代-4202

简明版本 最近感悟就是在“常规赛”中&#xff0c;大部分奇技淫巧远不如官方教程。 我使用大模型工具快一年的时间所积累的经验远不如认真看看官方教程。 官方教程 里面有一点就可以秒99%的工具人&#xff0c;“文心一言7*24小时在线&#xff0c;伴你左右。 ” 结合文心一言…

中仕教育:考上选调生之后能不去吗?选调生和公务员哪个比较好?

选调生&#xff0c;是指经过选拔、培训、考核等一系列程序&#xff0c;选拔出的人才。选调生通常需要在基层锻炼一段时间&#xff0c;然后根据工作表现和能力得到提拔。 考上选调生之后能否不去&#xff0c;有以下两种情况。 1.如果通过选调笔试&#xff0c;但是并未参加后续…

2788.按分隔符拆分字符串

前言 力扣还挺上道&#xff08;bushi&#xff09;&#xff0c;今天第一次写每日一题&#xff0c;给了个简单等级的数组题&#xff0c;我只能说&#xff0c;首战告捷&#xff08;小白的呐喊&#xff09;&#xff0c;看看这每日一题我能坚持一天写出来&#xff0c; ok&#xff…

Javaweb之SpringBootWeb案例员工管理之新增员工的详细解析

SpringBootWeb案例 前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能&#xff0c;还有两个需要实现&#xff1a; 新增员工 修改员工 首先我们先完成"新增员工"的功能开发&#xff0c;再完成"修改员工"的功能开发。而在&q…

Self-RAG:通过自我反思学习检索、生成和批判

论文地址&#xff1a;https://arxiv.org/abs/2310.11511 项目主页&#xff1a;https://selfrag.github.io/ Self-RAG学习检索、生成和批评&#xff0c;以提高 LM 的输出质量和真实性&#xff0c;在六项任务上优于 ChatGPT 和检索增强的 LLama2 Chat。 问题&#xff1a;万能L…

10分钟完成权限系统全流程开发

背景 首先问下chatgpt,权限系统的模型有哪些&#xff1f; 基于上述的结论&#xff0c;我们选择基于角色的访问控制(RBAC)&#xff0c;请从数据库设计、接口文档、代码实现、单元测试四个方面分别详细描述每个部份需要实现的内容。 数据库实现 针对上述的数据库设计部份&#…

格局打开!前端未死,只是要求变高了

本文笔者会从以下几个方面分享&#xff0c;希望能够帮助正在迷茫的前端小伙伴提供一点思路&#xff01; 逛技术博客 不局限框架 全栈工程师兴起 关注前沿 写技术文章 录制前端视频 总结 2024年了&#xff0c;没工作的找到工作了吗&#xff1f;有工作的加薪了吗&#xff1f;加薪…

【高等数学之极限】

一、引言 我们先思考一下&#xff0c;上面三个表达式&#xff0c;是否可以将极限值直接代入求值&#xff0c;我们在计算之前需要先分析一下&#xff0c;如果将极限值代入&#xff0c;那么表达式将会变成什么形式? 经过上面的分析&#xff0c;我们发现第一个式子可以直接带入&a…

浪花 - 主页开发

一、简易版主页 1. 主页展示用户列表 <template><!--推荐用户列表--><van-cardv-for"user in userList":desc"user.profile":title"${user.username}(${user.planetCode})":thumb"user.avatarUrl"><template #…

VUE表单中多个el-upload上传组件共享回调函数解决方案

产品需求界面&#xff1a; 在产品配置页面表单中需要上传多个图片&#xff0c;项目中上传组件采用Element Plus 中的 el-upload&#xff0c;目前问题是每个上传组件都需要实现自己的回调&#xff0c;比如:on-change&#xff0c;采用官方推荐标准代码如下&#xff1a; <el-fo…

java中的时间API

Created: January 19, 2024 2:31 PM 1、旧版时间API的缺点 在java1.0中使用java.utol.Date类表示时间&#xff0c;该类存在很多问题&#xff0c;例如时间零点是1900年1月0日&#xff0c;例如想到表示2024年1月19日就需要如下定义&#xff0c;此外Date也无法表示时间、包含默认…

西瓜书读书笔记整理(十二) —— 第十二章 计算学习理论

第十二章 计算学习理论&#xff08;上&#xff09; 12.1 基础知识12.1.1 什么是计算学习理论&#xff08;computational learning theory&#xff09;12.1.2 什么是独立同分布&#xff08;independent and identically distributed, 简称 i . i . d . i.i.d. i.i.d.&#xff0…

Mysql运维篇(一) 日志类型

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人&#xff0c;如有侵权请留言&#xff0c;我及时删除。 一、mysql相关日志 首先&#xff0c;我们能接触到的&#xff0c;一般我们排查慢查询时&#xff0c;会去看慢查询…

一篇文章带你了解 什么是u(ustd)带你了解他的前世今生

在数字货币的繁荣世界中&#xff0c;USDT无疑是其中一位重要的角色。它的前世今生&#xff0c;是一个从无到有&#xff0c;从小到大&#xff0c;经历了种种波折和争议的故事。 2014年11月下旬&#xff0c;一个名为Realcoin的注册地为马恩岛和香港的公司决定改变自己的名字&…

C和指针课后答案

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 第八章课后答案 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参…

C++参悟:正则表达式库regex(更新中)

正则表达式库regex&#xff08;更新中&#xff09; 一、概述二、快速上手Demo1. 查找字符串2. 匹配字符串3. 替换字符串 三、类关系梳理1. 主类1. basic_regex 2. 算法3. 迭代器4. 异常5. 特征6. 常量1. syntax_option_type2. match_flag_type3. error_type 一、概述 C标准库为…

Halcon基于描述符的模板匹配

Halcon基于描述符的模板匹配 与基于透视形变的模板匹配类似&#xff0c;基于描述符的模板匹配能够在物体处于透视形变的状态下进行匹配&#xff0c;并且已标定和未标定的相机图像都适用。与透视形变不同的是&#xff0c;它的模板不是根据边缘轮廊创建的&#xff0c;而是根据特…