Spring Security核心组件

  • SecurityContextHolder、SecurityContext and Authentication Objects
  • UserDetailsService
  • GrantedAuthority

SecurityContextHolder、SecurityContext、Authentication

SecurityContextHolder是最基础的核心组件,它内部存储着当前用户的基本信息。默认情况下,使用ThreadLocal来保存这些信息。

获取当前用户信息

Spring Security在SecurityContextHolder中存储当前用户的信息(Authentication对象),获取当前用户信息也就是要获取Authentication对象,在应用的任何地方,都可以使用如下代码获取当前用户名:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
    String username = ((UserDetails)principal).getUsername();
} else {
    String username = principal.toString();
}

UserDetailsService

  • 从上述代码中,我们知道,可以从Authentication获取用户信息,用户其实就是一个Object,它可以被强制转换为UserDetails。
  • UserDetails是Spring Security的一个核心接口,他能代表一个当前用户。
  • 可以将UserDetails当作是从数据库中的用户表到SecurityContextHolder中的用户信息的一个适配接口。

那么,我们如何为Spring Security提供UserDetails信息?
答案是实现UserDetailsService接口。接口函数:UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

GrantedAuthority

除了用户信息,Authentication还可提供权限信息(使用GrantedAuthority来描述),使用getAuthorities()函数获取GrantedAuthority对象。

总结

  • SecurityContextHolder:从SecurityContextHolder可获取SecurityContext。
  • SecurityContext:包含Authentication信息。
  • Authentication:包含用户和权限信息。
  • GrantedAuthority:包含权限信息。
  • UserDetails:包含用户信息。
  • UserDetailsService:用户输入账号密码后创建UserDetails。

你可能感兴趣的:(Spring Security核心组件)