Spring Security中有一些概念和实现,例如GrantedAuthority
用于获得 授权 来授权/控制访问权限的接口。
我希望对允许的操作(例如 createSubUsers 或 deleteAccounts) 进行允许,这些操作将允许 管理员 (具有role
ROLE_ADMIN
)进行。
在网上看到的教程/演示让我感到困惑。我尝试将我阅读的内容联系起来,但我认为我们可以将两者互换。
我看到正在hasRole
消耗GrantedAuthority
字符串吗?我肯定在理解上做错了。Spring Security中的这些概念是什么?
如何将用户的角色与角色的权限分开存储?
我还查看org.springframework.security.core.userdetails.UserDetails
了身份验证提供程序引用的DAO中使用的接口,该接口消耗了User
(请注意最后的GrantedAuthority):
public User(String username,
String password,
boolean enabled,
boolean accountNonExpired,
boolean credentialsNonExpired,
boolean accountNonLocked,
Collection<? extends GrantedAuthority> authorities)
还是有其他方法可以区分其他两个?还是不受支持,我们必须自己做?
将GrantedAuthority视为“权限”或“权利”。这些“权限”(通常)用字符串表示(使用getAuthority()
方法)。这些字符串使您可以识别权限,并让您的选民决定他们是否授予访问权限。
您可以通过将用户置于安全上下文中来为其授予不同的GrantedAuthority(权限)。通常,您可以通过实现自己的UserDetailsService来实现此目的,该服务返回一个UserDetails实现,该实现返回所需的GrantedAuthorities。
角色(在许多示例中使用过)只是“权限”,使用命名约定表示角色是以prefix开头的GrantedAuthority ROLE_
。没什么了
一个角色就是一个GrantedAuthority-一个“权限”-一个“权利”。您会在Spring
Security中看到很多地方,带有ROLE_
前缀的角色是专门处理的,例如在RoleVoter中,ROLE_
前缀被用作默认值。这样,您就可以提供角色名称而无需添加ROLE_
前缀。在Spring安全4之前,没有非常一致地遵循对“角色”的这种特殊处理,并且权限和角色通常被视为相同(例如,hasAuthority()
hasRole()
)。使用Spring
Security
4,角色的处理更加一致,处理“角色”的代码(如RoleVoter
,hasRole
表达式等)总是ROLE_
为您添加前缀。所以hasAuthority('ROLE_ADMIN')
指一样hasRole('ADMIN')
,因为ROLE_
前缀被自动添加。有关更多信息,请参见Spring
Security 3到4 迁移指南。
但是,角色仍然只是带有特殊ROLE_
前缀的授权机构。因此在Spring安全性3
@PreAuthorize("hasRole('ROLE_XYZ')")
中与相同@PreAuthorize("hasAuthority('ROLE_XYZ')")
,在Spring安全性4
@PreAuthorize("hasRole('XYZ')")
中与相同@PreAuthorize("hasAuthority('ROLE_XYZ')")
。
关于您的用例:
用户具有角色,角色可以执行某些操作。
您可能最终会GrantedAuthorities
遇到用户所属的角色以及角色可以执行的操作。在GrantedAuthorities
对角色有前缀ROLE_
和操作都有前缀OP_
。一个例子为业务主管部门可能是OP_DELETE_ACCOUNT
,OP_CREATE_USER
,OP_RUN_BATCH_JOB
等角色可以是ROLE_ADMIN
,ROLE_USER
,ROLE_OWNER
等。
您最终可能会GrantedAuthority
像下面的(伪代码)示例中那样使您的实体实现:
@Entity
class Role implements GrantedAuthority {
@Id
private String id;
@ManyToMany
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;
@ManyToMany
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表示形式,例如ROLE_ADMIN
,OP_DELETE_ACCOUNT
等等。对用户进行身份验证时,请确保从UserDetails.getAuthorities()返回了其所有角色的所有GrantedAuthority和相应的操作方法。
例如:ID为admin角色ROLE_ADMIN
有操作OP_DELETE_ACCOUNT
,OP_READ_ACCOUNT
,OP_RUN_BATCH_JOB
分配给它。ID为的用户角色具有ROLE_USER
操作OP_READ_ACCOUNT
。
如果造成安全上下文管理员日志将有GrantedAuthorities: ,
ROLE_ADMIN
,,OP_DELETE_ACCOUNT``OP_READ_ACCOUNT``OP_RUN_BATCH_JOB
如果一个用户登录它,它就会有: ROLE_USER
,OP_READ_ACCOUNT
UserDetailsService将注意收集所有角色以及这些角色的所有操作,并通过返回的UserDetails实例中的getAuthorities()方法使它们可用。
我知道还有其他类似的线程,但我不确定它们是否与Postgres相关。 我正在阅读PostgreSQL文档,内容如下: 注意:如第20章所述,PostgreSQL实际上在“角色”方面进行了权限管理。在本章中,我们始终使用数据库用户来表示“具有 LOGIN 特权的角色”。 这是否意味着角色是数据库用户?或者角色和用户之间有区别吗?用户是否有可能不具有完全权限,而角色是始终具有完全权限的用户?
我试图在一个带有spring security和KeyClope的java应用程序中同时使用领域和资源角色。不幸的是,KeyClope只会返回一个或另一个,具体取决于: 您仍然可以通过自定义代码获得这两种方法,但它会弄乱@PreAuthorize或spring boot方法等注释。isUserInRole,这会导致难看的代码。 有没有办法覆盖@PreAuthorize方法或JSON令牌Keyclo
对于ASP.NET MVC应用程序,新的Azure Web站点和传统的Azure Web角色之间有什么实质性的区别?为什么我会选择“Web站点”而不是“Web角色”,或者反之亦然? 让我们假设我在两种情况下都需要相同的容量(例如2个小实例)。价格似乎是可比的,但事实上,有33%的临时折扣为网站,而他们是在预览期。 有没有什么事情我可以做的“网站”是困难或不可能与一个网络角色?例如,使用“web站点
本文向大家介绍深色网络和深色网络之间的区别,包括了深色网络和深色网络之间的区别的使用技巧和注意事项,需要的朋友参考一下 深网 深度网络是搜索引擎无法访问的网络内容。例如,银行信息,政府机密数据,云中存在的数据。只有经过正确的身份验证,才能访问深度Web上的数据。 暗网 Dark Web是网站所有者匿名的网站。Dark Web通常用于非法活动。暗网无法通过常规浏览器/搜索引擎访问。需要专用软件才能访
在我们的系统中,我们有一种设置用户权限的方法。他们创建一个组名,例如Admin,然后为他们想要执行的任务分配所有权限。 例如,他们可以添加AddCompany、ViewCompany、DeleteCompany和EditCompany 这使得创建不同的权限组变得非常容易,并且我们可以非常容易地控制安全性。 在这个实例中,组名=角色,每个权限都是一个声明,我这样想对吗?
问题内容: 我有两个问题,可能需要一些帮助来理解它们。 和之间有什么区别?我知道这 意味着在单独的外壳中运行命令,然后将其传递给变量。有人可以帮助我理解这一点吗?如果我错了,请纠正我。 如果我们可以使用并且效果很好,那我为什么不能使用它呢?两者的执行周期有何不同? 问题答案: 语法是令牌级别的,因此美元符号的含义取决于其所在的令牌。表达式是现代代名词,代表命令替换;这意味着运行并将其输出放在此处。