gpt4 book ai didi

spring - 设计模式 : evaluating security across multiple modules

转载 作者:行者123 更新时间:2023-12-01 06:42:57 25 4
gpt4 key购买 nike

这个问题更多的是关于设计模式,依赖注入(inject)而不是 Spring Security 本身,我希望没有特定 Spring Security 知识的人能够理解这个问题。

Introduction to Spring Security 3/3.1为了验证当前用户是否有权对目标对象执行操作,Mike Wiesner 实现了 PermissionEvaluator .在对目标对象执行操作之前,此 bean 与安全配置相关联并在方法注释上被调用。

目的是检查用户是否被授权对特定对象执行特定操作。他展示了以下代码(为了简洁起见,我想没有空检查):

public class MyPermissionEvaluator implements PermissionEvaluator {

@Override
public boolean hasPermission(Authentication auth, Object target, Object perm) {
if (target instanceof MyRequest) { //first class of target object...
MyRequest req = (MyRequest) target;
if (perm.equals("cancel")) { //action we wish to perform on the object
return auth.getName().equals(req.getEmployee());
} else if (perm.equals("list")) { //another action
return !hr.getEmployee().equals("rod") || auth.getName.equals("rod");
}
} else if (target instanceof ...) { //second class of target object...
...
}
throw new UnsupportedOperationException("hasPermission not supported");
}

}

他提到这种实现方式,只适用于小型应用程序,但在实践中,它应该拆分为多个方法或类。这正是我的想法:
  • 在多模块应用程序中,多个模块可能不知道彼此
  • 我们应该应用开闭原则(添加新模块时)

  • 我的问题是,你将如何解决这个问题?

    我的看法是为每个目标对象类设置一个全局权限评估器和一个权限评估器。
    public interface TargetPermissionEvaluator extends PermissionEvaluator {
    Class getTargetClass(); //so we know for which target class we can use it
    }

    public class MyGlobalPermissionEvaluator implements PermissionEvaluator {

    @Autowired
    private List<TargetPermissionEvaluator> evaluators;

    @Override
    public boolean hasPermission(Authentication auth, Object target, Object perm) {
    for (MyEvaluator evaluator : evaluators) {
    if (target instanceof evaluator.getTargetClass()) {
    return evaluator.hasPermission(auth, target, perm);
    }
    }
    throw new UnsupportedOperationException("hasPermission not supported");
    }

    }

    评估者列表将在 Spring XML 配置中定义。你怎么看?是一个好方法还是你有更好的想法?我错过了一些更合适的设计模式吗?

    最佳答案

    首先,对 Class 使用 instanceof 存在问题。您真的想在这种情况下使用 Class#isAssignableFrom (不是双关语)。但是,这并不是您问题的核心。

    对于您最初的问题,我真的很喜欢使用像 Google Guava 的 Predicate 这样的结构。 .它包含一个方法 likes(T),其中 T 是泛型类型,并返回一个 bool 值。

    创建一个新界面,例如

    interface PollablePermissionEvaulator<T> extends PermissionEvaluator, Predicate<T> {}

    然后,您可以对每个外观查询 likes(T),如果是,则调用嵌套的 hasPermission() 调用。

    关于spring - 设计模式 : evaluating security across multiple modules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8590485/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com