zoukankan      html  css  js  c++  java
  • 核心组件之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

     

    本博客内容参考资料均来自于网络,如有侵权,请邮箱联系,我去处理,谢谢合作。
  • 相关阅读:
    2013级机试D题解析
    关于C# 委托(delegate)与事件(event)的用法及事例
    ASP.NET 简单的柱形图实现(附带示例)
    jQuery 关于IE9上传文件无法进入后台问题的原因及解决办法(ajaxfileupload.js第四弹)
    jQuery 自制上传头像插件-附带Demo实例(ajaxfileupload.js第三弹)
    jQuery 关于ajaxfileupload.js插件的逐步解析(ajaxfileupload.js第二弹)
    ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)
    jQuery 表格中实现“删除线”的增进方法
    Skype坑爹报错:“旧版本无法删除,请联络您的技术支持小组 ”的解决办法
    ASP.NET Button控件的UseSubmitBehavior属性引发的血案
  • 原文地址:https://www.cnblogs.com/javazl/p/12439155.html
Copyright © 2011-2022 走看看