如果我想引入阻止用户的概念,在不违反良好设计原则的情况下,最合适的地方是检查用户是否被阻止?
到目前为止,我一直在使用 Spring Security 来注释 Controller 方法,以了解特定用户是否有权执行特定操作。有了这个被阻止的用户的事情,事情就变得有点复杂了。我应该尝试再次将其放入 Controller 中(可能再次使用 Spring 安全性)还是我应该让域对象自行决定?
我想最好将其留在 Controller 级别,但我担心有一天我的 Controller 不会变成 if...else 困惑。
最佳答案
一种方法可能是引入名为“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 方面来保持代码干净,避免出现过多的 if。
关于java - 检查用户是否被另一个用户阻止的最佳位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9728698/