【问题标题】:Spring Security: Method Level Security Prevent Access to a RoleSpring Security:方法级安全性阻止访问角色
【发布时间】:2020-02-21 16:56:35
【问题描述】:

使用 Spring Security 5.2.X(目前最新),我需要防止第三方角色访问除 SOAP 服务中的所有方法之外的所有方法。换句话说,我需要该特定角色只能访问服务中所有可用方法中的一种特定方法。

通常,通常的方法级安全化由带有@Secure("MY_ROLE") 的注释组成。这使得该方法只能对该角色进行访问。

是否可以告诉 Spring Security Core 做相反的事情。即,以特定用户只能访问安全方法的方式对其进行配置。

当然,解决方法可能是:

// Method accessible by anyone but third party role
@Secured({"GOOD_ROLE1", "GOOD_ROLE2", "GOOD_ROLE3"})
public void methodAccessibleByAnyoneButThirdPartyRole(){
}

// Method accessible by anyone, including third party role
@Secured({"GOOD_ROLE1", "GOOD_ROLE2", "GOOD_ROLE3", "THIRD_PARTY_ROLE"})
public void methodAccessibleByAnyone(){
}

其他解决方法包括仅使用要限制的方法创建新服务。

但是有没有任何注释选项可以直接获得相同的效果?像@PreAuthorize("!hasRole('THIRD_PARTY_ROLE')") 或类似的东西?

【问题讨论】:

    标签: java spring security soap spring-security


    【解决方案1】:

    根据 Spring Security doc,您可以在 @PreAuthorize 中使用任何 Spring 表达式语言 (SpEL)

    任何 Spring-EL 功能都可以在表达式中使用,所以你 还可以访问参数的属性。例如,如果您 想要一个特定的方法只允许访问一个用户 用户名匹配联系人的,你可以写

    @PreAuthorize("#contact.name == authentication.name")
    public void doSomething(Contact contact);

    所以你可以使用:

    @PreAuthorize("!hasRole('THIRD_PARTY_ROLE')")
    

    也是更易读的变体:

    @PreAuthorize("not hasRole('THIRD_PARTY_ROLE')")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 2011-10-04
      • 2016-12-27
      • 2015-02-15
      • 2017-10-19
      相关资源
      最近更新 更多