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


问题内容

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

我知道两者都必须在 方法级别使用 ,在我的学习资料中,我发现了以下两个示例:

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

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

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

我认为这类似于 基于角色的安全性 ,因此它的含义可能类似于: 仅当用户是成员时,它才能访问带注释的资源
(对吗?)。但是,在何处以及如何定义用户设置此角色(它是成员)的事实呢?究竟如何运作?

特纳克斯


问题答案:

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

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

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

这样,我们可以通过称为角色的小型安全单元将精力集中在业务逻辑和业务逻辑的安全性上。

然后,我将角色分配给用户。用户可以具有多个角色。因此,您必须在这里查看关系。为用户分配了角色。并授予角色访问业务逻辑的权限。通过角色向用户授予对业务逻辑的访问权限。这个概念称为基于角色的访问控制。

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