Evaluator Chain
评估器链是webforJ安全系统的核心。它是一个按优先级顺序排列的评估器序列,负责检查路由并利用责任链设计模式做出访问决策。理解这个链条的工作原理有助于您创建自定义评估器和排除意外的访问拒绝问题。
责任链模式
评估器链使用责任链模式,其中序列中的每个评估器可以处理导航请求或将其传递给下一个评估器。这创建了一种系统,其中安全逻辑分布在多个专门的评估器中,而不是集中在单一的单体检查器中。
当路由需要评估时,安全管理器创建一个链并从第一个评估器开始。该评估器检查路由并做出以下三种选择之一:
- 授予访问: 评估器批准此路由并立即返回。不会运行进一步的评估器。
- 拒绝访问: 评估器阻止此路由并立即返回。不会运行进一步的评估器。
- 委托: 评估器不作决策并调用
chain.evaluate()将控制权传递给下一个评估器。
这种模式允许评估器专注于特定的情况。每个评估器实现 supports(Class<?> routeClass) 来指示它处理哪些路由。例如,AnonymousAccessEvaluator 仅在路由被标记为 @AnonymousAccess 时运行,管理器不会在其他路由上调用它。
如何构建链条
安全管理器维护已注册评估器的列表,每个评估器都有一个相关的优先级。当路由需要评估时,管理器按优先级(先低后高)对评估器进行排序并创建链。
评估器通过管理器的 registerEvaluator() 方法进行注册:
// 注册内置评估器
securityManager.registerEvaluator(new DenyAllEvaluator(), 0);
securityManager.registerEvaluator(new AnonymousAccessEvaluator(), 1);
securityManager.registerEvaluator(new PermitAllEvaluator(), 2);
securityManager.registerEvaluator(new RolesAllowedEvaluator(), 3);
// 注册自定义评估器
securityManager.registerEvaluator(new SubscriptionEvaluator(), 10);
优先级决定了评估的顺序。较低的优先级优先运行,为它们提供了做出访问决策的首次机会。这对安全性非常重要,因为它允许关键评估器在宽松的评估器授予访问权限之前阻止访问。
该链是无状态的,并为每个导航请求新创建,以便一个导航的评估不会影响另一个。