Spring安全中角色与授权的区别

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

SpringSecurity中有一些概念和实现,例如GrantedAuthority接口以获得权威授权/控制访问

我希望这是允许的操作,例如CreateSubUser,或删除Account,我会允许管理(具有作用ROLE_ADMIN)

当我在网上看到的教程/演示时,我感到很困惑。我试着把我读到的东西联系起来,但我认为我们可以互换对待这两种。

我明白了。hasRole消费GrantedAuthority弦乐?我在理解上肯定做错了。在SpringSecurity中,这些在概念上是什么?

如何将用户的角色与该角色的权限分开存储?

我也在看org.springframework.security.core.userdetails.UserDetails接口,该接口用于身份验证提供程序引用的DAO中,它使用的是User(最后一次授权):

public User(String username, 
            String password, 
            boolean enabled, 
            boolean accountNonExpired,
            boolean credentialsNonExpired, 
            boolean accountNonLocked, 
            Collection<? extends GrantedAuthority> authorities)

或者有没有其他方法来区分另外两种?还是不支持,我们要自己做?

提问于
用户回答回答于

实体实现GrantedAuthority就像在这个(伪代码)示例中:

@Entity
class Role implements GrantedAuthority {
    @Id
    private String id;

    @OneToMany
    private final List<Operation> allowedOperations = new ArrayList<>();

    @Override
    public String getAuthority() {
        return id;
    }

    public Collection<GrantedAuthority> getAllowedOperations() {
        return allowedOperations;
    }
}

@Entity
class User {
    @Id
    private String id;

    @OneToMany
    private final List<Role> roles = new ArrayList<>();

    public Collection<Role> getRoles() {
        return roles;
    }
}

@Entity
class Operation implements GrantedAuthority {
    @Id
    private String id;

    @Override
    public String getAuthority() {
        return id;
    }
}

你在数据库中创建的角色和操作的ID将是GrantedAuthority表示,例如,“作用_管理“,”执行部分_删除_“帐户”等。当用户经过身份验证时,确保从UserDetails.getAuthities()方法返回其所有角色的所有GrantedAuthity及其相应的操作。

示例:id角色的管理角色_管理员有操作操作_删除_帐户,执行部分_读_帐户,执行部分_跑_分批_分配给它的工作。具有id角色的用户角色_用户有操作操作_读_账户。

如果管理日志在生成的安全上下文中将具有GrantedAuthents:角色_行政,执行部分_删除_帐户,执行部分_读_帐户,执行部分_跑_分批_工作

如果用户将其记录在案,则它将具有以下角色:_用户,操作_读_帐户

UserDetailsService将注意收集这些角色的所有角色和所有操作,并通过返回的UserDetails实例中的getAuthties()方法使它们可用。

用户回答回答于

对于情况,可以使用分层角色。

<bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter">
    <constructor-arg ref="roleHierarchy" />
</bean>
<bean id="roleHierarchy"
        class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
    <property name="hierarchy">
        <value>
            ROLE_ADMIN > ROLE_createSubUsers
            ROLE_ADMIN > ROLE_deleteAccounts 
            ROLE_USER > ROLE_viewAccounts
        </value>
    </property>
</bean>

扫码关注云+社区