在上一篇Spring Security身份认证博文中,我们采用了配置文件的方式从数据库中读取用户进行登录。虽然该方式的灵活性相较于静态账号密码的方式灵活了许多,但是将数据库的结构暴露在明显的位置上,绝对不是一个明智的做法。本文通过Java代码实现UserDetailsService接口来实现身份认证。

1.1 UserDetailsService在身份认证中的作用

Spring Security中进行身份验证的是AuthenticationManager接口,ProviderManager是它的一个默认实现,但它并不用来处理身份认证,而是委托给配置好的AuthenticationProvider,每个AuthenticationProvider会轮流检查身份认证。检查后或者返回Authentication对象或者抛出异常。

验证身份就是加载响应的UserDetails,看看是否和用户输入的账号、密码、权限等信息匹配。此步骤由实现AuthenticationProvider的DaoAuthenticationProvider(它利用UserDetailsService验证用户名、密码和授权)处理。包含 GrantedAuthority 的 UserDetails对象在构建 Authentication对象时填入数据。

1.2 配置UserDetailsService

1.2.1 更改Spring-Security.xml中身份的方式,使用自定义的UserDetailsService。

1
<span style="font-family:arial, helvetica, sans-serif;"><security:authentication-manager><br>  <security:authentication-provider user-service-ref="favUserDetailService"><br>      </security:authentication-provider><br> </security:authentication-manager><br><br> <bean id="favUserDetailService" class="com.favccxx.favsecurity.security.FavUserDetailService" /><br></span>

1.2.2 新建FavUserDetailsService.java,实现UserDetailsService接口。为了降低学习的难度,这里并没有与数据库进行集成,而是采用模拟从数据库中获取用户的方式进行身份验证。示例代码如下:

1
<span style="font-family:arial, helvetica, sans-serif;">package com.favccxx.favsecurity.security;<br><br>import java.util.ArrayList;<br>import java.util.Collection;<br>import java.util.List;<br><br>import org.apache.logging.log4j.LogManager;<br>import org.apache.logging.log4j.Logger;<br>import org.springframework.security.core.GrantedAuthority;<br>import org.springframework.security.core.authority.SimpleGrantedAuthority;<br>import org.springframework.security.core.userdetails.User;<br>import org.springframework.security.core.userdetails.UserDetails;<br>import org.springframework.security.core.userdetails.UserDetailsService;<br>import org.springframework.security.core.userdetails.UsernameNotFoundException;<br><br>public class FavUserDetailService implements UserDetailsService {<br><br> private static final Logger logger = LogManager.getLogger(FavUserDetailService.class);<br><br>  /**<br>  * 根据用户名获取用户 - 用户的角色、权限等信息<br>   */<br> public UserDetails loadUserByUsername(String username)<br>          throws UsernameNotFoundException {<br>      UserDetails userDetails = null;<br>     try {<br>           com.favccxx.favsecurity.pojo.User favUser = new com.favccxx.favsecurity.pojo.User();<br>            favUser.setUsername("favccxx");<br>         favUser.setPassword("favccxx");<br>         Collection<GrantedAuthority> authList = getAuthorities();<br>         userDetails = new User(username, favUser.getPassword().toLowerCase(),true,true,true,true,authList);<br>     } catch (Exception e) {<br>         e.printStackTrace();<br>        }<br><br><br>       return userDetails;<br> }<br><br>   /**<br>  * 获取用户的角色权限,为了降低实验的难度,这里去掉了根据用户名获取角色的步骤<br>     * @param <br>   * @return<br>   */<br> private Collection<GrantedAuthority> getAuthorities(){<br>        List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>();  <br>     authList.add(new SimpleGrantedAuthority("ROLE_USER")); <br>     authList.add(new SimpleGrantedAuthority("ROLE_ADMIN"));<br><br>     return authList;<br>    }<br><br><br><br>}<br></span>

1.2.3 启动应用服务器,只要用户名和密码不全是favccxx,就会产生下面的错误。

用户名和密码都输入favccxx,则登陆成功

1.3 跟踪UserDetailsService。

身份认证的调用流程图如下,用户可下载Spring Security源代码跟踪调试。

1.4 如不能正常运行,点这里看看源代码吧。

本文转自 genuinecx 51CTO博客,原文链接:http://blog.51cto.com/favccxx/1609692,如需转载请自行联系原作者

