zoukankan      html  css  js  c++  java
  • spring-security查询数据库源码解析

    版本是2.1.0.RELEASE;

    创建UsernamePasswordAuthenticationToken

    private final AuthenticationManagerBuilder authenticationManagerBuilder;
    UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
    Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
    

    参数解析:
    username和password是前端传过来的

    点进去authenticate()方法,有多个实现类,选择ProviderManager

    image
    image

    继续点进去authenticate()方法,有多个实现类,选择AbstractUserDetailsAuthenticationProvider

    image
    首先是有一个判断,从Cache中取,实现类走的是NullUserCache;如果返回null,调用receiveUser方法;如果不是返回null,则检查user是否正确;
    image
    image
    我们这里返回null,所以走的是receiveUser,点进去;
    image

    点进去loadUserByUsername()方法

    找到我们自己的实现类UserDetailsServiceImpl,实现了UserDetailsService该接口;
    image
    这个方法是我们自己重写的;
    image
    先判断是否配置登录缓存,有缓存的话,直接get就行;
    image
    如果没有缓存,会先查询数据库,然后再次放入缓存,方便下次直接取出;
    image

    跳出loadUserByUsername,在跳出receiveUser,继续往下走

    image
    调用的是该实现类AbstractUserDetailsAuthenticationProvider的内部类DefaultPreAuthenticationChecks的check方法;该check方法检查的就是用户是否锁定,是否被禁用,是否超时;
    image
    进去additionalAuthenticationChecks方法,对比密码是否匹配
    就是检查前端传过来的password和通过username查出来的password是否一样,不一样则抛出异常;
    image
    再检查凭证是否超时
    image
    image
    最后就是依据正确的信息创建Authentication
    image

  • 相关阅读:
    网络嗅探与协议分析之验收题
    20199121《网络攻防实践》第四周作业
    如何设计一个卡方检验
    20199121《网络攻防实践》第三周作业
    openssl制作证书全过程及https实现
    Padding Oracle攻击解密AES
    virt-sysprep命令清理缓存文件时失败的解决方法
    OpenStack的centos镜像制作
    KVM--Host does not support any virtualization...
    Centos7 安装VNC实现远程桌面
  • 原文地址:https://www.cnblogs.com/kaka-qiqi/p/14771242.html
Copyright © 2011-2022 走看看