本文来说下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安全表达式介绍相关推荐

  1. Spring Security源码分析十三:Spring Security 基于表达式的权限控制

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring I ...

  2. Spring 中的切点表达式介绍

    Spring 中的切点表达式介绍 翻译原文链接 Introduction to Pointcut Expressions in Spring 1. 概述 在本教程中,我们将讨论 Spring AOP ...

  3. Spring Security 与 OAuth2 介绍

    个人 OAuth2 全部文章 Spring Security 与 OAuth2(介绍):https://www.jianshu.com/p/68f22f9a00ee Spring Security 与 ...

  4. Spring AOP 切点 Pointcut 表达式介绍与使用

    一.前言 面向切面编程 AOP 是一种常见的编程思想,是面向对象编程的一种补充,AOP 框架通过修改源代码,将处理逻辑编织到指定的业务模块中 常见的处理比如:在方执行法前进行校验,在方法执行后进行日志 ...

  5. Quartz中的时间表达式介绍和常用表达式

    本文转载自:https://www.cnblogs.com/xielong/p/6043318.html Quartz.NET是一个开源的作业调度框架,是 OpenSymphony 的 Quartz ...

  6. QlExpress表达式介绍(一)

    QLExpress 规则引擎介绍 一个轻量级的类java语法规则引擎,作为一个嵌入式规则引擎在业务系统中使用.让业务规则定义简便而不失灵活.让业务人员就可以定义业务规则.支持标准的JAVA语法,还可以 ...

  7. 定时任务 Cron表达式介绍

    一.前言 在公司项目上日志输出看到了定时任务,之前在学习Linux的时候有过了解定时任务,但是不太深入,这里再来学习一波,同时做个笔记. 定时任务:字面意思就是在某个时间所处理的任务.这个可以通过设置 ...

  8. Python3中lambda表达式介绍

    Python3中的lambda表达式或lambda函数是匿名函数(anonymous function),意味着该函数没有名称.def关键字用于在Python3中创建一个普通函数,类似地,lambda ...

  9. EL表达式介绍(1)

    1. 产生背景: 在MVC体系结构中,JSP页面只是用来显示数据,但JSP脚本中的表达式功能不够强大,它不能直接对隐式对象中某对象的属性进行显示,需要配合 scriptlet才能显示数据,很是麻烦,如 ...

最新文章

  1. Unity3D时间顺序与功能
  2. 八数码问题——双向广度优先搜索解决
  3. hash和history两种模式的区别+SpringBoot的特定配置
  4. 使用report 打印category 03的IBASE hierarchy
  5. 在 .NET 6 Preview 3 ASP.NET Core 更新
  6. 揭秘鸿蒙生态背后的DevOps实践
  7. ResourceDictionary主题资源替换(二) :编译期间,替换主题资源
  8. python将json数据集转成voc xml文件
  9. iOS - OC NSTimeZone 时区
  10. 小爱mini改aux立体声_拆解报告:Redmi小爱音箱Play
  11. win的反义词_英语近反义词辨析
  12. python 录制网易云登陆_Github获8300星!用Python开发的一个命令行的网易云音乐
  13. 【CSS】537- 认真介绍 CSS 原理
  14. ps中如何把图片变白底
  15. CentOS安装XenServer Tools
  16. 【原创】领导力文化-译稿
  17. 血与荣耀(第四章-命令的镣铐)
  18. 小白日志——扫灰、加内存条、装系统自己动手丰衣足食
  19. ARM体系结构与编程学习(四)
  20. TiDB 作为 MySQL Slave 实现实时数据同步

热门文章

  1. IBM服务器,SQLEXPRESS 服务问题
  2. POJ 2431 Expedition 优先队列
  3. 小例子学习C#扩展方法
  4. Chrome Beta for MacLinux正式发布下载
  5. C#窗体间的数据传值(转)
  6. vmware虚拟机的tomcat启动以后,主机无法访问
  7. Python——rrdtool模块的安装
  8. 警惕cocos2d-x Win32下资源命名大小写
  9. 学android开发,入门语言JAVA知识点
  10. 如何在内部 Stash 服务器上添加 hook