UserDetails接口
是什么:userDetails => Spring Security基础接口,包含某个用户的账号,密码,权限,状态(是否锁定)等信息。只有getter方法。 相当于定义一个规范,作用主要是用来和数据库做交互用的。简单来说,就是用户名传过来,这个类负责校验用户名是否存在业务逻辑。Security这个框架不管你的应用时怎么存储用户和权限信息的。只要你取出来的时候把它包装成一个UserDetails对象给我用就可以了。
怎么用:只需要在包含用户信息实体类上实现这个接口,并重写里面的方法,下面接口里面的方法:
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.springframework.security.core.userdetails; import java.io.Serializable; import java.util.Collection; import org.springframework.security.core.GrantedAuthority;
public interface UserDetails extends Serializable {
//返回用户的所有角色
Collection<? extends GrantedAuthority> getAuthorities(); String getPassword(); String getUsername();
//账户是否未过期
boolean isAccountNonExpired();
//账户是否未锁定
boolean isAccountNonLocked();
//凭证是否未过期
boolean isCredentialsNonExpired();
//账户是否可用
boolean isEnabled();
}
UserDetails用来做什么?为什么还要带上权限集合?
把这些信息取出来,然后包装成一个对象交由框架去认证。
登录成功后也不是什么都能访问的,还要根据你所拥有的权限进行判断。有权限你才能访问特定的对象。Security框架是这样设计的,即认证成功后,就把用户信息和拥有的权限都存储在SecurityContext中,当访问受保护资源(某个对象/方法)的时候,就把权限拿出来比对,看看是否满足。
什么时候提供UserDetails信息,怎么提供?
那肯定是认证的时候。其实认证的操作,框架都已经帮你实现了,它所需要的只是,你给我提供获取信息的方式。所以它就定义一个接口,然后让你去实现,实现好了之后再注入给它。
框架提供一个UserDetailsService接口用来加载用户信息。
UserDetailsService里面只有一个方法,作用就是通过username查询用户的信息。
package org.springframework.security.core.userdetails; public interface UserDetailsService { UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException; }
获取到用户信息后,注入到哪里去呢?
那肯定是注入到认证处理类中的,框架利用AuthenticationManager(接口)来进行认证。
总结:UserDetailService只单纯地负责存取用户信息,除了给框架内的其他组件提供数据外没有其他功能。而认证过程是由AuthenticationManager来完成的。
文章参考自外部博客:https://www.cnblogs.com/longfurcat/archive/2018/08/04/9417358.html