将授权授权视为“许可”或“权利”。这些“权限”(通常)表示为字符串(使用方法)。通过这些字符串,您可以识别权限,并让投票者决定是否授予对某些内容的访问权限。getAuthority()
您可以通过将用户放入安全上下文中来向用户授予不同的授权机构(权限)。您通常通过实现自己的 UserDetailsService 来执行此操作,该服务返回一个 UserDetails 实现,该实现返回所需的 GrantedAuthorities。
角色(在许多示例中使用)只是具有命名约定的“权限”,该约定表明角色是以前缀开头的授权机构。仅此而已。角色只是一个授权机构 - 一个“权限” - 一个“权利”。在弹簧安全性中,您会看到很多地方,其中具有其前缀的角色被特别处理为例如在 RoleVoter 中,其中前缀用作默认值。这允许您提供角色名称而不带前缀。在Spring security 4之前,这种对“角色”的特殊处理没有得到非常一致的遵循,并且权限和角色通常被同等对待(例如,您可以在SecurityExpressionRoot中实现该方法中看到的那样 - 它只是调用 )。使用Spring Security 4,角色的处理更加一致,处理“roles”的代码(如,表达式等)始终为您添加前缀。因此,这意味着与因为前缀是自动添加的相同。有关更多信息,请参阅春季安全 3 到 4 迁移指南。ROLE_
ROLE_
ROLE_
ROLE_
hasAuthority()
hasRole()
RoleVoter
hasRole
ROLE_
hasAuthority('ROLE_ADMIN')
hasRole('ADMIN')
ROLE_
但仍然:角色只是一个具有特殊前缀的权威。所以在春季安全3中与春季安全4相同。ROLE_
@PreAuthorize("hasRole('ROLE_XYZ')")
@PreAuthorize("hasAuthority('ROLE_XYZ')")
@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 表示形式,例如 等。当用户通过身份验证时,请确保从 UserDetails.getAuthorities() 方法返回其所有角色的所有授权机构和相应的操作。ROLE_ADMIN
OP_DELETE_ACCOUNT
示例:具有 id 的管理员角色分配了操作 、 。具有 id 的用户角色具有操作 。ROLE_ADMIN
OP_DELETE_ACCOUNT
OP_READ_ACCOUNT
OP_RUN_BATCH_JOB
ROLE_USER
OP_READ_ACCOUNT
如果管理员在生成的安全上下文中登录时将具有授权机构:、 、 、ROLE_ADMIN
OP_DELETE_ACCOUNT
OP_READ_ACCOUNT
OP_RUN_BATCH_JOB
如果用户记录它,它将具有: ,ROLE_USER
OP_READ_ACCOUNT
用户详细信息服务将负责收集所有角色和这些角色的所有操作,并通过返回的 UserDetails 实例中的 getAuthorities() 方法使它们可用。