Spring Security 笔记

目录

Authentication和Authorization

这两个单词很容易混淆。Authentication是认证的意思,用来确定“你是谁”,而Authorization是授权的意思,用来确定“允许你做什么”。

Authentication

主要接口是AuthenticationManager,只有一个方法:

public interface AuthenticationManager {
	Authentication authenticate(Authentication authentication) throws AuthenticationException;
}

AuthenticationManager可以做三件事:

  • 如果可以验证输入是有效的,则返回Authentication
  • 如果无法验证输入是有效的,则抛出一个异常AuthenticationException
  • 如果无法决定,则返回null

最常用的AuthenticationManager实现是ProviderManager,它委托一系列的AuthenticationProvider实例。AuthenticationProvider有点像AuthenticationManager,但是它提供一个额外的方法允许调用者查询它是否支持给定的Authentication类型:

public interface AuthenticationProvider {
	Authentication authenticate(Authentication authentication) throws AuthenticationException;
    // Class<?> extends Authentication>
	boolean supports(Class<?> authentication);
}

在一个应用程序中,ProviderManager通过委托一系列的AuthenticationProviders可以支持多种不同的认证机制。如果ProviderManager不识别某种特别的Authentication实例类型,它会跳过。

ProviderManager有一个可选的父类,如果所有的提供者都返回null,它将咨询它。如果父类不存在,null Authentication将会产生一个AuthenticationException

有时候,一个应用程序有一些逻辑的资源保护组(比如,所有匹配/api/**路径规则的资源),并且每个组可以有自己特定的AuthenticationManager。通常,他们中的每一个都是ProviderManager,并且他们共享一个父类。父类是一种全局的资源,扮演着所有提供者的fallback。

参考

https://spring.io/guides/topicals/spring-security-architecture