写在前面

没错,这篇文章还是练气后期!但作者我相信筑基指日可待!

在前一篇文章当中,我们简单地分析了一下Spring Security的认证流程,知道了如果想要实现对自己用户数据(账户、角色、权限)的读取,需要实现UserDetailsService这个接口以及实现对应的loadUserByUsername 的方法,编写自己的业务逻辑。并在spring security的配置文件当中指定认证使用的业务对象 。

步骤

第一步:编写自己的User实体类

/**
* @author 赖柄沣 bingfengdev@aliyun.com
* @version 1.0
* @date 2020/8/27 15:19
*/
@TableName("sys_user")
public class MyUserDO {
@TableId
private int id;
private String username;
private String password;
private boolean status; getter。。。
setter。。。
}

第二步:编写UserDetailsServiceImpl实现UserDetailsService接口

/**
* @author 赖柄沣 bingfengdev@aliyun.com
* @version 1.0
* @date 2020/8/23 9:48
*/
public class UserServiceImpl implements UserDetailsService {
@Autowired
private UserDao2Impl userDaoImpl; }

第三步:实现loadUserByUsername方法

/**使用spring security已经实现的user对象进行认证
* @author 赖柄沣 bingfengdev@aliyun.com
* @date 2020-08-27 15:24:28
* @param username
* @return org.springframework.security.core.userdetails.UserDetails
* @throws UsernameNotFoundException
* @version 1.0
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 检验参数
if (username == null||username.trim().length() == 0) {
return null;
} //构造条件(我使用的是MybatisPlus)
QueryWrapper<MyUserDO> qw = Wrappers.query();
qw.eq("username",username); //从数据库中查出自己的user对象
MyUserDO myuser = userDaoImpl.selectOne(qw); //模拟获取用户具备的角色信息
List<SimpleGrantedAuthority> simpleGrantedAuthorityList = new ArrayList<>(); simpleGrantedAuthorityList.add(new SimpleGrantedAuthority("ROLE_USER"));
//封装成spring security的user对象
//注意:这里的密码如果不是加密村存储的要加上"{noop}"
User user = new User(myuser.getUsername(),myuser.getPassword(),simpleGrantedAuthorityList);
return user;
}

第四步:在spring security的配置文件中指定认证信息数据源为自己的UserServiceImpl

<security:authentication-provider user-service-ref="userService2Impl">
</security:authentication-provider>

至此,spring security使用数据数据完成认证操作的编写流程便结束了,关于其中的原理,可以查看我的上一篇文章。

如果觉得使用spring security提供的user对象不够方便,可以让自己编写的User对象继承spring security的User(之所以不推荐直接实现UserDetails接口是因为,如果直接实现该接口的话得自己编写用户账户状态的判断逻辑,那样将使得工作变得更加麻烦)

补充:加密认证方式

在IOC容器中提供加密对象

<bean id="passwordEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

结束

关于使用注解配置的方式较为简单,在本文当中并未给出,后续有时间写一写springboot整合spring security的文章。目前是学习spring security入门一小步,所以我们的关注点应该放在spring security本身,所以刚开始的时候会涉及到很多“原始性”的操作。

代码下载:<https://github.com/code81192/art-demo/tree/master/spring-security-demo2

Spring Security使用数据库数据完成认证--练气后期2的更多相关文章

  1. spring security基于数据库表进行认证

    我们从研究org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl.class的源码开始 public class JdbcDaoI ...

  2. Spring Security 使用数据库用户进行认证

    本文参考或摘录自:http://haohaoxuexi.iteye.com/blog/2157769 本文使用Spring Security自带的方式连接数据库对用户进行认证. 1.Spring Se ...

  3. Spring Security技术栈开发企业级认证与授权(一)环境搭建

    本项目是基于慕课网的Spring Security技术栈开发企业级认证与授权,采用IDEA开发,本文章用来记录该项目的学习过程. 慕课网视频:https://coding.imooc.com/clas ...

  4. Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(二)

    Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(二) 摘要 上一篇https://javaymw.com/post/59我们已经实现了基本的登录和t ...

  5. Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(一)

    标题 Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(一) 技术 Spring Boot 2.Spring Security 5.JWT 运行环境 ...

  6. shiro入门学习--使用MD5和salt进行加密|练气后期

    写在前面 在上一篇文章<Shiro入门学习---使用自定义Realm完成认证|练气中期>当中,我们学会了使用自定义Realm实现shiro数据源的切换,我们可以切换成从关系数据库如MySQ ...

  7. Spring Security认证流程分析--练气后期

    写在前面 在前一篇文章中,我们介绍了如何配置spring security的自定义认证页面,以及前后端分离场景下如何获取spring security的CSRF Token.在这一篇文章中我们将来分析 ...

  8. spring security使用数据库资源

    国内对权限系统的基本要求是将用户权限和被保护资源都放在数据库里进行管理,在这点上Spring Security并没有给出官方的解决方案,为此我们需要对Spring Security进行扩展.. 数据库 ...

  9. 【Spring Security】六、自定义认证处理的过滤器

    这里接着上一章的自定义过滤器,这里主要的是配置自定义认证处理的过滤器,并加入到FilterChain的过程.在我们自己不在xml做特殊的配置情况下,security默认的做认证处理的过滤器为Usern ...

随机推荐

  1. abs,all,any函数的使用

    ''' abs函数:如果参数为实数,则返回绝对值 如果参数为复数,则返回复数的模 ''' a = 6 b = -6 c = 0 # print("a = {0} , b = {1} , c ...

  2. PHP curl_share_init函数

    (PHP 5 >= 5.5.0) curl_share_init — 初始化一个 cURL 共享句柄 说明 resource curl_share_init ( void ) 允许两个 cURL ...

  3. PHP bin2hex() 函数

    实例 把 "Hello World!" 转换为十六进制值: <?php 高佣联盟 www.cgewang.com$str = bin2hex("Hello Worl ...

  4. bzoj 5206 [Jsoi2017]原力

    LINK:原力 一张无向图 这道题统计三元环的价值和.有重边但是无自环. 我曾经写过三元环计数 这个和那个题差不太多. 不过有很多额外操作 对于重边问题 我们把所有颜色相同的重边缩在一起 这样的话我们 ...

  5. 看了这篇文章,我搞懂了StringTable

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 String应该是Java ...

  6. Python多线程-ThreadLocal

    参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017630786314240#0 ThreadLocal ThreadLocal变量虽然是 ...

  7. Kaggle-pandas(2)

    Intndexing-selecting-assigning 教程 介绍选择要处理的pandas DataFrame或Series的特定值是几乎将要运行的任何数据操作中的一个隐含步骤,因此在Pytho ...

  8. 树莓派4B的CPU系统里查到为BCM2835而非BCM2711

    树莓派4B采用四核64位的ARM Cortex-A72架构CPU,型号为博通BCM2711 SoC.2711是个64位的四核,而2835是多年前的32位单核CPU. 查看当前芯片版本,显示为4核心,但 ...

  9. 2020-07-04:tcp三次握手干了啥?time_wait什么时候出现?

    福哥答案2020-07-04:三次握手如下:1.SYN j2.ACK j+1,SYN k3.ACK k+1 time_wait出现在断开连接第四次挥手的时候出现.TIME_WAIT状态存在有两个原因. ...

  10. java实现一个简单的爬虫小程序

    前言 前些天无意间在百度搜索了一下以前写过的博客 我啥时候在这么多不知名的网站上发表博客了???点进去一看, 内容一模一样,作者却不是我... 然后又去搜了其他篇博客,果然,基本上每篇都在别的网站上有 ...