核心组件之UserDetailService的详解

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

 

猜你喜欢

转载自www.cnblogs.com/javazl/p/12439155.html