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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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

    1.1 UserDetailsService在身份认证中的作用

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

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

Spring 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" />

Jetbrains全家桶1年46,售后保障稳定

    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,就会产生下面的错误。

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

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

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

1.3 跟踪UserDetailsService。

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


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

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

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

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

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

(0)


相关推荐

  • 周鸿祎的真经「建议收藏」

    周鸿祎的真经「建议收藏」  什么样的产品易获风险投资商的青睐-周鸿祎的BLOG-搜狐博客 无论如何,产品还是企业最核心最根本的东西。产品决定了创业者选择一条什么样的发展道路。产品的定义和选择是创业的开始,而好的开始是成功的一半。 做一份投资计划书-周鸿祎的BLOG-搜狐博客 一份好的投资计划书,不仅有助于将创业者头脑中的创意、想法逻辑化

  • c++怎么把小写字母变成大写字母_int能直接转化为char类型吗

    c++怎么把小写字母变成大写字母_int能直接转化为char类型吗1、输出uint32_tuint32_ta=888;printf(“ais%ld”,a);2、输出uint64_tuint64_tb=888;printf(“bis%lu”,b);printf(“bis%lld”,b);3、输出16进制intc=16;printf(“cis0x%08x”,c)

  • linux rootfs制作_pdf镜像翻转设置

    linux rootfs制作_pdf镜像翻转设置在编译目录的osdev/pub/下找到rootfs_uclibc.tgz解压开按照上节和本节验证成功的部署这个rootfs手工制作rootfs.jffs2镜像,再烧录测试即可osdrv/pub/bin/pc/mkfs.jffs2-dosdrv/pub/rootfs_uclibc-l-e0x10000-oosdrv/pub/rootfs_uclibc_64k.jffs2注…

  • cnpm 安装命令

    cnpm 安装命令  npm包管理器是每一位js开发者的得力助手,利用npm我们不仅能下载到别人写好的组件,也可以快速搭建我们的项目……但对于国内的开发者,npm的下载速度有是实在是令人捉鸡,因此国内的许多开发者都会使用更加快速的cnpm简单代替npm。打开控制台,输入命令npminstall-gcnpm–registry=https://registry.npm.taobao.org耐心等待一下安装即可此后我们再使用npm下载包的时候,就可以将npm命令替换为cnpm,下载下来的内容完全一样,但是速度

    2022年10月15日
  • mysql ddl dml dql(MySQL教程)

    1.DML操作DML是指数据操作语言,英文全称是DataManipulationLanguage,用来对数据库中表的记录进行更新。关键字:SELECT、UPDATE、INSERT、DELETE,是对数据库中的数据进行操作。1.1insertinsertintotname[(fie1,fie2,…)]values(val1,val2,…);1.1.1单条插入#插入一条完整的记录:值的顺序要和表中字段的顺序保持一致insertintostuvalues(‘haha@1

  • 香港主机空间搜索引擎会不收录吗_如何让搜索引擎搜到自己的网页

    香港主机空间搜索引擎会不收录吗_如何让搜索引擎搜到自己的网页最近在Q群里发现有几个群友在叫唤,“我的网站怎么还不收录啊,是不是百度屏蔽了香港空间?”,“香港空间是不是对SEO有影响?”。经过查看他们的网站,发现他们做的是小说站,所有小说都是通过采集器采集过来的。这样的内容百度能正常收录吗?        通过亲身验证,香港主机空间本身不存在搜索引擎不收录的现象,百度搜索引擎也没有屏蔽香港ip的谬论。只要主机空间稳定、高速访问,香港和国内的空间对SEO

    2022年10月15日

发表回复

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

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