zoukankan      html  css  js  c++  java
  • spring security几大核心组件

    一、SecurityContext

    安全上下文,用户通过Spring Security 的校验之后,验证信息存储在SecurityContext中

    SecurityContext接口只定义了两个方法,实际上其主要作用就是获取Authentication对象

    二、SecurityContextHolder

    SecurityContextHolder看名知义,是一个holder,用来hold住SecurityContext实例的。在典型的web应用程序中,用户登录一次,然后由其会话ID标识。服务器缓存持续时间会话的主体信息。在Spring Security中,在请求之间存储SecurityContext的责任落在SecurityContextPersistenceFilter上,默认情况下,该上下文将上下文存储为HTTP请求之间的HttpSession属性。它会为每个请求恢复上下文SecurityContextHolder,并且最重要的是,在请求完成时清除SecurityContextHolder。SecurityContextHolder是一个类,他的功能方法都是静态的(static)。

    SecurityContextHolder可以设置指定JVM策略(SecurityContext的存储策略),这个策略有三种:

    MODE_THREADLOCAL:SecurityContext 存储在线程中。

    MODE_INHERITABLETHREADLOCAL:SecurityContext 存储在线程中,但子线程可以获取到父线程中的 SecurityContext。

    MODE_GLOBAL:SecurityContext 在所有线程中都相同。

    SecurityContextHolder默认使用MODE_THREADLOCAL模式,即存储在当前线程中。

    三、Authentication

    authentication 直译过来是“认证”的意思,在Spring Security 中Authentication用来表示当前用户是谁,一般来讲你可以理解为authentication就是一组用户名密码信息。Authentication也是一个接口。

    接口有4个get方法,分别获取

    Authorities, 填充的是用户角色信息。

    Credentials,直译,证书。填充的是密码。

    Details ,用户信息。

    Principal 直译,形容词是“主要的,最重要的”,名词是“负责人,资本,本金”。感觉很别扭,所以,还是不翻译了,直接用原词principal来表示这个概念,其填充的是用户名。

    因此可以推断其实现类有这4个属性。这几个方法作用如下:

    getAuthorities: 获取用户权限,一般情况下获取到的是用户的角色信息。

    getCredentials: 获取证明用户认证的信息,通常情况下获取到的是密码等信息。

    getDetails: 获取用户的额外信息,(这部分信息可以是我们的用户表中的信息)

    getPrincipal: 获取用户身份信息,在未认证的情况下获取到的是用户名,在已认证的情况下获取到的是 UserDetails (UserDetails也是一个接口,里边的方法有getUsername,getPassword等)。

    isAuthenticated: 获取当前 Authentication 是否已认证。

    setAuthenticated: 设置当前 Authentication 是否已认证(true or false)。

    四、UserDetails

    UserDetails,看命知义,是用户信息的意思。其存储的就是用户信息

    其接口方法含义如下:

    getAuthorites:获取用户权限,本质上是用户的角色信息。

    getPassword: 获取密码。

    getUserName: 获取用户名。

    isAccountNonExpired: 账户是否过期。

    isAccountNonLocked: 账户是否被锁定。

    isCredentialsNonExpired: 密码是否过期。

    isEnabled: 账户是否可用。

    五、UserDetailsService

    提到了UserDetails就必须得提到UserDetailsService, UserDetailsService也是一个接口,且只有一个方法loadUserByUsername,他可以用来获取UserDetails。

    通常在spring security应用中,我们会自定义一个CustomUserDetailsService来实现UserDetailsService接口,并实现其public UserDetails loadUserByUsername(final String login);方法。我们在实现loadUserByUsername方法的时候,就可以通过查询数据库(或者是缓存、或者是其他的存储形式)来获取用户信息,然后组装成一个UserDetails,(通常是一个org.springframework.security.core.userdetails.User,它继承自UserDetails) 并返回。

    在实现loadUserByUsername方法的时候,如果我们通过查库没有查到相关记录,需要抛出一个异常来告诉spring security来“善后”。这个异常是org.springframework.security.core.userdetails.UsernameNotFoundException。

    六、AuthenticationManager

    AuthenticationManager 的作用就是校验Authentication,如果验证失败会抛出AuthenticationException异常。AuthenticationException是一个抽象类,因此代码逻辑并不能实例化一个AuthenticationException异常并抛出,实际上抛出的异常通常是其实现类,如DisabledException,LockedException,BadCredentialsException等。BadCredentialsException可能会比较常见,即密码错误的时候。

  • 相关阅读:
    Spring Boot 使用 Dom4j XStream 操作 Xml
    Spring Boot 使用 JAX-WS 调用 WebService 服务
    Spring Boot 使用 CXF 调用 WebService 服务
    Spring Boot 开发 WebService 服务
    Spring Boot 中使用 HttpClient 进行 POST GET PUT DELETE
    Spring Boot Ftp Client 客户端示例支持断点续传
    Spring Boot 发送邮件
    Spring Boot 定时任务 Quartz 使用教程
    Spring Boot 缓存应用 Memcached 入门教程
    ThreadLocal,Java中特殊的线程绑定机制
  • 原文地址:https://www.cnblogs.com/uzxin/p/11933954.html
Copyright © 2011-2022 走看看