Java 检查用户是否被其他用户阻止的最佳位置

Java 检查用户是否被其他用户阻止的最佳位置,java,spring-security,domain-driven-design,Java,Spring Security,Domain Driven Design,如果我想介绍阻塞用户的概念,在不违反良好设计原则的情况下,检查用户是否被阻塞的最合适位置在哪里 到目前为止,我一直在使用SpringSecurity,对控制器方法进行注释,说明特定用户是否具有执行特定操作的权限。有了这个阻止用户的东西,它变得有点复杂了。我应该尝试在控制器中再次安装它(可能再次使用Spring security),还是应该让域对象自行决定 我想最好还是把它放在控制器级别上,但我担心如果有一天我的控制器不会变成if…else一团糟。一种方法可能是引入名为“BLOCKED”的角色,在

如果我想介绍阻塞用户的概念,在不违反良好设计原则的情况下,检查用户是否被阻塞的最合适位置在哪里

到目前为止,我一直在使用SpringSecurity,对控制器方法进行注释,说明特定用户是否具有执行特定操作的权限。有了这个阻止用户的东西,它变得有点复杂了。我应该尝试在控制器中再次安装它(可能再次使用Spring security),还是应该让域对象自行决定


我想最好还是把它放在控制器级别上,但我担心如果有一天我的控制器不会变成if…else一团糟。

一种方法可能是引入名为“BLOCKED”的角色,在所有用户被阻止时将其分配给他们,并用以下方法注释所有不允许被阻止用户访问的方法:

@PreAuthorize("!hasRole('BLOCKED')")
public void secureMethod();
另一种方法是将阻塞状态存储在用户数据库或其他存储中。然后扩展以返回其他用户信息,包括“blocked”标志。并且再次使用安全EL过滤不允许被阻止用户执行的方法:

@PreAuthorize("!principal.blocked")
public void secureMethod();
更新

您在评论中提到的问题可以通过类似的方式解决:

@PreAuthorize("!#photo.owner.blockedUsers.contains(principal.name)")
public void likePhoto(Photo photo);

对于任何更复杂和/或通用的规则,我建议使用AOP方面来保持代码干净,避免出现太多的ifs。

您所说的“阻止”是什么意思?谢谢。第一种方法不起作用,因为被阻止的用户被某些其他用户阻止,而不是被所有人阻止。第二个看起来更可能,但我仍然没有上下文所有者的概念。例如,如果我想阻止某些人喜欢我的照片,每次调用likePhoto控制器方法时,我都应该检查主体是否在photo.owner的阻止列表中。这有点棘手