春季@Secured与@RolesAllowed的区别?基于角色的安全性的概念是什么?

我正在学习Spring Security,我对使用@Secured注释和@RolesAllowed注释之间的区别有疑问。

我知道两者都必须在方法层面上使用,在我的学习材料中,我发现了以下2个例子:

  • @RolesAllowed注释:

    import javax.annotation.security.RolesAllowed;    
    public class ItemManager {
        @RolesAllowed("ROLE_MEMBER")
        public Item findItem(long itemNumber) {
            ...
        }
    }
    
  • @Secured注释:

    import org.springframework.security.annotation.Secured;
    public class ItemManager {
        @Secured("ROLE_MEMBER")
        public Item findItem(long itemNumber) {
            ...
        }
    }
    

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

我的另一个疑问是:究竟什么代表了ROLE_MEMBER

我认为这类似于基于角色的安全性,因此它可能意味着:只有当用户是成员时,它才能访问注释的资源(是否正确?)。但是,在何处以及如何定义用户已设置此角色(它是成员)的事实?究竟是如何工作的?

断续器


答案 1

@Secured并且是相同的。他们在春季做同样的操作。@RolesAllowed

  • @RolesAllowed- Java的标准注释。

    Java已经定义了Java规范请求,基本上是对Java语言、库和其他组件的更改请求。为了开发注释,他们提供了 JSR 250。@RolesAllowed包含在其中。此链接包含 JSR 250 中的更多信息

  • @Secured- 弹簧安全注释

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;
    }
}

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

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

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

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

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


答案 2

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

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

  • securedEnabled(启用 Spring 的注释)。Secured
  • jsr250Enabled(启用 JSR-250 标准 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安全方法级别注释示例


推荐