Spring Security中angular色与授权的区别

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

我想这样做允许的操作,如createSubUsersdeleteAccounts ,我将允许pipe理员 (与angular色ROLE_ADMIN )。

我感到困惑,因为我在网上看到的教程/演示。 我试图把我读到的东西联系起来,但是我认为我们可以互相交换。

我看到hasRole消耗GrantedAuthoritystring? 我绝对是在理解上做错了。 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让你确定权限,让你的选民决定是否允许访问某些东西。

您可以通过将不同的授予权限(授予)授予用户安全上下文。 您通常通过实现您自己的UserDetailsS​​ervice来完成此操作,该UserDetailsS​​ervice返回一个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色”(比如RoleVoterhasRoleexpression式等)的代码总是为您添加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_ACCOUNTOP_CREATE_USEROP_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

UserDetailsS​​ervice将负责收集这些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安全中使用它来更改此默认行为。