• 核心组件之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

     

    本博客内容参考资料均来自于网络,如有侵权,请邮箱联系,我去处理,谢谢合作。
  • 相关阅读:
    【IO流】FileInputStream FileOutputStream BufferInputStream BufferOutputStream
    [集合]集合相关简单总结
    [集合]Map的 entrySet() 详解以及用法(四种遍历map的方式)
    [集合]HashMap和Hashtable区别
    [集合]Map
    [集合Set]HashSet、LinkedHashSet TreeSet
    IOS UIView 之实例方法篇 Instance Methods
    css 让一张彩色的图片变成一张黑白图
    窗口改变的时候自动刷新浏览器
    php 交互式命令行工具
  • 原文地址:https://www.cnblogs.com/javazl/p/12439155.html
Copyright © 2020-2023  润新知