【问题标题】:How to allow anonymous users to access a certain function only using spring security如何只使用spring security允​​许匿名用户访问某个功能
【发布时间】:2018-12-10 06:15:37
【问题描述】:

我在我的项目中使用 Spring Security。 我有一个条件,匿名用户应该能够从数据库中读取,而只有授权用户才能添加/更新/删除。 我们如何在 security-config 中提及这种情况?

.antMatchers("/user/**").permitAll()

允许所有需要进行身份验证,但我希望即使是未经身份验证的用户也可以通过 GET 方法访问。

@RequestMapping("/user")
@PreAuthorize("hasAuthority('USER')")
public List<UserAll> getAll() {

    return userService.getAll();
}

这里我怎么提这个功能也应该被匿名用户访问?

【问题讨论】:

  • 你可以改成hasAnyRole('USER', 'ANONYMOUS')
  • @fg78nc 那是控制器部分。在 .antMatchers("/user/**").permitAll() 部分怎么样。它将需要身份验证。
  • .antMatchers("/user").access("hasAnyRole('USER', 'ANONYMOUS')") 将匿名视为特殊的隐含角色。
  • @fg78nc 在这样做并通过没有身份验证的邮递员进行测试时,它表示访问此资源需要完全身份验证。我们是否必须在某处声明任何匿名用户都拥有“ANONYMOUS”的权限。
  • 不,您不必声明“匿名”权限。您究竟想访问哪个资源?

标签: spring spring-boot spring-security


【解决方案1】:

在我的 WebSecurityConfig 类中,我使用这个:

    .authorizeRequests()
            .antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security", "/swagger-ui.html", "/webjars/**")
                .permitAll()
            .antMatchers("/secure/rest/**")
                .authenticated()
            .antMatchers("/register**")
                .anonymous()
            .antMatchers("/login**")
                .anonymous()
            .and();

它的作用是只允许未经身份验证的用户使用注册和登录端点。它只允许经过身份验证的用户访问其他端点(以 /secure/rest 开头的端点)。 它还允许经过身份验证和未经身份验证的用户都可以使用我的 Swagger 端点。

permitAll 不要求对用户进行身份验证。它允许所有请求通过。

作为旁注,我建议每个环境使用不同的安全配置。我不建议在 prod 环境中向所有人公开 Swagger 端点。以上配置适用于我较低的开发环境。

【讨论】:

  • 我建议谨慎使用permitAll,因为它指示 Spring Security 完全忽略 URL,并且 Spring Security 不会设置 SecurityContextHolder。正确的方法是通过使用具有访问属性的 ant 或 mvc 匹配器来明确允许访问 URL。
  • 不会为其他网址设置一个吗?而且就像我说的,在更高的环境中,我使用了不同的配置,它没有任何 permitAll() URL。我只将 permitAll() 用于较低环境中的 Swagger 端点之类的东西。在生产环境中,这些端点甚至都不存在。
猜你喜欢
  • 2015-10-09
  • 2020-05-10
  • 1970-01-01
  • 2014-09-02
  • 2017-12-21
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 2012-05-31
相关资源
最近更新 更多