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

时间:2013-12-07 15:30:09

标签: java design-patterns permissions

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

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

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

2 个答案:

答案 0 :(得分:3)

我认为通过使用像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();

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

如果你有很多这样的情况,你应该看一下像AOP这样的AspectJ框架

答案 1 :(得分:0)

一种方法是将检查逻辑移动到一个方法中,该方法会提前抛出并因此结束调用方法的程序流程。

public Pizza bakePizza() throws UnauthorizedException{
    ensurePermission("BAKE_PIZZA");
    return new Pizza();
}

private void ensurePermission(String permission) throws UnauthorizedException {
    if (!subject.isPermitted(permission))
        throw new UnauthorizedException();
}