千家信息网

Spring Security基于注解的接口角色访问控制怎么实现

发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,本文小编为大家详细介绍"Spring Security基于注解的接口角色访问控制怎么实现",内容详细,步骤清晰,细节处理妥当,希望这篇"Spring Security基于注解的接口角色访问控制怎么实现
千家信息网最后更新 2025年11月13日Spring Security基于注解的接口角色访问控制怎么实现

本文小编为大家详细介绍"Spring Security基于注解的接口角色访问控制怎么实现",内容详细,步骤清晰,细节处理妥当,希望这篇"Spring Security基于注解的接口角色访问控制怎么实现"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1. 前言

DEMO 获取方式在文末。

2. Spring Security 方法安全

Spring Security 基于注解的安全认证是通过在相关的方法上进行安全注解标记来实现的。

2.1 开启全局方法安全

我们可以在任何 @Configuration实例上使用 @EnableGlobalMethodSecurity 注解来启用全局方法安全注解功能。该注解提供了三种不同的机制来实现同一种功能,所以我们单独开一章进行探讨。

3. @EnableGlobalMethodSecurity 注解

@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)   @Target(value = { java.lang.annotation.ElementType.TYPE })   @Documented   @Import({ GlobalMethodSecuritySelector.class })   @EnableGlobalAuthentication   @Configuration   public @interface EnableGlobalMethodSecurity {       /**        * 基于表达式进行方法访问控制        */       boolean prePostEnabled() default false;       /**        * 基于 @Secured 注解        */       boolean securedEnabled() default false;       /**       * 基于 JSR-250 注解        */       boolean jsr250Enabled() default false;       boolean proxyTargetClass() default false;       int order() default Ordered.LOWEST_PRECEDENCE;   }

@EnableGlobalMethodSecurity 源码中提供了 prePostEnabled 、securedEnabled 和 jsr250Enabled 三种方式。当你开启全局基于注解的方法安全功能时,也就是使用 @EnableGlobalMethodSecurity 注解时我们需要选择使用这三种的一种或者其中几种。我们接下来将分别介绍它们。

4. 使用 prePostEnabled

如果你在 @EnableGlobalMethodSecurity 设置 prePostEnabled 为 true ,则开启了基于表达式的方法安全控制。通过表达式运算结果的布尔值来决定是否可以访问(true 开放, false 拒绝 )。

有时您可能需要执行开启 prePostEnabled 复杂的操作。对于这些实例,您可以扩展 GlobalMethodSecurityConfiguration,确保子类上存在@EnableGlobalMethodSecurity(prePostEnabled = true) 。例如,如果要提供自定义 MethodSecurityExpressionHandler :

@EnableGlobalMethodSecurity(prePostEnabled = true)   public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {       @Override       protected MethodSecurityExpressionHandler createExpressionHandler() {           // ... create and return custom MethodSecurityExpressionHandler ...           return expressionHandler;       }   }

上面示例属于高级操作,一般没有必要。无论是否继承GlobalMethodSecurityConfiguration 都将会开启四个注解。 @PreAuthorize 和 @PostAuthorize 侧重于方法调用的控制;而 @PreFilter 和 @PostFilter 侧重于数据的控制。

4.1 @PreAuthorize

在标记的方法调用之前,通过表达式来计算是否可以授权访问。接下来我来总结以下常用的表达式。

  • 基于 SecurityExpressionOperations 接口的表达式,也就是我们在上一文的 javaConfig 配置。示例: @PreAuthorize("hasRole('ADMIN')") 必须拥有 ROLE_ADMIN 角色。

  • 基于 UserDetails 的表达式,此表达式用以对当前用户的一些额外的限定操作。示例:@PreAuthorize("principal.username.startsWith('Felordcn')") 用户名开头为 Felordcn 的用户才能访问。

  • 基于对入参的 SpEL表达式处理。 示例: @PreAuthorize("#id.equals(principal.username)") 入参 id 必须同当前的用户名相同。

4.2 @PostAuthorize

在标记的方法调用之后,通过表达式来计算是否可以授权访问。该注解是针对 @PreAuthorize 。区别在于先执行方法。而后进行表达式判断。如果方法没有返回值实际上等于开放权限控制;如果有返回值实际的结果是用户操作成功但是得不到响应。

4.3 @PreFilter

基于方法入参相关的表达式,对入参进行过滤。分页慎用!该过程发生在接口接收参数之前。 入参必须为 java.util.Collection 且支持 remove(Object) 的参数。如果有多个集合需要通过 filterTarget=<参数名> 来指定过滤的集合。内置保留名称 filterObject 作为集合元素的操作名来进行评估过滤。

样例:

// 入参为Collection ids   测试数据 ["Felordcn","felord","jetty"]  // 过滤掉  felord jetty  为  Felordcn  @PreFilter(value = "filterObject.startsWith('F')",filterTarget = "ids")  // 如果 当前用户持有 ROLE_AD 角色  参数都符合  否则 过滤掉不是 f 开头的     // DEMO 用户不持有 ROLE_AD 角色  故而 集合只剩下 felord  @PreFilter("hasRole('AD') or filterObject.startsWith('f')")

4.4 @PostFilter

和@PreFilter 不同的是, 基于返回值相关的表达式,对返回值进行过滤。分页慎用!该过程发生接口进行数据返回之前。

5. 使用 securedEnabled

如果你在 @EnableGlobalMethodSecurity 设置 securedEnabled 为 true ,就开启了角色注解 @Secured ,该注解功能要简单的多,默认情况下只能基于角色(默认需要带前缀 ROLE_)集合来进行访问控制决策。

该注解的机制是只要其声明的角色集合(value)中包含当前用户持有的任一角色就可以访问。也就是 用户的角色集合和 @Secured 注解的角色集合要存在非空的交集。 不支持使用 SpEL 表达式进行决策。

6. 使用 jsr250Enabled

启用 JSR-250 安全控制注解,这属于 JavaEE 的安全规范(现为 jakarta 项目)。一共有五个安全注解。如果你在 @EnableGlobalMethodSecurity 设置 jsr250Enabled 为 true ,就开启了 JavaEE 安全注解中的以下三个:

  • @DenyAll 拒绝所有的访问

  • @PermitAll 同意所有的访问

  • @RolesAllowed 用法和 5. 中的 @Secured 一样。

读到这里,这篇"Spring Security基于注解的接口角色访问控制怎么实现"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

注解 表达式 方法 角色 安全 控制 用户 接口 功能 示例 也就是 全局 参数 数据 文章 标记 不同 接下来 内容 实例 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 sql数据库创建表主键 sql配置镜像数据库 邮件服务器搭建要多长时间 联想电脑检查代理服务器和防火墙 软件开发中遇到最坑的事 命令行查看所有数据库 中科软件开发公司 网络安全威胁与风险材料 税务软件开发带来的经济效益 网络安全有哪些小方向 软件开发需要学哪几门课 软件开发公司情景剧 台州本地软件开发质量 网络安全大脑是什么 郴州学计算机软件开发培训机构 如何查看本机的数据库地址 海口国产信创服务器生产厂商 服务器坏了需要重新配置吗 灰色服务器地址 怀旧服rp服务器体验 河南龙昌网络安全技术服务 网络安全方案说明 福建网络安全和信息化大会 数据库的技术文档包括 厦门软件开发停车收费 网络安全工作主题责任落实 广州网络安全学院 网络安全有哪些小方向 手机图片保存到服务器 杨浦区推广软件开发供应商有哪些
0