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)

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • opc服务器消息通知代码,OPC 服务器 操作示例源码

    opc服务器消息通知代码,OPC 服务器 操作示例源码【实例简介】TestOPC【实例截图】【核心代码】usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingHaiGrang.Package.OpcNetApiChs.DaNet;usingHaiGrang.Package.OpcNetApiChs.Opc;usingHaiGr…

    2022年6月20日
    28
  • sql数据库回滚操作_sql回滚语句 rollback

    sql数据库回滚操作_sql回滚语句 rollbackcreatetable testtable(idnvchart(50)primkey,namenvchart(50),remarknvchart(50))select*fromtesttable go BEGINTRY –SQLServer需要显示的定义开始一个事务.BEGINTRANSACTION;–插入2条同样的数据

    2022年8月30日
    3
  • 【Java入门练习100例】07.各数字的和——取余运算

    【Java入门练习100例】07.各数字的和——取余运算除法运算取余运算

    2022年5月1日
    60
  • 数据库 分区表详解

    数据库 分区表详解如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了。1、数据库中某个表中的数据很多。很多是什么概念?一万条?两万条?还是十万条、一百万条?这个,我觉得是仁者见仁、智者见智的问题。当然数据表中的数据多到查询时明显感觉到数据很慢了,那么,你就可以考虑使用分区表了。如果非要我说一个数值的话,我认为是100万条。2、但是,数据多了并不是创建分区表的惟一条件,哪怕你有一千万条记录,但

    2022年6月6日
    40
  • bridge桥接模式_透明桥模式

    bridge桥接模式_透明桥模式bridge模式动机案例要点总结笔记动机由于某些类型的固有的实现逻辑,使得他们具有两个变化维度,乃至多个维度的变换如何应对这种”多维度的变化“?如何利用面向对象技术来是使得类型可以轻松地沿着两个乃至多个方向变换而不引入额外地复杂度?案例PC端和Mobile端平台和业务分离朴素class Messager{ public: virtual void Login(string username,string password) = 0; virtual void SendM

    2022年8月9日
    5
  • Idea 2021年激活码刚出(最新序列号破解)

    Idea 2021年激活码刚出(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    102

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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