SpringSecurity系列之基于数据库认证

本文中所使用的技术栈如下:
SpringBoot 2.6.2
MyBatis Plus 3.5.0
SpringSecurity 5.6.1

一、创建数据库表

如下图所示,创建一个简单的用户数据表,实际开发中应当使用密文存储密码,而不是如下当中的明文存储。

二、创建SpringBoot应用

1.配置application.properties文件

主要是配置数据库连接信息

# 指定端口号
server:port: 8888# 配置数据库连接信息
spring:datasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/security-demousername: rootpassword: kenewstar

2.配置pom.xml文件

主要引入SpringSecurity依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.2</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.gitee.security</groupId><artifactId>springboot-security</artifactId><version>0.0.1</version><name>springboot-security</name><description>Security project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

3.创建SpringBoot启动类

/*** @author kenewstar* @date 2022/1/20*/
@RestController
@MapperScan("com.gitee.security.mapper")
@SpringBootApplication
public class SpringbootSecurityApplication {public static void main(String[] args) {SpringApplication.run(SpringbootSecurityApplication.class, args);}@GetMapping("/test")public String test() {return "SpringSecurity";}
}

启动类上加一个@RestController注解,并添加一个/test接口用于访问我们的web程序。

4.创建一个用户实体类

/*** 用户实体类* @author kenewstar* @date 2022/1/20*/
@Data
@TableName("sys_user")
public class SysUser {private Integer id;private String username;private String password;
}

@Data注解属于lombok中用于简化实体类的getter/setter方法。
@TableName注解用于标注实体类映射一个数据库表,value值为数据表名称。

5.创建UserMapper

/*** @author kenewstar* @date 2022/1/20*/
public interface UserMapper extends BaseMapper<SysUser> {}

创建UserMapper.java文件,继承MyBatisPlus中的CRUD通用接口BaseMapepr用于访问数据库。

三、配置SpringSecurity

1.重写UserDetailsService接口

package com.gitee.security.service;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gitee.security.mapper.UserMapper;
import com.gitee.security.pojo.SysUser;
import java.util.Objects;
import javax.annotation.Resource;
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;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;/*** @author kenewstar* @date 2022/1/20*/
@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Resourceprivate UserMapper userMapper;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// 通过username查询数据库中的用户信息QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();queryWrapper.eq("username", username);// 获取数据库查询的用户信息SysUser sysUser = this.userMapper.selectOne(queryWrapper);// 校验用户对象是否存在if (Objects.isNull(sysUser)) {throw new  UsernameNotFoundException("用户不存在");}User.UserBuilder builder = User.builder();UserDetails admin = builder.username(sysUser.getUsername())// 实际上是从数据库中直接取出加密后的密码,而不是在此处加密.password(new BCryptPasswordEncoder().encode(sysUser.getPassword())).roles("admin").build();// 返回用户对象return admin;}
}

重写UserDetailsService接口用于获取数据库用户信息并校验返回用户对象。
引入UserMapper对象,并重写loadUserByUsername()方法,见名知意,通过用户名加载用户对象,返回UserDetails对象该对象包含了返回的用户信息对象。传入参数username为前端表单输入的用户名。

2.配置SpringSecurity配置类

