框架问题实际上解决的是生活中的问题。
登录有两个很重要的概念:Principle(人) 和 Credential(密码、刷脸)。
权限领域主要是解决两大问题:Authentication(认证问题) 和 Authorization(授权问题)。
门票、刷脸等都可以被称为一个认证对象。
Authentication 是一个接口,接口对应一个抽象的令牌。
对一个门口,存在一个门卫,只处理工作证。
对另外一个门,可能存在一个门卫,只处理门票。
在 SpringSecurity 中,用 filter 来代表每一个入口。
Filter1 专门用来处理门票,Filter2 专门用来处理工作证,Filter3 专门用来处理指纹。
那假如一个人由一张票,那么应由谁来处理呢?由 Provider 来处理,即 Provider 对应认证处理 token。具体表现为每个 filter 找到对应处理的 provider 来处理。
每个 filter 都要去找 provider 会非常麻烦,有一个设计模式称为门面模式。
在程序中,通常使用 ProviderManager 来管理和协调。
除了 ProviderManager 外,还有一个 AuthenticationManager,用来找到 ProviderManager。
领域设计=面向对象设计
认证就是 Token -> filter -> provider。
授权也是如此,即把 provider 提供的结果放入上下文中。
对于授权,会有一个 AccessManager(访问控制器) 的概念,即授权认证通过了,需要根据上下文进行访问控制。
AccessManager 会抽象出一个 Voter(投票器)的概念。
Voter 执行多数通过策略或一致通过策略,这在代码中通常通过 @Securied 或 @PreAuth 注解来实现。
用户在输入用户名和密码在登录后会得到一个 token。
相当于用户看比赛中途想要到场外上厕所,这时候工作人员给用户颁发了一个临时通行证。
再回来后,就需要临时通行证(token)来认证。
oauth 相当于再加一个门。