我正在寻找一种设计模式或整理代码的方法。这是在给定主题的安全性和检查权限的上下文中。 这是一个简化的例子:
public Pizza bakePizza() throws UnauthorizedException{
if (subject.isPermitted("BAKE_PIZZA")){
return new Pizza();
} else {
throw new UnauthorizedException();
}
}
有没有办法让它更干净,因为当我有很多不同类型的方法时,这会变得非常混乱。
答案 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();
通过这种方式,您可以在不触及业务逻辑的情况下更改安全约束,反之亦然。
答案 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();
}