Spring Security系列之授权(Authorization)架构

文章目录

    • 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。

Spring Security系列之授权(Authorization)架构_第1张图片

AuthorizationFilter

  • AuthorizationFilter 为 HttpServletRequest 提供 authorization。它作为 Security Filters 之一被插入到 FilterChainProxy 中。
  • 当你声明一个 SecurityFilterChain 时,你可以覆盖默认的内容。不要使用 authorizeRequests,而要使用 authorizeHttpRequests。
  • 当使用 authorizeHttpRequests 而不是 authorizeRequests 时,就会使用 AuthorizationFilter 而不是 FilterSecurityInterceptor。

Spring Security系列之授权(Authorization)架构_第2张图片

  1. 首先,AuthorizationFilter 从 SecurityContextHolder 获得一个 Authentication。它将其包装在一个 Supplier 中,以便延迟查找。
  2. 其次,它将 Supplier 和 HttpServletRequest 传递给 AuthorizationManager。
  3. 如果授权被拒绝,就会抛出一个 AccessDeniedException。在这种情况下, ExceptionTranslationFilter 会处理 AccessDeniedException。
  4. 如果访问被允许,AuthorizationFilter 继续进行 FilterChain,允许应用程序正常处理。

Request Matcher

  • RequestMatcher 接口被用来确定一个请求是否符合一个给定的规则。我们使用 securityMatchers 来确定一个给定的 HttpSecurity 是否应该应用于一个给定的请求。同样,我们可以使用 requestMatchers 来确定我们应该应用于一个给定请求的授权规则。
  • securityMatcher 和 requestMatcher 方法将决定哪个 RequestMatcher 实现最适合你的应用程序。如果Spring MVC在classpath中,那么将使用 MvcRequestMatcher,否则,将使用 AntPathRequestMatcher。
  • 如果你想使用一个特定的 RequestMatcher,只需向 securityMatcher 和/或 requestMatcher 方法传递一个实现。

你知道的越多,你不知的越多。

你可能感兴趣的:(#,Spring,Security,spring,java,servlet,Spring,Security)