iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Spring Security基于注解的接口角色访问控制怎么实现
  • 931
分享到

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

2023-06-16 17:06:14 931人浏览 薄情痞子
摘要

本文小编为大家详细介绍“spring Security基于注解的接口角色访问控制怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Security基于注解的接口角色访问控制怎么实现”文章能帮助大家解决疑惑,下面跟着小编的

本文小编为大家详细介绍“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;              boolean securedEnabled() default false;              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<String> 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基于注解的接口角色访问控制怎么实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Spring Security基于注解的接口角色访问控制怎么实现

本文链接: https://www.lsjlt.com/news/284516.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Security基于注解的接口角色访问控制怎么实现
    本文小编为大家详细介绍“Spring Security基于注解的接口角色访问控制怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Security基于注解的接口角色访问控制怎么实现”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-06-16
  • SpringSecurity实现基于角色的访问控制框架
    目录说明Spring Security与Shiro的区别简单使用登录校验流程引入Security设置用户名和密码使用配置类过滤规则授权方式WEB授权方法授权顺序优先级登出跨域认证失败...
    99+
    2023-05-17
    Spring Security访问控制框架 Spring Security访问控制
  • 基于ABP框架实现RBAC(角色访问控制)
    在业务系统需求规划过程中,通常对于诸如组织机构、用户和角色等这种基础功能,通常是将这部分功能规划到通用子域中,这也说明了,对于这部分功能来讲,是系统的基石,整个业务体系是建立于这部分...
    99+
    2024-04-02
  • Spring Security权限控制的接口怎么实现
    本篇内容主要讲解“Spring Security权限控制的接口怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Security权限控制的接口怎么实现”吧!...
    99+
    2023-07-05
  • Spring Security实现基于RBAC的权限表达式动态访问控制的操作方法
    目录资源权限表达式Spring Security中的实现MethodSecurityExpressionHandler思路以及实现配置和使用昨天有个粉丝加了我,问我如何实现类似shi...
    99+
    2024-04-02
  • 怎么基于JWT实现接口的授权访问
    本篇内容主要讲解“怎么基于JWT实现接口的授权访问”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么基于JWT实现接口的授权访问”吧! 什么是JWTJWT(JSON Web Token...
    99+
    2023-06-29
  • spring基于注解配置实现事务控制操作
    目录spring注解配置实现事务控制1、导入相关依赖2、创建spring配置类3、创建JdbcConfig数据源配置类4、创建TransactionConfig事务配置类5、创建jd...
    99+
    2024-04-02
  • 如何基于JWT实现接口的授权访问详解
    目录 什么是JWTJWT的结构HeaderPayloadSignature解码后的JWTJWT是怎样工作的在JAVA里使用JWT引入依赖JWTService生成JWT解码J...
    99+
    2024-04-02
  • Spring Security中粒度超细的权限控制怎么实现
    这篇文章主要讲解了“Spring Security中粒度超细的权限控制怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Security中粒度超细的权限控制怎么实现”吧!1...
    99+
    2023-06-19
  • AOP Redis自定义注解实现细粒度接口IP访问限制
    目录系列说明实现步骤一、引入依赖二、写注解三、写逻辑(注解环绕)1. 添加注解2. 注入 RedisTemplate3. 定义方法4. 实现方法5. 开启spring自动装配四、测试...
    99+
    2022-11-13
    AOP Redis 接口IP访问限制 AOP Redis
  • PHP中基于注解的路由解析和动态控制器加载实现方式
    随着Web应用程序的复杂性不断增加,路由管理和控制器的加载成为了开发过程中一个重要的环节。传统的路由解析和控制器加载方式需要手动配置路由规则和控制器类,而且需要频繁的更新和维护,这在大型应用中会变得非常繁琐和低效。为了解决这个问题,可以借助...
    99+
    2023-10-21
    路由解析 注解 动态控制器加载
  • C语言怎么实现基于控制台的电子时钟
    这篇文章主要介绍“C语言怎么实现基于控制台的电子时钟”,在日常操作中,相信很多人在C语言怎么实现基于控制台的电子时钟问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言怎么实现基于控制台的电子时钟”的疑惑有所...
    99+
    2023-06-30
  • MySQL基于SSL安全连接的主从复制怎么实现
    本文小编为大家详细介绍“MySQL基于SSL安全连接的主从复制怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL基于SSL安全连接的主从复制怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。生...
    99+
    2023-07-05
  • laravel怎么实现上传图片的接口并建立软链接访问
    这篇文章主要介绍“laravel怎么实现上传图片的接口并建立软链接访问”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“laravel怎么实现上传图片的接口并建立软链接访问”文章能帮助大家解决问题。我们...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作