- 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。
网友评论