• 项目实战——配置MySQL与Spring Security模块


    PS:本篇文章主体内容并不涉及复杂代码的编写~~请大家放心食用hh

    目录

    一、整体框架

     二、配置MySQL

    1、下载MySQL

    2、安装MySQL

    3、配置MySQL

    4、IDEA 连接 MySQL

     三、配置 SpirngBoot

    1、添加依赖

     2、在 application.properties 中添加数据库配置

    3、实现简单的 CRUD

    四、配置Spring Security

    1、添加依赖

     2、与数据库对接:

     3、测试


    一、整体框架

    整体框架

     应用模型:
    SpringBoot的角色是用来处理用户请求,client端向spring Boot发送请求,然后向数据库请求数据,数据库返回数据给前端。
    在我的理解下 SpringBoot 类似于 管家 的角色。

     

     二、配置MySQL

    1、下载MySQL

    下载地址:

    MySQL :: Download MySQL Installer

     mysql下载

     

    2、安装MySQL

    在这里插入图片描述

     在这里插入图片描述

    其他默认一直next就可以

    3、配置MySQL

    将C:\Program Files\MySQL\MySQL Server 8.0\bin(如果安装到了其他目录,填写相应目录的地址即可)添加到环境变量PATH中,这样就可以在任意目录的终端中执行mysql命令了。我这里使用的是自己电脑原来安装的MySQL Server 5.7,本质上没有什么区别。

    在这里插入图片描述

     在这里插入图片描述

     在这里插入图片描述

     

    mysql服务的关闭与启动(默认开机自动启动,如果想手动操作,可以参考如下命令)
    打开命令行,输入以下命令
    关闭:net stop mysql80
    启动:net start mysql80

    或者右击我的电脑,选择 管理 ->服务和应用程序 -> 服务 -> MySQL 可以选择手动 或者关闭。

    在这里插入图片描述

    MySQL 常用操作:(注意在结尾加上分号)

    + 连接用户名为root,密码为123456的数据库服务:mysql -uroot -p123456
    + show databases; :列出所有数据库
    + create database kob;:创建数据库
    + drop database kob;:删除数据库
    + use kob;:使用数据库kob
    + show tables;:列出当前数据库的所有表
    + create table user(id int, username varchar(100));:创建名称为user的表,表中包含id和username两个属性。
    + drop table user;:删除表
    + insert into user values(1, 'gcy');:在表中插入数据
    + select * from user;:查询表中所有数据
    + delete from user where id = 2;:删除某行数据

    在这里插入图片描述

     在这里插入图片描述

    1、 创建数据库kob
    2、在kob下创建表user
    3、插入两条数据

    在这里插入图片描述

    使用工具在操作数据库(WorkBench)

     

    操作大家自行百度即可,基本操作都非常简单~~

    4、IDEA 连接 MySQL

    1. 连接,点击右边的数据库 -> + -> 数据源-> MySQL,输入账号、密码、数据库名称,这里是kob,点击测试连接,成功后点击应用就可以了。

    在这里插入图片描述

     在这里插入图片描述

     在这里插入图片描述

     三、配置 SpirngBoot

    1、添加依赖

    1. 在pom.xml下添加依赖,依赖可以 Maven仓库地址 中寻找。
    Spring Boot Starter JDBC
    Project Lombok
    MySQL Connector/J
    mybatis-plus-boot-starter
    mybatis-plus-generator

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-jdbcartifactId>
    4. <version>2.7.0version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.projectlombokgroupId>
    8. <artifactId>lombokartifactId>
    9. <version>1.18.22version>
    10. <scope>providedscope>
    11. dependency>
    12. <dependency>
    13. <groupId>mysqlgroupId>
    14. <artifactId>mysql-connector-javaartifactId>
    15. <version>8.0.28version>
    16. dependency>
    17. <dependency>
    18. <groupId>com.baomidougroupId>
    19. <artifactId>mybatis-plus-boot-starterartifactId>
    20. <version>3.5.1version>
    21. dependency>
    22. <dependency>
    23. <groupId>com.baomidougroupId>
    24. <artifactId>mybatis-plus-generatorartifactId>
    25. <version>3.5.1version>
    26. dependency>

    记得刷新~ 

    在这里插入图片描述

     2、在 application.properties 中添加数据库配置:

    1. //输入你自己的用户和密码
    2. spring.datasource.username=root
    3. spring.datasource.password=123456
    4. spring.datasource.url=jdbc:mysql://localhost:3306/kob?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
    5. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

    点击运行 出现报错 可能是因为路径问题。
    点击运行,输入网址 http://127.0.0.1:8080/pk/index/显示界面就成功了

    在这里插入图片描述

    3、实现简单的 CRUD

    SpringBoot中的常用模块
    pojo层:将数据库中的表对应成Java中的Class
    mapper层(也叫Dao层):将pojo层的class中的操作,映射成sql语句
    service层:写具体的业务逻辑,组合使用mapper中的操作
    controller层:负责请求转发,接受页面过来的参数,传给Service处理,接到返回值,再传给页面

    在这里插入图片描述

     

     注解?注解的作用?

    使用注解可以帮助我们不在需要配置繁杂的xml文件,以前最基本的web项目是需要写xml配置的,需要标注你的哪个页面和哪个 servle 是对应的,注解可以帮助我们减少这方面的麻烦。

    @Controller:用于定义控制器类,在spring项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层),一般这个注解在类中,通常方法需要配合注解@RequestMapping。

    @RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射。

    @Autowired:自动导入依赖的bean

    @Service:一般用于修饰service层的组件

    @Bean:用@Bean标注方法等价于XML中配置的bean。

    @AutoWired:自动导入依赖的bean。byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。

    可以不用花时间去了解类似注解的实现原理,用的时候背下来就行,这里只是简单记录一下,如果想深入了解,可以百度。

    在 backend 下创建 pojo 包 创建一个类 User,将数据库中的表 User转化为 Java 中的 User.class

    1. @Data
    2. @NoArgsContructor
    3. @AllArgsContructor
    4. public class User {
    5. private Integer id;
    6. private String username;
    7. private String password;
    8. }

     在这里插入图片描述

    在 backend 创建 mapper 包,创建一个 接口 UserMapper

    1. @Mapper
    2. public interface UserMapper extends BaseMapper {
    3. }

     在这里插入图片描述

     在这里插入图片描述

     在backend 的 controller 下创建 user 包然后创建 UserController

    1. @RestController
    2. public class UserController {
    3. @Autowired
    4. UserMapper userMapper;
    5. /**
    6. * 查询所有用户
    7. */
    8. @GetMapping("/user/all/")
    9. public List getAll() {
    10. return userMapper.selectList(null);
    11. }
    12. /**
    13. * 查询单个用户
    14. */
    15. @GetMapping("/user/{userId}/")
    16. public User getUser(@PathVariable int userId) {
    17. QueryWrapper queryWrapper = new QueryWrapper<>();
    18. queryWrapper.eq("id",userId);
    19. return userMapper.selectOne(queryWrapper);
    20. // 范围遍历
    21. // public List getUser(int userId)
    22. // queryWrapper.ge("id", 2).le("id", 3);
    23. // return userMapper.selectList(queryWrapper);
    24. }
    25. /**
    26. * 添加某个用户 直接输入 id name password
    27. * @param userId
    28. * @param username
    29. * @param password
    30. * @return Add User Sucessfully
    31. */
    32. @GetMapping("/user/add/{userId}/{username}/{password}/")
    33. public String addUser (@PathVariable int userId,
    34. @PathVariable String username,
    35. @PathVariable String password) {
    36. User user = new User(userId, username, password);
    37. userMapper.insert(user);
    38. return "Add User Sucessfully";
    39. }
    40. /**
    41. * 删除某个用户,直接输入 id
    42. * @param userId
    43. * @return Delete User Successfully
    44. */
    45. @GetMapping("/user/delete/{userId}/")
    46. public String deleteUser(@PathVariable int userId) {
    47. userMapper.deleteById(userId);
    48. return "Delete User Successfully";
    49. }
    50. }

     查询user中的全部数据:

    在这里插入图片描述

    查询user中的单个数据:

     在这里插入图片描述

    添加 user 中的数据:

     在这里插入图片描述

     在这里插入图片描述

     删除 user 中的数据:

    在这里插入图片描述

     在这里插入图片描述

    四、配置Spring Security

    什么是 Spring Security ?

    答:Spring Security 是用户认证操作 – 一种授权机制,目的是安全。

    1、添加依赖

    spring-boot-starter-security

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-securityartifactId>
    4. <version>2.7.0version>
    5. dependency>

     

    刷新之后显示登陆:

    在这里插入图片描述

     默认的叫 Username 是 user ,密码自动生成。

    在这里插入图片描述

     2、与数据库对接:

    在backend 的 service 创建 impl 包,新建 UserDetailsServiceImpl 类。
    实现service.impl.UserDetailsServiceImpl类,继承自UserDetailsService接口,用来接入数据库信息

    1. @Service
    2. public class UserDetailsServiceImpl implements UserDetailsService {
    3. //快捷键 windowsalt + insert / mac是option + enter
    4. @Autowired
    5. private UserMapper userMapper;
    6. // 传入 username 返回对应的信息,在这里也就是id name pwd
    7. @Override
    8. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    9. QueryWrapper queryWrapper = new QueryWrapper<>();
    10. queryWrapper.eq("username", username);
    11. User user = userMapper.selectOne(queryWrapper);
    12. if (user == null) {
    13. throw new RuntimeException("用户不存在");
    14. }
    15. return new UserDetailsImpl(user);
    16. }
    17. }

     在这里插入图片描述

     在backend 的 service 包的 impl 包下创建utils 包 新建 UserDetailsImpl:

    1. @Data
    2. @NoArgsConstructor
    3. @AllArgsConstructor
    4. public class UserDetailsImpl implements UserDetails {
    5. private User user;
    6. @Override
    7. public Collectionextends GrantedAuthority> getAuthorities() {
    8. return null;
    9. }
    10. @Override
    11. public String getPassword() {
    12. return user.getPassword();
    13. }
    14. @Override
    15. public String getUsername() {
    16. return user.getUsername();
    17. }
    18. @Override
    19. public boolean isAccountNonExpired() {
    20. return true;
    21. }
    22. @Override
    23. public boolean isAccountNonLocked() {
    24. return true;
    25. }
    26. @Override
    27. public boolean isCredentialsNonExpired() {
    28. return true;
    29. }
    30. @Override
    31. public boolean isEnabled() {
    32. return true;
    33. }
    34. }

    在这里插入图片描述 

     在backend 的 service 包的 impl 包下创建utils 包 新建 UserDetailsImpl:

    1. @Data
    2. @NoArgsConstructor
    3. @AllArgsConstructor
    4. public class UserDetailsImpl implements UserDetails {
    5. private User user;
    6. @Override
    7. public Collectionextends GrantedAuthority> getAuthorities() {
    8. return null;
    9. }
    10. @Override
    11. public String getPassword() {
    12. return user.getPassword();
    13. }
    14. @Override
    15. public String getUsername() {
    16. return user.getUsername();
    17. }
    18. @Override
    19. public boolean isAccountNonExpired() {
    20. return true;
    21. }
    22. @Override
    23. public boolean isAccountNonLocked() {
    24. return true;
    25. }
    26. @Override
    27. public boolean isCredentialsNonExpired() {
    28. return true;
    29. }
    30. @Override
    31. public boolean isEnabled() {
    32. return true;
    33. }
    34. }

     在这里插入图片描述

     3、测试

    如果实现登录的话,需要提供一个 PassworEncoder。
    如果在数据库中指定明文来存储,需要在自己的密码加上{noop},才可以登录。

    1. 实现密文存储:
    在 config 下新建 SecurityConfig 。
    实现config.SecurityConfig类,用来实现用户密码的加密存储。

    1. @Configuration
    2. @EnableWebSecurity
    3. public class SecurityConfig {
    4. @Bean
    5. public PasswordEncoder passwordEncoder() {
    6. return new BCryptPasswordEncoder();
    7. }
    8. }

     在这里插入图片描述

     2. 测试
    在 Test 下生成需要转换的密文,同时修改数据库下的密码为密文。

    在这里插入图片描述

     查看生成的密文:

    $2a$10$4AaK80JnfmRFQA2nRUnNl.Vt.MhAvdu5FeyqxbMJDViOPDHuBSlhS
    $2a$10$swlEAIVf4xw7qT/Mykk5leYlylUnToz3oy0dUifEWt4b2NTGOGzB.
    $2a$10$zhG9.Pa5nIOYetvqkjo08echmbS3Ymhme3IHD1anwleqEbkc1y8ue
    $2a$10$QQuex9RceLQE6GRZeTdGcOaWvsNq.Jxb7FCnrP9OqcL1lRW0cXm6e
    $2a$10$w418fbr8WS3lr.X8/fORreX.RpnVtosjH4uB99qTRBPlp2jYCnamC

    在数据库中更改密码为密文:修改后上传,刷新。一定要记得上传。

    在这里插入图片描述

     

    重启项目,进入login页面

    登录成功,只要不给你显示密码错误就代表成功,显示Whitelabel Error Page也是成功,自己在后面添加路径就可以了登录。

    在这里插入图片描述

     注意,这里地址栏是我自己手动输入的,如果你没有设置跳转的话,应该是显示Whitelabel Error Page,这样也算登录成功。

    在这里插入图片描述

     使用密文添加用户(数据库中不要保存明文密码)

    修改 controller 下的 user 的 UserController的注册,密码直接存储加密之后的密码。

    1. @GetMapping("/user/add/{userId}/{username}/{password}/")
    2. public String addUser(
    3. @PathVariable int userId,
    4. @PathVariable String username,
    5. @PathVariable String password) {
    6. PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    7. String encodedPassword = passwordEncoder.encode(password);
    8. User user = new User(userId, username, encodedPassword);
    9. userMapper.insert(user);
    10. return "Add User Successfully";
    11. }

     在这里插入图片描述

     在这里插入图片描述

     在这里插入图片描述

    记得 git 维护~

     

     

  • 相关阅读:
    源代码转换:Tangible Software Solutions 23.10 Crack
    SpringBoot3安全管理
    深度剖析 Python 日志重复打印问题
    JavaScript01(JavaScript入门语法)
    柔性数组
    数学重点复习
    双亲委派机制的作用
    MySQL数据库-备份
    官方推荐:6种Pandas读取Excel的方法
    将一个无向图变成一个双联通图所需添加的最小边数
  • 原文地址:https://blog.csdn.net/qq_59539549/article/details/127847601