我有一个自定义的Autorization模型,我希望用spring security代表:
我有角色和权限:
@Entity
public class User
...............
@ManyToMany
@Column
private Set<Role> roles;
@ManyToMany
@Column
private Set<Permission> permissions;
}
在我的自定义Userdetails服务中,我有一个干净的方式来加载角色,但我找不到任何方式和spring-security中与权限相关的任何组件:
public class BELUserDetailService implements UserDetailsService {
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User connectedUser = userRepositoy.findUserByUsername(username);
Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
for (Role r :connectedUser.getRoles()) {
authorities.add(new SimpleGrantedAuthority(r.getRoleAWB().name()));
}
BELUserDetails belUserDetails = new BELUserDetails(connectedUser.getIdUser(), authorities);
.....
....
}
}
我的角色是:
ADMIN 普通用户 交易用户
我的权限是: VALIDATE_TRANSATION INIT_TRANSACTION
功能用例是,如果要验证事务,则必须具有ROLE TRANSACTION USER和权限VALIDATE_TRANSACTION。
hasRole("ROLE_TRANSACTION_USER") and hasPermission("VALIDATE_TRANSACTION")
另一个重要的情况是,我希望将来使用PermissionEvaluator在尝试验证事务时设置一些限制,如果用户具有角色“ROLE_TRANSACTION_USER”和权限VALIDATE_TRANSACTION,他还必须具有大于金额的Amountlimit使用PermissionEvaluator
,事务和此功能非常酷这就是为什么我需要实现角色和权限概念
我将如何将我的权限添加到spring-security的标准流程中。
提前致谢。
答案 0 :(得分:1)
默认情况下,您只拥有Spring Security中的权限。只需将您的所有角色和权限添加到权限集合中。然后你可以这样做:
hasRole("ROLE_TRANSACTION_USER") and hasRole("VALIDATE_TRANSACTION")
在大多数情况下,将两者混合不是问题。
您拥有Spring Security ACL module中的权限,但只有在每个域对象拥有不同的安全规则时才需要ACL。
编辑。我认为进行一些额外安全检查的最简单方法是使用SpEL。例如:
@PreAuthorize("hasRole('ROLE_TRANSACTION_USER')
and hasRole('VALIDATE_TRANSACTION')
and @amountValidatorServiceBean.isAmountValidForCurrentUser(#amount)")
public void doTransaction(Integer amount, ...)