如果我想介绍被阻止用户的概念,那么在不违反良好设计原则的情况下,最适合检查用户是否被阻止的地方在哪里?
到目前为止,我一直在使用Spring Security来注释控制器方法,以确定特定用户是否具有执行某项操作的权限。有了这个被阻止的用户,它会变得有点复杂。我是否应该尝试在控制器中再次使用它(可能再次使用Spring安全性),或者我应该让域对象自行决定?
我想把它放在控制器水平上会更好,但我担心如果我的控制器有一天不会变成一个if ...别的东西。
答案 0 :(得分:1)
一种方法可能是引入名为“BLOCKED”的角色,在被阻止时将其分配给所有用户,并注释所有不允许被阻止用户访问它们的方法:
@PreAuthorize("!hasRole('BLOCKED')")
public void secureMethod();
另一种方法是将阻止状态存储在用户数据库或其他存储中。然后扩展UserDetailsService以返回其他用户信息,包括“阻止”标志。并再次使用安全EL来过滤不允许被阻止的用户执行它们的方法:
@PreAuthorize("!principal.blocked")
public void secureMethod();
更新:
您在评论中提到的问题可以通过类似的方式进行处理:
@PreAuthorize("!#photo.owner.blockedUsers.contains(principal.name)")
public void likePhoto(Photo photo);
对于任何更复杂和/或通用的规则,我建议使用AOP方面来保护代码免受过多ifs的影响。