文章目录
- AuthorizationManager
- AuthorizationFilter
- Request Matcher
AuthorizationManager
- AuthorizationManager 被授 AuthorizationFilter 调用,负责做出最终的访问控制决定。AuthorizationManager 接口包含两个方法。
default void verify(Supplier<Authentication> authentication, T object) {
AuthorizationDecision decision = check(authentication, object);
if (decision != null && !decision.isGranted()) {
throw new AccessDeniedException("Access Denied");
}
}
@Nullable
AuthorizationDecision check(Supplier<Authentication> authentication, T object);
- AuthorizationManager 的检查方法被传递给它所需要的所有相关信息,以便做出授权决定。特别是,传递安全对象(secure Object)使那些包含在实际安全对象调用中的参数能够被检查到。例如,让我们假设安全对象是一个 MethodInvocation。查询 MethodInvocation 的任何客户参数是很容易的,然后在 AuthorizationManager 中实现某种安全逻辑以确保委托人(principal)被允许对该客户进行操作。如果访问被授予,实现应返回 “negative” 的 AuthorizationDecision,如果访问被拒绝,应返回 “negative” 的 AuthorizationDecision,如果不作出决定,则返回空的 AuthorizationDecision。
- verify 调用 check,然后在出现 “negative” 的 AuthorizationDecision 决定时抛出一个 AccessDeniedException。
AuthorizationFilter
- AuthorizationFilter 为 HttpServletRequest 提供 authorization。它作为 Security Filters 之一被插入到 FilterChainProxy 中。
- 当你声明一个 SecurityFilterChain 时,你可以覆盖默认的内容。不要使用 authorizeRequests,而要使用 authorizeHttpRequests。
- 当使用 authorizeHttpRequests 而不是 authorizeRequests 时,就会使用 AuthorizationFilter 而不是 FilterSecurityInterceptor。
- 首先,AuthorizationFilter 从 SecurityContextHolder 获得一个 Authentication。它将其包装在一个 Supplier 中,以便延迟查找。
- 其次,它将 Supplier 和 HttpServletRequest 传递给 AuthorizationManager。
- 如果授权被拒绝,就会抛出一个 AccessDeniedException。在这种情况下, ExceptionTranslationFilter 会处理 AccessDeniedException。
- 如果访问被允许,AuthorizationFilter 继续进行 FilterChain,允许应用程序正常处理。
Request Matcher
- RequestMatcher 接口被用来确定一个请求是否符合一个给定的规则。我们使用 securityMatchers 来确定一个给定的 HttpSecurity 是否应该应用于一个给定的请求。同样,我们可以使用 requestMatchers 来确定我们应该应用于一个给定请求的授权规则。
- securityMatcher 和 requestMatcher 方法将决定哪个 RequestMatcher 实现最适合你的应用程序。如果Spring MVC在classpath中,那么将使用 MvcRequestMatcher,否则,将使用 AntPathRequestMatcher。
- 如果你想使用一个特定的 RequestMatcher,只需向 securityMatcher 和/或 requestMatcher 方法传递一个实现。
你知道的越多,你不知的越多。