security安全表达式介绍

本文来说下security安全表达式


概述

让我们开始看安全表达式

  • 有角色,有任何角色
  • 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权限。

@PreAuthorize("hasAnyAuthority")是Spring Security框架中的一个注解,用于在访问接口时对当前登录用户所拥有的角色进行权限鉴定。该注解可以检查当前用户是否具有指定的权限,如果具有权限则允许访问接口,否则返回403错误。 具体的鉴权过程如下: 1. 首先,该注解会调用hasAnyAuthority方法。 2. 在hasAnyAuthority方法中,会调用hasAnyAuthorityName方法。该方法用于检查传入的权限字符串是否在当前用户的权限集合中。 3. 在hasAnyAuthorityName方法中,会调用getAuthoritySet方法。该方法用于获取当前用户所拥有的角色的所有权限。 4. 在getAuthoritySet方法中,会通过authentication.getAuthorities()方法从数据库中获取当前用户所拥有的角色的所有权限。 5. 最后,hasAnyAuthorityName方法会将传入的权限字符串与权限集合进行比对,判断是否具有该权限。 总结起来,@PreAuthorize("hasAnyAuthority")注解的作用是从数据库中查询当前登录用户的所有权限,并交给Spring Security进行管理。通过该注解可以判断指定的权限是否在当前登录用户的权限集合中,如果在则返回200,否则返回403。 需要注意的是,该注解的权限判断依赖于Spring Security框架和数据库中保存的用户权限信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Spring-Security@PreAuthorize("hasAuthority('')")源码分析](https://blog.csdn.net/guoke2017/article/details/94439661)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [spel-maven-plugin:Maven插件,可在构建过程中扫描您的源代码,并在PreAuthorize等注释中查找Spring ...](https://download.csdn.net/download/weixin_42110469/18852483)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值