security安全表达式介绍
本文来说下security安全表达式
文章目录
- 概述
- hasRole, hasAnyRole
- hasAuthority, hasAnyAuthority
- 全部允许,全部拒绝
- isAnonymous, isRememberMe, isAuthenticated, isFullyAuthenticated
- 主体,身份验证
- hasPermission API
概述
让我们开始看安全表达式
- 有角色,有任何角色
- hasAuthority , hasAnyAuthority
- 全部允许,全部拒绝
- isAnonymous , isRememberMe , isAuthenticated , isFullyAuthenticated
- 主体,认证
- 拥有权限
现在让我们详细介绍其中的每一个。
hasRole, hasAnyRole
让我们看一下这个例子:
@Override
protected void configure(final HttpSecurity http) throws Exception {....antMatchers("/auth/admin/*").hasRole("ADMIN").antMatchers("/auth/*").hasAnyRole("ADMIN","USER")...
}
在此示例中,我们指定对以/auth/开头的所有链接的访问权限仅限于以角色USER或角色ADMIN登录的用户。此外,要访问以/auth/admin/开头的链接,我们需要在系统中具有ADMIN角色。
hasAuthority, hasAnyAuthority
Spring 中的角色和权限是相似的。
主要区别在于,角色具有特殊的语义——从 Spring Security 4 开始,任何与角色相关的方法都会自动添加“ ROLE_ ”前缀(如果它还没有)。
所以hasAuthority(‘ROLE_ADMIN’)类似于hasRole(‘ADMIN’)因为’ ROLE_ '前缀是自动添加的。
但是使用权限的好处是我们根本不必使用ROLE_前缀。
这是我们定义具有特定权限的用户的快速示例:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user1").password(encoder().encode("user1Pass")).authorities("USER").and().withUser("admin").password(encoder().encode("adminPass")).authorities("ADMIN");
}
然后我们当然可以使用这些权限表达式:
@Override
protected void configure(final HttpSecurity http) throws Exception {....antMatchers("/auth/admin/*").hasAuthority("ADMIN").antMatchers("/auth/*").hasAnyAuthority("ADMIN", "USER")...
}
正如我们所看到的 - 我们在这里根本没有提到角色。此外,从 Spring 5 开始,我们需要一个 PasswordEncoder bean:
@Bean
public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
}
全部允许,全部拒绝
这两个注释也很简单。我们可能会允许访问我们服务中的某些 URL,或者我们可能会拒绝访问。
让我们看一下这个例子:
...
.antMatchers("/*").permitAll()
...
使用此配置,我们将授权所有用户(匿名和登录)访问以“/”开头的页面(例如,我们的主页)。
我们还可以拒绝访问我们的整个 URL 空间:
...
.antMatchers("/*").denyAll()
...
isAnonymous, isRememberMe, isAuthenticated, isFullyAuthenticated
在本小节中,我们关注与用户登录状态相关的表达式。让我们从没有登录我们页面的用户开始。通过在 Java 配置中指定以下内容,我们允许所有未经授权的用户访问我们的主页:
...
.antMatchers("/*").anonymous()
...
如果我们想保护每个使用它的人都需要登录的网站,我们需要使用isAuthenticated()方法:
...
.antMatchers("/*").authenticated()
...
此外,我们还有两个额外的表达式,isRememberMe()和isFullyAuthenticated()。通过使用 cookie,Spring 启用了记住我的功能,因此无需每次都登录系统。您可以在此处阅读有关“记住我”的更多信息。
为了向仅通过记住我功能登录的用户提供访问权限,我们可以使用:
...
.antMatchers("/*").rememberMe()
...
最后,即使用户已经登录,我们服务的某些部分也要求用户再次进行身份验证。例如,用户想要更改设置或付款信息;在系统的更敏感区域要求手动身份验证当然是一种很好的做法。
为此,我们可以指定isFullyAuthenticated(),如果用户不是匿名用户或记住我的用户,则返回true:
...
.antMatchers("/*").fullyAuthenticated()
...
主体,身份验证
这些表达式允许分别从SecurityContext访问代表当前授权(或匿名)用户的主体对象和当前Authentication对象。
例如,我们可以使用principal加载用户的电子邮件、头像或登录用户可访问的任何其他数据。
和认证提供了有关的全部信息验证对象,其授予的权限一起。
hasPermission API
此表达式已记录并旨在在表达式系统和 Spring Security 的 ACL 系统之间架起桥梁,允许我们根据抽象权限指定对单个域对象的授权约束。
让我们看一个例子。我们有一项服务,允许与主编合作撰写文章,决定应该发表其他作者提出的哪篇文章。
为了允许使用此类服务,我们可能会创建以下具有访问控制方法的方法:
@PreAuthorize("hasPermission(#articleId, 'isEditor')")
public void acceptArticle(Article article) {…
}
只有经过授权的用户才能调用此方法,并且用户需要在服务中拥有isEditor权限。
security安全表达式介绍相关推荐
- Spring Security源码分析十三:Spring Security 基于表达式的权限控制
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring I ...
- Spring 中的切点表达式介绍
Spring 中的切点表达式介绍 翻译原文链接 Introduction to Pointcut Expressions in Spring 1. 概述 在本教程中,我们将讨论 Spring AOP ...
- Spring Security 与 OAuth2 介绍
个人 OAuth2 全部文章 Spring Security 与 OAuth2(介绍):https://www.jianshu.com/p/68f22f9a00ee Spring Security 与 ...
- Spring AOP 切点 Pointcut 表达式介绍与使用
一.前言 面向切面编程 AOP 是一种常见的编程思想,是面向对象编程的一种补充,AOP 框架通过修改源代码,将处理逻辑编织到指定的业务模块中 常见的处理比如:在方执行法前进行校验,在方法执行后进行日志 ...
- Quartz中的时间表达式介绍和常用表达式
本文转载自:https://www.cnblogs.com/xielong/p/6043318.html Quartz.NET是一个开源的作业调度框架,是 OpenSymphony 的 Quartz ...
- QlExpress表达式介绍(一)
QLExpress 规则引擎介绍 一个轻量级的类java语法规则引擎,作为一个嵌入式规则引擎在业务系统中使用.让业务规则定义简便而不失灵活.让业务人员就可以定义业务规则.支持标准的JAVA语法,还可以 ...
- 定时任务 Cron表达式介绍
一.前言 在公司项目上日志输出看到了定时任务,之前在学习Linux的时候有过了解定时任务,但是不太深入,这里再来学习一波,同时做个笔记. 定时任务:字面意思就是在某个时间所处理的任务.这个可以通过设置 ...
- Python3中lambda表达式介绍
Python3中的lambda表达式或lambda函数是匿名函数(anonymous function),意味着该函数没有名称.def关键字用于在Python3中创建一个普通函数,类似地,lambda ...
- EL表达式介绍(1)
1. 产生背景: 在MVC体系结构中,JSP页面只是用来显示数据,但JSP脚本中的表达式功能不够强大,它不能直接对隐式对象中某对象的属性进行显示,需要配合 scriptlet才能显示数据,很是麻烦,如 ...
最新文章
- Unity3D时间顺序与功能
- 八数码问题——双向广度优先搜索解决
- hash和history两种模式的区别+SpringBoot的特定配置
- 使用report 打印category 03的IBASE hierarchy
- 在 .NET 6 Preview 3 ASP.NET Core 更新
- 揭秘鸿蒙生态背后的DevOps实践
- ResourceDictionary主题资源替换(二) :编译期间,替换主题资源
- python将json数据集转成voc xml文件
- iOS - OC NSTimeZone		时区
- 小爱mini改aux立体声_拆解报告:Redmi小爱音箱Play
- win的反义词_英语近反义词辨析
- python 录制网易云登陆_Github获8300星!用Python开发的一个命令行的网易云音乐
- 【CSS】537- 认真介绍 CSS 原理
- ps中如何把图片变白底
- CentOS安装XenServer Tools
- 【原创】领导力文化-译稿
- 血与荣耀(第四章-命令的镣铐)
- 小白日志——扫灰、加内存条、装系统自己动手丰衣足食
- ARM体系结构与编程学习(四)
- TiDB 作为 MySQL Slave 实现实时数据同步