java按钮权限控制_详解Spring Security 中的四种权限控制方式

Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Security 提供的方式做授权,也可以自定义授权逻辑。一句话,你想怎么玩都可以!

今天松哥来和大家介绍一下 Spring Security 中四种常见的权限控制方式。

表达式控制 URL 路径权限

表达式控制方法权限

使用过滤注解

动态权限

四种方式,我们分别来看。

1.表达式控制 URL 路径权限

首先我们来看第一种,就是通过表达式控制 URL 路径权限,这种方式松哥在之前的文章中实际上和大家讲过,这里我们再来稍微复习一下。

Spring Security 支持在 URL 和方法权限控制时使用 SpEL 表达式,如果表达式返回值为 true 则表示需要对应的权限,否则表示不需要对应的权限。提供表达式的类是 SecurityExpressionRoot:

2cd23058336fc3925c65a1eea655a1e8.png

可以看到,SecurityExpressionRoot 有两个实现类,表示在应对 URL 权限控制和应对方法权限控制时,分别对 SpEL 所做的拓展,例如在基于 URL 路径做权限控制时,增加了 hasIpAddress 选项。

我们来看下 SecurityExpressionRoot 类中定义的最基本的 SpEL 有哪些:

caff2cdd5ffdf08b3e97dde44e745399.png

可以看到,这些都是该类对应的表达式,这些表达式我来给大家稍微解释下:

表达式

备注

hasRole

用户具备某个角色即可访问资源

hasAnyRole

用户具备多个角色中的任意一个即可访问资源

hasAuthority

类似于 hasRole

hasAnyAuthority

类似于 hasAnyRole

permitAll

统统允许访问

denyAll

统统拒绝访问

isAnonymous

判断是否匿名用户

isAuthenticated

判断是否认证成功

isRememberMe

判断是否通过记住我登录的

isFullyAuthenticated

判断是否用户名/密码登录的

principle

当前用户

authentication

从 SecurityContext 中提取出来的用户对象

这是最基本的,在它的继承类中,还有做一些拓展,我这个我就不重复介绍了。

如果是通过 URL 进行权限控制,那么我们只需要按照如下方式配置即可:

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

.antMatchers("/admin/**").hasRole("admin")

.antMatchers("/user/**").hasAnyRole("admin", "user")

.anyRequest().authenticated()

.and()

...

}

