Spring 中@Secured 与@RolesAllowed 之间的区别?以及基于角色的安全的概念?

Difference between @Secured vs @RolesAllowed in Spring? And the concept of Role Based Security?

我正在研究 Spring 安全性,我对使用 @Secured 注释和 @RolesAllowed 之间的区别有以下疑问 注释。

我知道两者都必须在 方法级别 上使用,在我的研究中 material 我发现了以下 2 个示例:

在我看来,这 2 个注释的工作方式相同。有什么区别?我错过了什么?

我的另一个疑问是:ROLE_MEMBER到底代表什么?

我认为这类似于 基于角色的安全性,因此它可能意味着:仅当用户是成员时它才能访问注释资源(正确吗?)。但是在哪里以及如何定义用户已经设置了这个角色(它是一个成员)的事实?具体如何运作?

Tnx

@Secured@RolesAllowed是一样的。他们在 Spring 中执行相同的操作。

但是

  • @RolesAllowed - Java 的标准注释。

    Java 定义了 Java 规范请求,基本上是对 Java 语言、库和其他组件的更改请求。对于注解的开发,他们提供了JSR 250。@RolesAllowed包含在里面。 This link contains further info in JSR 250

  • @Secured - Spring 安全注释

ROLE_MEMBER是设置到安全用户详细信息的角色。

参考我当前项目中的这个例子。在这里,我使用用户数据对象并将赋予用户的角色映射到安全用户详细信息。

public class CustomUserDetails implements UserDetails {
...
...
... 

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
        for (Role role : this.user.getRoles()){
            grantedAuthorities.add(new SimpleGrantedAuthority(role.getRole()));
        }
        return grantedAuthorities;
    }
}

然后使用 @Secured@RolesAllowed@PreAuthorize("hasRole('ROLE_USER')") 方法为安全批准设置这些角色。

按照设计,将安全性放在服务层是很好的。因此,当我保护我的服务操作时,我会检查角色,而不是用户。

这样,我们就可以通过称为角色的小型安全单元专注于业务逻辑和业务逻辑的安全性。

然后我将角色分配给用户。用户可以有多个角色。所以你必须看到这里的关系。用户被赋予角色。角色被授予对业务逻辑的访问权限。用户被授予通过角色访问业务逻辑的权限。这个概念称为基于角色的访问控制。

而且在复杂的情况下我们还可以管理分层角色。一个角色有许多其他角色。但在 UserDetails 中,我们必须扁平化角色层次结构,并将角色列表提供给 Spring 框架进行处理。

接受的答案完全回答了问题(呵呵),但我认为这是一个很好的地方来说明 如何在 Spring 中启用方法级安全性。

您唯一需要添加的是配置 class 上的 @EnableGlobalMethodSecurity 注释 (参见示例),并将以下属性设置为 true(默认为false

  • securedEnabled(启用 Spring 的 Secured 注释。),
  • jsr250Enabled(启用 JSR-250 standard java 安全注释,如 RolesAllowed),
  • prePostEnabled(启用 Spring 的 PreAuthorizePostAuthorize 注释)。

注解用法示例:

@EnableGlobalMethodSecurity(
    securedEnabled = true,
    jsr250Enabled = true,
    prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// ...
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .anyRequest().fullyAuthenticated()
        .and()
        .formLogin(); // You probably need more than this
}

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    // your authentication manager config here
}

有关更详细的示例,请参阅 Spring Security Method Level Annotations Example