Spring Security身份认证之UserDetailsService

zhiqian我们采用了配置文件的方式从数据库中读取用户进行登录。虽然该方式的灵活性相较于静态账号密码的方式灵活了许多,但是将数据库的结构暴露在明显的位置上,绝对不是一个明智的做法。本文通过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.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源代码跟踪调试。

时间: 2024-08-29 12:12:50

Spring Security身份认证之UserDetailsService的相关文章

Spring Security身份认证之HelloSpringSecurity

在上一篇文档中,对Spring Security中的身份认证的流程和管理进行了详细介绍,本文将从实践的角度告诉大家如何使用最简便的方式用Spring Security进行身份验证. 开发环境如下: JDK 1.7 Tomcat 7 Eclipse Spring Security 3.2.5 项目目录结构如下: 1.新建Maven Project,对Maven不熟悉的童鞋请自行充电,现在这个念头不学习Maven绝对是不行的. 2. 在Pom.xml添加相关jar依赖. <project xmlns

Spring Security身份认证之HelloSpringSecurity(附源码)

在上一篇文档中,对Spring Security中的身份认证的流程和管理进行了详细介绍,本文将从实践的角度告诉大家如何使用最简便的方式用Spring Security进行身份验证. 开发环境如下: JDK 1.7 Tomcat 7 Eclipse Spring Security 3.2.5 项目目录结构如下: 1.新建Maven Project,对Maven不熟悉的童鞋请自行充电,现在这个念头不学习Maven绝对是不行的. 2. 在Pom.xml添加相关jar依赖. <project xmlns

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

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

Spring boot +Spring Security + Thymeleaf 认证失败返回错误信息

spring boot以其众多友谊的特性,如零配置.微服务等,吸引了很多的粉丝.而其与Spring Security安全框架的无缝结合,使其具备的安全的特性.在此基础上使用Thymeleaf模板引擎进行渲染,静动态结合,让页面开发更加简单.直观. 通过表单提交登录的用户名和密码是登录接口比较常见的一种设计.在初学的过程中,我也不例外的采用个这种方式.表单设计见下图. 登录成功,完成正常的主页面跳转,这个不存在问题.存在问题的是,登录失败了该咋办呢?我就在考虑,由于thymeleaf的局部刷新操作

Spring Security 入门(1-11)Spring Security - 匿名认证

匿名认证 对于匿名访问的用户,Spring Security 支持为其建立一个匿名的 AnonymousAuthenticationToken 存放在 SecurityContextHolder 中,这就是所谓的匿名认证.这样在以后进行权限认证或者做其它操作时我们就不需要再判断 SecurityContextHolder 中持有的 Authentication 对象是否为 null 了,而直接把它当做一个正常的 Authentication 进行使用就 OK 了. 配置 使用 NameSpace

Spring Security 匿名认证

1.项目截图: 2.匿名认证配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.spri

Spring Security教程(八):用户认证流程源码详解

本篇文章主要围绕下面几个问题来深入源码: 用户认证流程 认证结果如何在多个请求之间共享 获取认证用户信息 一.用户认证流程 上节中提到Spring Security核心就是一系列的过滤器链,当一个请求来的时候,首先要通过过滤器链的校验,校验通过之后才会访问用户各种信息. 这里要说明的是在过滤器的最前端有一个SecurityContextPersistenceFilter,当请求进来和返回的时候都会经过这个过滤器,它主要存放用户的认证信息.这里先简单提一下,后面会详解. 当用户发送登录请求的时候(

Spring Security认证简介

认证简介 认证过程 用户使用用户名和密码进行登录. Spring Security 将获取到的用户名和密码封装成一个实现了 Authentication 接口的 UsernamePasswordAuthenticationToken. 将上述产生的 token 对象传递给 AuthenticationManager 进行登录认证. AuthenticationManager 认证成功后将会返回一个封装了用户权限等信息的 Authentication 对象. 通过调用 SecurityContex

Spring Security 认证过程

目录 1.1     认证过程 1.2     Web应用的认证过程 1.2.1    ExceptionTranslationFilter 1.2.2    在request之间共享SecurityContext 1.1     认证过程 1.用户使用用户名和密码进行登录. 2.Spring Security将获取到的用户名和密码封装成一个实现了Authentication接口的UsernamePasswordAuthenticationToken. 3.将上述产生的token对象传递给Aut