java - 在运行方法时是否有一个好的设计模式来检查权限?

标签 java design-patterns permissions

我正在寻找一种设计模式或方法来整理我的代码。这是在安全和检查给定主题权限的上下文中。 这是一个简化的示例:

public Pizza bakePizza() throws UnauthorizedException{
if (subject.isPermitted("BAKE_PIZZA")){
        return new Pizza();
    } else {
        throw new UnauthorizedException();
    }
}

有没有办法让它更干净一点,因为当我有很多不同类型的方法时,这会变得非常困惑。

最佳答案

我认为通过使用类似 decorator pattern 的东西来拆分安全约束和业务逻辑将是一个好的开始。

这样的事情怎么样:

// an interface defines the operations
public interface PizzaService {
  Pizza bakePizza();
}

// standard implementation that contains the business logic
public class PizzaServiceImpl implements PizzaService {
  @Override
  public Pizza bakePizza() {
    // implementation ..
  }
}

// implementation with security constraints that delegates to the real implementation
public class SecurePizzaService implements PizzaService {
  private PizzaService service;
  public SecurePizzaService(PizzaService service) {
    this.service = service;
  }

  @Override
  public Pizza bakePizza() {
    if (!subject.isPermitted("BAKE_PIZZA")){
      throw new UnauthorizedException();
    }
    service.bakePizza()
  }
}

// usage
PizzaService pizzaService = new SecurePizzaService(new PizzaServiceImpl());
...
Pizza pizza = pizzaService.bakePizza();

这样您就可以在不触及业务逻辑的情况下更改安全约束,反之亦然。

如果你有很多这样的情况,你应该看看AOPAspectJ 这样的框架

关于java - 在运行方法时是否有一个好的设计模式来检查权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20443074/

相关文章:

java - 将 ResultSet 中的数据添加到 jTable

C# 替换巨大的 if-else 语句

c++ - 使用gcc编译文件时出错,由权限拒绝引起

php - Facebook API 权限的 fatal error

java - 获取jMeter线程已运行的时间

java - 在 hackerrank 中美丽的二进制字符串中出现错误

java - 用于管理多个 Web 应用程序配置的工具

c# - 这个单例实现是线程安全的吗 - 检查代码

java - 使用嵌套 if else 和 switch 语句重构代码的设计模式

permissions - 乌龟SVN : Setting different permissions for sub folders