package com.gitee.security.config;import javax.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
/*** Spring Security 配置类* @author kenewstar* @date 2022/1/20*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Resourceprivate UserDetailsService userDetailsService;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

创建SpringSecurity配置类,重写configure(AuthenticationManagerBuilder auth)方法,将我们重写的UserDetailService对象添加进来,并且还需要配置PasswordEncoder对象(必须配置)密码加密对象,用于加密数据库密码。

四、测试验证

启动SpringBoot应用并访问/test接口
访问地址:http://127.0.0.1:8888/test

由于我们没有登录系统,所以会直接跳转至登录页面,我们输入admin/123456用户名和密码。

登录成功如下:

登录失败如下:

SpringSecurity系列之基于数据库认证相关推荐

  1. 【spring-security基础】基于数据库的认证方式

    通过查询数据库方式进行认证 核心要点 实现思路 1. 数据库设计 2. 框架依赖引入(操作数据库) 3. 创建操作数据库相关内容 4. [重点]实现UserDetailsService接口 5. 配置 ...

  2. Spring Security基于数据库认证用户登录

    Spring Security为我们提供了默认的登录页面,通过重写以AuthenticationManagerBuilder为参数的configure方法,我们可基于各种数据存储来认证用户,比如内存. ...

  3. Spring Security 基于数据库的认证

    介绍 之前使用的全是基于内存的认证,这里使用基于数据库的认证. 设计数据表 这里设计数据表 创建项目 这里使用Mybatis作为项目. 添加如下依赖 添加driud连接池依赖 <dependen ...

  4. DB2数据库认证系列教程——IBM DB2认证考前必备

    DB2数据库认证系列教程--IBM DB2认证考前必备 IBM DB2认证 IBM DB2 认证是求职的敲门砖,也是很多 DB2 爱好者热衷追求的目标.本专题收集整理了IBM DB 2数据库认证相关的 ...

  5. Spring Boot安全管理—基于数据库的认证

    基于数据库的认证 1. 设计数据库表 首先设计一个基本的用户角色表,一共三张表,分别是用户表.角色表以及用户角色关联表. SET FOREIGN_KEY_CHECKS=0;-- ----------- ...

  6. security基于数据库的认证(二)

    @TOC 前言:在security初体验(一)里,用户名和密码的认证都是基于内存级别的,本章主要是说security如何从db里取用户名和密码来验证的. 1.准备的sql DROP TABLE IF ...

  7. 「Python爬虫系列讲解」七、基于数据库存储的 BeautifulSoup 招聘爬取

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  8. SpringSecurity系列——其他的权限控制,基于access表达式的权限控制day6-2(源于官网5.7.2版本)

    SpringSecurity系列--其他的权限控制,基于access表达式的权限控制day6-2(源于官网5.7.2版本) 常见权限控制总表 基于access表达式的权限控制 实例1:改写hasRol ...

  9. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)...

    SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 前言 表结构 maven配置 配置Druid 配置mybatis ...

最新文章

  1. opencv生成随机图(随机彩图,随机灰图)
  2. 【深入Java虚拟机JVM 08】JVM四种引用-强引用、软引用、弱引用、虚引用
  3. 使用.NET Core优雅获取并展示最新疫情数据
  4. Linux安装中文字体_宋体
  5. am大学计算机科学,曹同学-综合大学排名80的TexasAMUniversity计算机科学硕士
  6. 8.1、Spring Boot 属性配置
  7. java调用百度api完成人脸识别
  8. 数学建模:传染病模型
  9. 计算机cpu任务管理器,任务管理器里CPU使用率过高问题
  10. 分享一个android手机开不了机的问题
  11. github whs_从iPhone或iPod Touch获得WHS的基本访问权限,而无需安装应用程序
  12. LAN-Cruising
  13. 对应的cuda版本 显卡驱动版本_cuda和显卡驱动版本
  14. SEO优化方案及SEO操作流程-邹川
  15. paddlespeech 语音识别 web流服务部署(Streaming Speech Recognition)
  16. 轻松的玩转Docker的15个小技巧
  17. 多变量可视化——QGIS二元分区着色图
  18. 【今日荐文】一本开源的程序员快速成长秘笈---康德胜
  19. 使用.reg文件操作注册编辑表
  20. mysql的 深度使用 - 游标 , 定时器, 触发器 的使用 ?

热门文章

  1. 数字营销中台和全渠道的数字化精耕,快消老品牌实现数字营销焕新生
  2. 手把手教你使用Python批量创建复工证明
  3. 微信小程序 —— canvas生成海报图与分享
  4. matlab srgb,matlab – 将Photoshop sRGB复制到LAB转换
  5. 以太网二层技术——VPLS详解
  6. 如何使用Unity制作一款自己喜欢玩的游戏demo(Unity萌新的进阶技巧)
  7. 人一生要读的100首古诗
  8. 用sourecttree从Teambition上clone项目到本地
  9. 透过现象看本质-IT程序员成长及管理
  10. python+opencv别踩白块儿游戏辅助,一天一个opencv小项目(已开源)