Security身份认证之UserDetailsService[通俗易懂]

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

大家好,又见面了,我是你们的朋友全栈君。

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

1.1 UserDetailsService在身份认证中的作用

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

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

1.2 配置UserDetailsService
1.2.1 更改Spring-Security.xml中身份的方式,使用自定义的UserDetailsService。
<security:authentication-manager> 
	<security:authentication-provider user-service ref="favUserDetailService">     
	</security:authentication-provider>
</security:authentication-manager>
<bean id="favUserDetailService" class="com.favccxx.favsecurity.security.FavUserDetailService" />
1.2.2 新建FavUserDetailsService.java,实现UserDetailsService接口。为了降低学习的难度,这里并没有与数据库进行集成,而是采用模拟从数据库中获取用户的方式进行身份验证。示例代码如下:
package com.favccxx.favsecurity.security;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
 
public class FavUserDetailService implements UserDetailsService { 
   
	private static final Logger logger = LogManager.getLogger(FavUserDetailService.class);  
	/** * 根据用户名获取用户 - 用户的角色、权限等信息 */
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
         
		UserDetails userDetails = null;     
		try { 
              
			com.favccxx.favsecurity.pojo.User favUser = new com.favccxx.favsecurity.pojo.User();            
			favUser.setUsername("favccxx");        
			favUser.setPassword("favccxx");         
			Collection<GrantedAuthority> authList = getAuthorities();         
			userDetails = new User(username, favUser.getPassword().toLowerCase(),true,true,true,true,authList);     
		}catch (Exception e) { 
            
			e.printStackTrace();        
		}       
		return userDetails; 
	}
	/** * 获取用户的角色权限,为了降低实验的难度,这里去掉了根据用户名获取角色的步骤 * @param * @return */ 
	private Collection<GrantedAuthority> getAuthorities(){ 
           
		List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>();       
		authList.add(new SimpleGrantedAuthority("ROLE_USER"));      
		authList.add(new SimpleGrantedAuthority("ROLE_ADMIN"));     
		return authList;    
	}
}

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

Security身份认证之UserDetailsService[通俗易懂]

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

Security身份认证之UserDetailsService[通俗易懂]

1.3 跟踪UserDetailsService。

身份认证的调用流程图如下,用户可下载Spring Security源代码跟踪调试。
Security身份认证之UserDetailsService[通俗易懂]

本文转自:[Spring Security身份认证之UserDetailsService](https://blog.csdn.net/shehun1/article/details/45394405)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125133.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java单例模式中双重检查锁的问题

    Java单例模式中双重检查锁的问题单例创建模式是一个通用的编程习语。和多线程一起使用时,必需使用某种类型的同步。在努力创建更有效的代码时,Java程序员们创建了双重检查锁定习语,将其和单例创建模式一起使用,从而限制同步代码量。然而,由于一些不太常见的Java内存模型细节的原因,并不能保证这个双重检查锁定习语有效。它偶尔会失败,而不是总失败。此外,它失败的原因并不明显,还包含Java内存模型的一些隐秘细节。这些事实将导致代

  • 怎么修改Ubuntu更新源服务器为国内地址

    怎么修改Ubuntu更新源服务器为国内地址 Ubuntu系统安装完默认更新源是国外服务器,总所周知的原因我天朝连接外国的速度那是很有讲究的,如果偶尔用用Ubuntu也就无所谓了,但是经常使用肯定会让你崩溃的,国内国外速度相差十倍都不止。更新源地址也很简单,有两种方法,一种是如果安装了图形界面,通过配置中心来更改是很方便的;还有一种就是纯服务器版,没有图形界面通过更改配置文件来更换源地址,并且命令行的方法可以随意添加任何可用的更新源地址,…

  • jdbctemplate常用方法_cannot create jdbc driver of

    jdbctemplate常用方法_cannot create jdbc driver of/*StreamTypeEnumValues*/varadTypeBinary=1;varadTypeText=2;/*LineSeparatorEnumValues*/varadLF=10;varadCR=13;varadCRLF=-1;/*StreamWriteEnumValues*/varadWriteChar=0;varadWriteLin…

    2022年10月14日
  • perl正则表达式中文问题

    perl正则表达式中文问题
     
    在使用perl从地址中提取街道的时候遇到了个很诡异的问题
    同样一个地址,连续进行两次匹配出来的结果居然不一样
    一次是正常的,一次是乱码,搞了半天没弄明白是怎么回事
    看来perl的中文处理能力还是有待加强
    后来在进行正则匹配之前尝试用了useencoding”gbk”; 
    还算运气不错,居然搞定了
    useencoding”gbk”; 
    $address=~/^(.*(市|区))?(.*?(街|路|道)).*

  • Junit单元测试教程_单元测试调试react源码

    Junit单元测试教程_单元测试调试react源码如果你只会使用@Test来完成单元测试,那你是时候该深入一下了,其实知识点一点都不少!

    2022年10月10日
  • python 随机函数的具体各种使用

    python 随机函数的具体各种使用

    2021年11月10日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号