理论模型
系统边界
客户端——>安全系统——>服务提供者
核心实体概念
- Authonization:用户(账户)信息,包括基本信息、状态信息、权限信息。
- Authority:权限信息,鉴权时关联用户与资源的实体。可以使用角色(实现时就用角色名),也可以只是权限标识。
- 资源:需要鉴权的内容,如页面资源、静态文件资源、服务接口资源等,一般用url表示。在鉴权系统中,资源需要关联权限(或角色)。
核心步骤(流程)
- 认证 :用户名/密码登录、令牌认证。认证确定客户端身份,获取对应身份的信息。
- 鉴权:判断用户是否有访问当前资源的权限。使用认证阶段获取的身份信息(权限信息)。
框架实现
Spring Security
实现内容
Spring Security使用各种Filter在请求到达处理位置之前,执行认证、鉴权的步骤。
官网
找到个简单说明的博客
SecurityContextPersistenceFilter :
先从Session取信息,没有就新建。
UsernamePasswordAuthenticationFilter :
用户名、密码登录,填充上一步新建的对象。
AnonymousAuthenticationFilter :
没有用户信息时,生成匿名信息(ROLE_ANONYMOUS)
FilterSecurityInterceptor :鉴权处理
-
FilterInvocationSecurityMetadataSource 保存着安全系统控制的资源和资源需要的权限。
调用getAttributes(obj)
-
AccessDecisionManager 鉴定当前用户对当前资源的权限
调用decide() 使用认证阶段得到的Authentication和上一步得到的Attributes
可扩展点
Spring Security提供通过继承WebSecurityConfigurerAdapter,重写两个configure方法,来进行一些扩展。也可以添加新的Filter和禁用默认的Filter。
- 认证方式
认证方式是需要客户端和服务器端配合实现的。
客户端访问服务时,需要携带认证信息。可以使用户名+密码、令牌、授权码。
根据客户端的不同,信息携带的方式也不同:
- Web中可以保存在Header中(cookie、Authentication):保存的内容、格式、编码需要与安全系统中解析的实现相互配合。
-
资源权限管理:
资源的权限在系统启动之后是固定的。在configure中配置。
-
用户权限信息:
实现UserDetailsService接口,实现loadUserByUsername(String username) 通过用户名获取用户拥有的权限。
-
鉴权策略:
我们给资源的权限可能是多个。给用户授权时,可以选择不同的策略进行授权。
一票否决:
一票授权
多票获胜
注释
- WebAsyncManager :用于请求异步处理的管理,保证新线程使用,前线程保存的上下文,保证上下文一致。