天天看点

对Spring Security理解

理论模型

系统边界

客户端——>安全系统——>服务提供者
           

核心实体概念

  1. Authonization:用户(账户)信息,包括基本信息、状态信息、权限信息。
  2. Authority:权限信息,鉴权时关联用户与资源的实体。可以使用角色(实现时就用角色名),也可以只是权限标识。
  3. 资源:需要鉴权的内容,如页面资源、静态文件资源、服务接口资源等,一般用url表示。在鉴权系统中,资源需要关联权限(或角色)。

核心步骤(流程)

  1. 认证 :用户名/密码登录、令牌认证。认证确定客户端身份,获取对应身份的信息。
  2. 鉴权:判断用户是否有访问当前资源的权限。使用认证阶段获取的身份信息(权限信息)。

框架实现

Spring Security

实现内容

Spring Security使用各种Filter在请求到达处理位置之前,执行认证、鉴权的步骤。

官网

找到个简单说明的博客

SecurityContextPersistenceFilter :

先从Session取信息,没有就新建。
           

UsernamePasswordAuthenticationFilter :

用户名、密码登录,填充上一步新建的对象。
           

AnonymousAuthenticationFilter :

没有用户信息时,生成匿名信息(ROLE_ANONYMOUS)
           

FilterSecurityInterceptor :鉴权处理

  1. FilterInvocationSecurityMetadataSource 保存着安全系统控制的资源和资源需要的权限。

    调用getAttributes(obj)

  2. AccessDecisionManager 鉴定当前用户对当前资源的权限

    调用decide() 使用认证阶段得到的Authentication和上一步得到的Attributes

可扩展点

Spring Security提供通过继承WebSecurityConfigurerAdapter,重写两个configure方法,来进行一些扩展。也可以添加新的Filter和禁用默认的Filter。

  1. 认证方式

认证方式是需要客户端和服务器端配合实现的。

客户端访问服务时,需要携带认证信息。可以使用户名+密码、令牌、授权码。

根据客户端的不同,信息携带的方式也不同:

  1. Web中可以保存在Header中(cookie、Authentication):保存的内容、格式、编码需要与安全系统中解析的实现相互配合。
  1. 资源权限管理:

    资源的权限在系统启动之后是固定的。在configure中配置。

  2. 用户权限信息:

    实现UserDetailsService接口,实现loadUserByUsername(String username) 通过用户名获取用户拥有的权限。

  3. 鉴权策略:

    我们给资源的权限可能是多个。给用户授权时,可以选择不同的策略进行授权。

    一票否决:

    一票授权

    多票获胜

注释

  1. WebAsyncManager :用于请求异步处理的管理,保证新线程使用,前线程保存的上下文,保证上下文一致。