10.7 Spring Security中Role和GrantedAuthority之间的区别| Java Debug 笔记

421 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:Spring Security中Role和GrantedAuthority之间的区别是什么?

Spring Security中有一些概念和实现,例如GrantedAuthority接口,用于获取授权来授权/控制访问。

我希望对合法的操作(例如createSubUsers或deleteAccounts)进行授权,这些操作将允许管理员(具有ROLE_ADMIN角色)进行。

我在网上看到的教程/演示让我感到困惑。 我尝试将我阅读的内容联系起来,但我认为我们可以将两者互换。

我看到hasRole正在使用GrantedAuthority字符串吗? 我肯定在理解上做错了。 Spring Security中的这些概念是什么?

如何存储用户角色,是否应该与该角色的权限分开存放?

我还在看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)

还是有其他方法可以区分这两个? 还是我们必须自己实现? 回答1:

AFAIK GrantedAuthority和roles在Spring安全性中相同。 GrantedAuthority的getAuthority()返回的字符串就是角色(根据SimpleGrantedAuthority的默认实现)。

对于您的情况,您可以使用层次角色

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

角色就像是Spring安全中的许可。在hasRole中使用intercept-url可以非常精细地控制对哪个角色/权限允许执行什么操作。

我们在应用程序中的处理方式是,我们为每个操作(或剩余网址)定义权限(即角色),例如view_account,delete_account,add_account等。然后,我们为每个用户(例如admin,guest_user,normal_user)创建逻辑配置文件。这些配置文件只是权限的逻辑分组,与spring-security无关。添加新用户后,将为其分配一个配置文件(具有所有允许的权限)。现在,当用户尝试执行某些操作时,将根据用户的GrantAuthorities检查该操作的权限/角色。

此外,默认角色RoleVoter使用前缀ROLE_,因此任何以ROLE_开头的权限都被视为角色,您可以通过在角色投票器中使用自定义RolePrefix并在Spring Security中使用它来更改此默认行为。