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