java - 检查用户是否被另一个用户阻止的最佳位置

标签 java spring-security domain-driven-design

如果我想引入阻止用户的概念,在不违反良好设计原则的情况下,最合适的地方是检查用户是否被阻止?

到目前为止,我一直在使用 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/

相关文章:

java - 调用多个 AuthenticationSuccessHandler 的最干净的方法?

java.lang.NoSuchMethodError : org. springframework.core.annotation.AnnotationUtils.clearCache()V

spring-security - 使spring security在登录页面的查询字符串中添加return to url

c# - 领域驱动设计-父子关系模式-规范模式

java - 发送到 JMS 队列的消息将仅由单个消费者消费?

java - "Default FirebaseApp is not initialized"错误发生在模块依赖的静态帮助方法中

java - 学生GPA.java :5: error: '.class' expected error

domain-driven-design - 聚合根、聚合、实体、值对象

c# - 如何在 ASP MVC 中实现工作单元、存储库和业务逻辑?

java - 项目欧拉 19 : Counting Sundays, Java