2013-08-30 44 views
0

我有Autorization的自定义模型,我想带弹簧的安全表示:角色和权限自定义模型

我有角色和权限的concpt:

@Entity 
public class User 
............... 
@ManyToMany 
@Column 
private Set<Role> roles; 


@ManyToMany 
@Column 
private Set<Permission> permissions; 
    } 

在我自己的UserDetailsS​​ervice我有一个干净的方式来加载的角色,但我on't找到任何方式和与之相关的权限,弹簧安全的任何componenent:

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 普通用户 交易USER

我的权限是: 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

这就是为什么我需要同时实现了角色和权限概念

如何,我将我的许可添加到弹簧安全的标准流程。

在此先感谢。

+0

您能否显示一些权限示例? –

+0

我使用角色和权限的一些示例更新了帖子 – Nabil

+0

另一种情况是,如果用户具有角色“ROLE_TRANSACTION_USER”和权限VALIDATE_TRANSACTION,我希望将来使用PermissionEvaluator在尝试验证事务时放置一些限制,他还必须具有大于交​​易金额的Amountlimit,并且该功能对于PermissionEvaluator非常酷。 – Nabil

回答

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, ...) 
+0

将VALIDATE_TRANSACTION作为角色的问题是,我们将无法使用自定义PermissionEvaluator来测试用户是否有权使用给定数量验证事务。 – Nabil

+0

使用SpEL直接在注释中调用某些验证逻辑可能更容易。在我的答案中查看详情。 –

+0

谢谢,我将用这个解决方案来实现 – Nabil