博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详解Spring Security进阶身份认证之UserDetailsService(附源码)
阅读量:5881 次
发布时间:2019-06-19

本文共 2654 字,大约阅读时间需要 8 分钟。

    在博文中,我们采用了配置文件的方式从数据库中读取用户进行登录。虽然该方式的灵活性相较于静态账号密码的方式灵活了许多,但是将数据库的结构暴露在明显的位置上,绝对不是一个明智的做法。本文通过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.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
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
getAuthorities(){
List
authList = new ArrayList
();   authList.add(new SimpleGrantedAuthority("ROLE_USER")); authList.add(new SimpleGrantedAuthority("ROLE_ADMIN")); return authList; } }

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

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

    1.3 跟踪UserDetailsService。

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

    1.4 如不能正常运行,

转载地址:http://mlsix.baihongyu.com/

你可能感兴趣的文章
nginx报错pread() returned only 0 bytes instead of 4091的分析
查看>>
HTML 字符实体
查看>>
质数因子
查看>>
在NVIDIA Quadro NVS 295 显卡上装redhat 黑屏 无信号输入
查看>>
Announcing the new Office 365 admin center
查看>>
小白经营网站的前前后后
查看>>
Spring MVC 教程,快速入门,深入分析——如何实现全局的异常处理
查看>>
单用户模式修改密码
查看>>
微信小程序帮你赚到第一桶金
查看>>
mac下安卓开发环境搭建
查看>>
学习之华丽的注册按钮➕倒计时
查看>>
Vim 中使用 OmniComplete 为 C/C++ 自动补全(部分增加)
查看>>
初识Hadoop
查看>>
Oracle之内存结构(SGA、PGA)
查看>>
Binary Search Tree IN C
查看>>
ios-cocos2d游戏开发基础-进度条-开发笔记
查看>>
jquery之trigger()
查看>>
打造自己的Cacti模板
查看>>
Spring源码浅析之事务(四)
查看>>
我的友情链接
查看>>