Spring Security中angular色与授权的区别
Spring Security中有一些概念和实现,例如GrantedAuthority
接口来获得授权/控制访问的权限。
我想这样做允许的操作,如createSubUsers或deleteAccounts ,我将允许pipe理员 (与angular色ROLE_ADMIN
)。
我感到困惑,因为我在网上看到的教程/演示。 我试图把我读到的东西联系起来,但是我认为我们可以互相交换。
我看到hasRole
消耗GrantedAuthority
string? 我绝对是在理解上做错了。 Spring Security在概念上是什么?
我如何存储用户angular色,与angular色权限分开?
我也正在寻找org.springframework.security.core.userdetails.UserDetails
接口,该接口用于身份validation提供程序引用的DAO,它使用一个User
(注意最后一个GrantedAuthority):
public User(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities)
还是有其他的方法来区分另外两个? 还是不支持,我们必须做我们自己的?
将授权机构认为是“许可”或“权利”。 这些“权限”(通常)表示为string(使用getAuthority()
方法)。 这些string让你确定权限,让你的选民决定是否允许访问某些东西。
您可以通过将不同的授予权限(授予)授予用户安全上下文。 您通常通过实现您自己的UserDetailsService来完成此操作,该UserDetailsService返回一个UserDetails实现,该实现返回所需的GrantedAuthorities。
angular色(正如许多例子中所使用的)仅仅是一个命名约定的“权限”,即angular色是一个以前缀ROLE_
开头的GrantedAuthority。 没有什么更多了。 angular色只是一个授权机构 – 一个“权限” – 一个“权利”。 在弹簧安全中看到很多地方,其中带有ROLE_
前缀的angular色被特殊处理,例如在RoleVoter中,其中ROLE_
前缀被用作默认值。 这允许您提供没有ROLE_
前缀的angular色名称。 在Spring安全性4之前,这种对“angular色”的特殊处理并没有得到非常一致的遵守,而权限和angular色也经常被处理(就像你在SecurityExpressionRoot的hasAuthority()
方法中可以看到的hasAuthority()
– 只需调用hasRole()
)。 使用Spring Security 4,angular色的处理更加一致,处理“angular色”(比如RoleVoter
, hasRole
expression式等)的代码总是为您添加ROLE_
前缀。 所以hasAuthority('ROLE_ADMIN')
含义与hasRole('ADMIN')
相同,因为ROLE_
前缀被自动添加。 有关更多信息,请参阅弹簧安全性3至4 移植指南 。
但仍然:angular色只是一个具有特殊ROLE_
前缀的权威。 因此,在Spring安全性3 @PreAuthorize("hasRole('ROLE_XYZ')")
与@PreAuthorize("hasAuthority('ROLE_XYZ')")
和Spring安全性4 @PreAuthorize("hasRole('XYZ')")
与@PreAuthorize("hasAuthority('ROLE_XYZ')")
。
关于你的用例:
用户具有angular色和angular色可以执行某些操作。
您可以在GrantedAuthorities
获取用户所属的angular色以及angular色可以执行的操作。 GrantedAuthorities
为angular色具有前缀ROLE_
和操作具有前缀OP_
。 操作权限的示例可以是OP_DELETE_ACCOUNT
, OP_CREATE_USER
, OP_RUN_BATCH_JOB
等。angular色可以是ROLE_ADMIN,ROLE_USER等。
你可能最终让你的实体像这个(伪代码)例子一样实现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; } }
您在数据库中创build的angular色和操作的id将是GrantedAuthority表示,例如“ROLE_ADMIN”,“OP_DELETE_ACCOUNT”等。当用户通过身份validation时,确保所有angular色的所有授予权限以及相应的操作都从UserDetails.getAuthorities()方法。
示例:标识为ROLE_ADMIN的pipe理员angular色具有分配给它的操作OP_DELETE_ACCOUNT,OP_READ_ACCOUNT和OP_RUN_BATCH_JOB。 ID为ROLE_USER的用户angular色具有操作OP_READ_ACCOUNT。
如果pipe理员login产生的安全上下文将具有GrantedAuthorities:ROLE_ADMIN,OP_DELETE_ACCOUNT,OP_READ_ACCOUNT,OP_RUN_BATCH_JOB
如果用户logging它,它将有:ROLE_USER,OP_READ_ACCOUNT
UserDetailsService将负责收集这些angular色的所有angular色和所有操作,并通过返回的UserDetails实例中的方法getAuthorities()使其可用。
AFAIK GrantedAuthority和angular色在春季安全方面是一样的。 GrantedAuthority的getAuthority()string是angular色(按照默认实现SimpleGrantedAuthority)。
您的情况可能是您可以使用分层angular色
<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>
不是你寻找的确切的溶胶,但希望它有帮助
编辑 :回复您的评论
angular色就像是一个春季安全的权限。 使用hasRole的拦截url提供了一个非常好的粒度控制哪些angular色/权限允许哪些操作。
我们在应用程序中处理的方式是,我们为每个操作(或resturl)定义权限(例如,view_account,delete_account,add_account等)。然后我们为每个用户(如admin,guest_user,normal_user)创build逻辑configuration文件。 configuration文件只是逻辑分组的权限,独立于spring-security。 添加新用户时,会为其分配一个configuration文件(具有所有允许的权限)。 现在,当用户尝试执行某个操作时,会针对用户授予的权限检查该操作的权限/angular色。
此外,默认RoleVoter使用前缀ROLE_,因此以ROLE_开头的任何权限都被视为angular色,您可以通过在angular色投票器中使用自定义RolePrefix并在spring安全中使用它来更改此默认行为。