这里表示访问 /admin/** 格式的路径需要 admin 角色,访问 /user/** 格式的路径需要 admin 或者 user 角色。

2.表达式控制方法权限

当然,我们也可以通过在方法上添加注解来控制权限。

在方法上添加注解控制权限,需要我们首先开启注解的使用,在 Spring Security 配置类上添加如下内容:

@Configuration

@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true)

public class SecurityConfig extends WebSecurityConfigurerAdapter {

...

...

}

这个配置开启了三个注解,分别是:

@PreAuthorize:方法执行前进行权限检查

@PostAuthorize:方法执行后进行权限检查

@Secured:类似于 @PreAuthorize

这三个结合 SpEL 之后,用法非常灵活,这里和大家稍微分享几个 Demo。

@Service

public class HelloService {

@PreAuthorize("principal.username.equals('javaboy')")

public String hello() {

return "hello";

}

@PreAuthorize("hasRole('admin')")

public String admin() {

return "admin";

}

@Secured({"ROLE_user"})

public String user() {

return "user";

}

@PreAuthorize("#age>98")

public String getAge(Integer age) {

return String.valueOf(age);

}

}

第一个 hello 方法,注解的约束是,只有当前登录用户名为 javaboy 的用户才可以访问该方法。

第二个 admin 方法,表示访问该方法的用户必须具备 admin 角色。

第三个 user 方法,表示方法该方法的用户必须具备 user 角色,但是注意 user 角色需要加上 ROLE_ 前缀。第四个 getAge 方法,表示访问该方法的 age 参数必须大于 98,否则请求不予通过。

可以看到,这里的表达式还是非常丰富,如果想引用方法的参数,前面加上一个 # 即可,既可以引用基本类型的参数,也可以引用对象参数。

缺省对象除了 principal ,还有 authentication(参考第一小节)。

3.使用过滤注解

Spring Security 中还有两个过滤函数 @PreFilter 和 @PostFilter,可以根据给出的条件,自动移除集合中的元素。

@PostFilter("filterObject.lastIndexOf('2')!=-1")

public List getAllUser() {

List users = new ArrayList<>();

for (int i = 0; i < 10; i++) {

users.add("javaboy:" + i);

}

return users;

}

@PreFilter(filterTarget = "ages",value = "filterObject%2==0")

public void getAllAge(List ages,List users) {

System.out.println("ages = " + ages);

System.out.println("users = " + users);

}

在 getAllUser 方法中,对集合进行过滤,只返回后缀为 2 的元素,filterObject 表示要过滤的元素对象。

在 getAllAge 方法中,由于有两个集合,因此使用 filterTarget 指定过滤对象。

4.动态权限

动态权限主要通过重写拦截器和决策器来实现,这个我在 vhr 的文档中有过详细介绍,大家在公众号【江南一点雨】后台回复 888 可以获取文档,我就不再赘述了。

5.小结

好啦,今天就喝小伙伴们稍微聊了一下 Spring Security 中的授权问题,当然这里还有很多细节,后面松哥再和大家一一细聊。

到此这篇关于详解Spring Security 中的四种权限控制方式的文章就介绍到这了,更多相关Spring Security 权限控制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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

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

相关文章

aws 数据库迁移_AWS Loft的数据库周

aws 数据库迁移这是我的笔记&#xff1a; https://databaseweekoctober2019sf.splashthat.com AWS上的数据库&#xff1a;合适工作的合适工具 在许多此类谈话中&#xff0c;我并没有做过深刻的记录。 我正在关注重点。 PostgreSQL排在MySQL之后。 AWS上8种类型的数据库&…

java异常——异常分类+声明已检查异常+如何抛出异常+自定义异常类

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java异常——异常分类声明已检查异常如何抛出异常自定义异常类 的相关知识&#xff1b; 0.2&#xff09;异常处理的任务&#xff1a; 就是将控制权从错误产生的地方转移给能够处…

quarkus_Quarkus入门

quarkusQuarkus – 一个针对OpenJDK HotSpot和GraalVM量身定制的Kubernetes本机Java堆栈&#xff0c;它是从最佳Java库和标准中精制而成的。 –是一个容器优先的框架&#xff0c;针对快速启动时间和低内存消耗进行了优化。 该框架基于许多流行的Java库构建&#xff0c;并且为构…

java异常——捕获异常+再次抛出异常与异常链

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java异常——捕获异常再次抛出异常与异常链 的相关知识&#xff1b; 【1】捕获异常相关 1.1&#xff09;如果某个异常发生的时候没有再任何地方进行捕获&#xff0c; 那程序就会…

java 类似xamarin_xamarin android如何将Java.Lang.Object类型转成C#类型

问题起源其实这个标题也可以换一个更准确一点&#xff0c;因为我遇到的问题是&#xff1a;xamarin android中的Class继承了Java.Lang.Object &#xff0c;将json序列化成c#类型时发现无法赋值&#xff0c;序列化的格式没问题&#xff0c;但是Class的属性值没有复制成功。xamari…

java异常—— finally 子句+带资源的 try语句

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java异常—— finally 子句带资源的 try语句 的相关知识&#xff1b; 【1】 finally 子句相关 1.1&#xff09;产生资源回收问题&#xff1a;当代码抛出一个异常时&#xff0c; …

jep290涉及jdk版本_JDK 13中的JEP 355文本块

jep290涉及jdk版本JDK 13已于2019年9月17日上线GA&#xff0c; 此处列出了重要的新功能。 新功能之一是“文本块”。 这样可以轻松地编写多行字符串&#xff0c;而不必在拆分为不同行的同时进行串联。 让我们快速了解创建多行字符串的不同方式&#xff1a; String aBlock &q…

java单例注册表_Java单例模式(Singleton)

单例模式主要用于&#xff1a;有一些对象我们只需要一个&#xff0c;比如&#xff1a;线程池、缓存、对话框、处理偏好设置、注册表对象、日志对象以及配置文件对象、数据库连接对象等等。单例模式常用于管理共享资源&#xff0c;例如&#xff1a;数据库连接或者线程池。Java S…

java异常——分析堆栈跟踪元素+使用异常机制的技巧

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java异常——分析堆栈跟踪元素使用异常机制的技巧 的相关知识&#xff1b; 【1】分析堆栈跟踪元素相关 1.1&#xff09;堆栈跟踪&#xff1a; 它是一个方法调用过程的列表&#…

jdk8 npe_JDK 14中更好的NPE消息

jdk8 npe我的2019年3月博客文章“ Java会出现更好的默认NullPointerException消息吗&#xff1f; ”的撰写是为了获得更好的NullPointerException消息的JEP 草案尚未针对特定的JDK版本。 此后&#xff0c;该JEP草案成为JEP 14的 目标 JEP 358&#xff08;“ Helpful NullPointe…

开源相册系统Java_基于JAVA的B/S网络相册管理系统

每天记录学习&#xff0c;每天会有好心情。*^_^*今天和一个朋友共同完成了一个网络相册管理系统项目&#xff0c;我们在开发时选用的框架是SSM(MYECLIPSE)框架。我这个朋友知识有限&#xff0c;只会这个框架&#xff0c;哈哈&#xff0c;都是为了方便他。和往常一样选用简单又便…

java断言——Assertion

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java断言——Assertion 的相关知识&#xff1b; 【1】使用断言 1.1&#xff09;断言机制&#xff1a; 允许在测试期间向代码中插入一些检查语句。 当代码发布时&#xff0c; 这些…

常见的并发模型_两个常见的并发错误

常见的并发模型作为Baeldung的编辑&#xff0c;我很高兴与一位作者一起撰写有关Java通用并发陷阱的文章。 这是一本不错的书&#xff0c;但是假设开发人员具有一定的能力。 我已经看到了几件即时并发失败的事情。 它们很容易添加到代码中&#xff0c;并保证为您提供奇怪的结果…

java 哈希一致算法_一致哈希算法Java实现

一致哈希算法(Consistent Hashing Algorithms)是一个分布式系统中常用的算法。传统的Hash算法当槽位(Slot)增减时&#xff0c;面临所有数据重新部署的问题&#xff0c;而一致哈希算法确可以保证&#xff0c;只需要移动K/n份数据(K为数据总量, n为槽位数量)&#xff0c;且只影响…

java日志——基本日志+高级日志

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java日志——基本日志高级日志 的相关知识&#xff1b; 【1】记录日志 1.1&#xff09;出现的问题和解决方法&#xff1a; 1.1.1&#xff09;出现的问题&#xff1a;在我们调试…

java模式匹配_用Java匹配模式

java模式匹配如果您使用的是Java&#xff0c;那么您很有可能以前已经看过它的模式匹配。 String#matches(String)方法在内部使用Pattern类型&#xff0c;该类型包含更复杂的功能&#xff1a; 通过编译正则表达式来创建Pattern 。 该模式与任何输入字符串匹配&#xff0c;并且可…

java在frame怎么计时_java – 退出jframe时的Swing stop计时器

我有一个特定的任务,我按计划的时间间隔运行.基本上我在JFrame中的Label上显示相机.但是,当我退出JFrame时,应用程序似乎运行.我怎么能阻止它&#xff1f;我已经删除了代码的细节,只是将相关部分留在了public class TaskCLass extends JFrame {JPanel p;JLabel l;Timer timer;p…

java日志——修改日志管理器配置+日志本地化

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java日志——修改日志管理器配置日志本地化 的相关知识&#xff1b; 【1】修改日志管理器配置 1.1&#xff09;可以通过编辑配置文件来修改日志系统的各种属性。 在默认情况下&a…

jpa embedded_JPA @Embeddable和@Embedded

jpa embedded介绍&#xff1a; 作为一个面向对象的开发人员&#xff0c;我们希望避免使用带有大量不相关字段的大型类。 因此&#xff0c;我们可能经常感到有必要使用多个对象来表示JPA实体。 在本快速教程中&#xff0c;我们将学习如何使用JPA或Hibernate中的Embedded和Embed…

jdk内置线程实例_EA问题的JDK14实例

jdk内置线程实例Tagir Valeev最近发布了一条有关即将发布的Java JDK14版本的预览功能的推文&#xff1a; &#xff03;Java14模式匹配将名称隐藏带入了更高的疯狂程度。 在这里&#xff0c;我为FLAG字段添加或删除了final修饰符&#xff0c;该修饰符仅在不可达的if分支中访问。…