详解Spring Security进阶身份认证之UserDetailsService(附源码)相关推荐

  1. PyQt5 + Python3.7 + OpenCV人脸识别身份认证系统(附源码)

    基于PyQt5 + Python3.7 + OpenCV实现的人脸识别身份认证系统,附源码. 技术选型 PyQt5 + Python3.7 + OpenCV 功能概述 实现人员注册,信息修改,人脸识别 ...

  2. 详解Spring Security的formLogin登录认证模式

    详解Spring Security的formLogin登录认证模式 一.formLogin的应用场景 在本专栏之前的文章中,已经给大家介绍过Spring Security的HttpBasic模式,该模 ...

  3. java按钮权限控制_详解Spring Security 中的四种权限控制方式

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...

  4. 区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-熊丽兵-专题视频课程...

    区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-103人已学习 课程介绍         区块链开发技术进阶-深入详解以太坊智能合约语言 solidity视频培训教程:本课程是 ...

  5. 详解非局部均值滤波原理以及用MATLAB源码实现

    详解非局部均值滤波原理以及用MATLAB源码实现 序言 均值滤波.中值滤波.高斯滤波在滤除噪声的过程中,无可避免的使图像的边缘细节和纹理信息所被滤除.针对此问题,Buades[1]等人提出了非局部均值 ...

  6. 大白话详解Spring Security认证流程

    前言 Spring Seuciry相关的内容看了实在是太多了,但总觉得还是理解地不够巩固,还是需要靠知识输出做巩固. 相关版本: java: jdk 8 spring-boot: 2.1.6.RELE ...

  7. 【Spring Security】的RememberMe功能流程与源码详解

    文章目录 前言 原理 基础版 搭建 初始化sql 依赖引入 配置类 验证 源码分析 进阶版 集成 源码分析 疑问1 疑问2 鉴权 升级版 集成 初始化sql 配置类 验证 源码分析 鉴权 流程 扩展版 ...

  8. 转用PHP开发企业Wifi网络Web认证系统(附源码)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://beastwu.blog.51cto.com/5091229/865707 本案是 ...

  9. 用PHP开发企业Wifi网络Web认证系统(附源码)

    文字转载自https://blog.51cto.com/beastwu/865707 本案是为客户的合作单位开发的无线网络的网页认证系统. 本系统实现基于Web的Windows Active Dire ...

最新文章

  1. Linux文件的切分和结合
  2. 嵌入式实训-day1
  3. php 使用fseek指针读取大文件日志
  4. ajax瀑布流 dede,dedecms加载更多,无限下拉瀑布流插件
  5. 影创SDK☀️一、本专栏概述及资源地址
  6. 快速学习Spring Boot
  7. 在excel中如何筛选重复数据_Excel 在大量数据中快速筛选出重复数据
  8. 网络攻击与防御(一)
  9. HiveServer2服务简介
  10. 北京内推 | 中科院自动化所招聘机器视觉感知与理解算法工程师/实习生
  11. 面试题:高频前端面试题之CSS篇
  12. 时间序列分解法(Time-series Decomposition)
  13. firefox 详细配置文件 及 密码解析
  14. 家里的WiFi连不上?我们可以自行修复么?
  15. 智能汽车滑板底盘,伪命题?两家上市公司市值「腰斩」
  16. 产品经理/互联网非技术岗如何写一份好的简历?
  17. multism中ui和uo应该怎么表示_如何求该运算放大电路uo和ui的关系表达式?
  18. UTF-8、UTF-16、UTF-32编码的相互转换
  19. 小米手机关闭广告的方法
  20. ps 置换滤镜制作文字人像

热门文章

  1. Android 布局
  2. 深度学习优化器演化史
  3. nodejs,python,sublime和Eclipse的包管理器 1
  4. 三十天学不会TCP,UDP/IP网络编程-IP头格式祥述
  5. Spring 当一个接口多个实现时,怎么注入
  6. 精和泛的一点思考(跨学科思维)
  7. 使用ImageMagick和Tesseract进行简单数字图像识别
  8. 内存越界访问保护 内存泄漏研究 未完待续
  9. 在外键上创建索引V1.0
  10. OSX下解决PIL的IOError: decoder jpeg not available 问题