@Secured与@Roles之间的区别是否在Spring?以及基于角色的安全性的概念?

And*_*ili 11 java spring annotations spring-mvc spring-security

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

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

  • @RolesAllowed注释:

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

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

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

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

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

TNX

Far*_*ook 25

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

  • @RolesAllowed - Java的标准注释.

    Java已经定义了Java Specification Request,基本上改变了对Java语言,库和其他组件的请求.对于开发注释,他们提供了JSR 250. @RolesAllowed它包含在其中.此链接包含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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

通过设计,将安全性放在服务层中是件好事.因此,当我确保我的服务操作安全时,我会检查角色,而不是用户.

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

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

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


Ale*_*dar 13

接受的答案完全回答了问题(heh),但我认为这是一个说明如何在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
}
Run Code Online (Sandbox Code Playgroud)

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

  • @masterxilo 如果未启用这些注释,则使用这些注释是没有意义的。默认情况下不启用它们的原因是因为并非每个 Spring 设置都希望/需要使用方法级安全性。有很多方法可以保护您的 Web 应用程序,ant 方法级安全性只是其中之一。 (2认同)