详解Spring Security进阶身份认证之UserDetailsService(附源码)
在上一篇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 如不能正常运行,点这里看看源代码吧。
详解Spring Security进阶身份认证之UserDetailsService(附源码)相关推荐
- PyQt5 + Python3.7 + OpenCV人脸识别身份认证系统(附源码)
基于PyQt5 + Python3.7 + OpenCV实现的人脸识别身份认证系统,附源码. 技术选型 PyQt5 + Python3.7 + OpenCV 功能概述 实现人员注册,信息修改,人脸识别 ...
- 详解Spring Security的formLogin登录认证模式
详解Spring Security的formLogin登录认证模式 一.formLogin的应用场景 在本专栏之前的文章中,已经给大家介绍过Spring Security的HttpBasic模式,该模 ...
- java按钮权限控制_详解Spring Security 中的四种权限控制方式
Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...
- 区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-熊丽兵-专题视频课程...
区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-103人已学习 课程介绍 区块链开发技术进阶-深入详解以太坊智能合约语言 solidity视频培训教程:本课程是 ...
- 详解非局部均值滤波原理以及用MATLAB源码实现
详解非局部均值滤波原理以及用MATLAB源码实现 序言 均值滤波.中值滤波.高斯滤波在滤除噪声的过程中,无可避免的使图像的边缘细节和纹理信息所被滤除.针对此问题,Buades[1]等人提出了非局部均值 ...
- 大白话详解Spring Security认证流程
前言 Spring Seuciry相关的内容看了实在是太多了,但总觉得还是理解地不够巩固,还是需要靠知识输出做巩固. 相关版本: java: jdk 8 spring-boot: 2.1.6.RELE ...
- 【Spring Security】的RememberMe功能流程与源码详解
文章目录 前言 原理 基础版 搭建 初始化sql 依赖引入 配置类 验证 源码分析 进阶版 集成 源码分析 疑问1 疑问2 鉴权 升级版 集成 初始化sql 配置类 验证 源码分析 鉴权 流程 扩展版 ...
- 转用PHP开发企业Wifi网络Web认证系统(附源码)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://beastwu.blog.51cto.com/5091229/865707 本案是 ...
- 用PHP开发企业Wifi网络Web认证系统(附源码)
文字转载自https://blog.51cto.com/beastwu/865707 本案是为客户的合作单位开发的无线网络的网页认证系统. 本系统实现基于Web的Windows Active Dire ...
最新文章
- Linux文件的切分和结合
- 嵌入式实训-day1
- php 使用fseek指针读取大文件日志
- ajax瀑布流 dede,dedecms加载更多,无限下拉瀑布流插件
- 影创SDK☀️一、本专栏概述及资源地址
- 快速学习Spring Boot
- 在excel中如何筛选重复数据_Excel 在大量数据中快速筛选出重复数据
- 网络攻击与防御(一)
- HiveServer2服务简介
- 北京内推 | 中科院自动化所招聘机器视觉感知与理解算法工程师/实习生
- 面试题:高频前端面试题之CSS篇
- 时间序列分解法(Time-series Decomposition)
- firefox 详细配置文件 及 密码解析
- 家里的WiFi连不上?我们可以自行修复么?
- 智能汽车滑板底盘,伪命题?两家上市公司市值「腰斩」
- 产品经理/互联网非技术岗如何写一份好的简历?
- multism中ui和uo应该怎么表示_如何求该运算放大电路uo和ui的关系表达式?
- UTF-8、UTF-16、UTF-32编码的相互转换
- 小米手机关闭广告的方法
- ps 置换滤镜制作文字人像