项目实战——配置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

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-jdbc</artifactId>
     <version>2.7.0</version>
</dependency>
<dependency>
      <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <version>1.18.22</version>
       <scope>provided</scope>
</dependency>
<dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>8.0.28</version>
</dependency>
<dependency>
       <groupId>com.baomidou</groupId>
       <artifactId>mybatis-plus-boot-starter</artifactId>
       <version>3.5.1</version>
</dependency>
<dependency>
       <groupId>com.baomidou</groupId>
       <artifactId>mybatis-plus-generator</artifactId>
       <version>3.5.1</version>
</dependency>

记得刷新~ 

在这里插入图片描述

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

//输入你自己的用户和密码
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/kob?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
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

@Data
@NoArgsContructor
@AllArgsContructor
public class User {
    private Integer id;
    private String username;
    private String password;
}

 在这里插入图片描述

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

@Mapper
public interface UserMapper extends BaseMapper<User> {

}

 在这里插入图片描述

 在这里插入图片描述

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

@RestController
public class UserController {

    @Autowired
    UserMapper userMapper;

    /**
     * 查询所有用户
     */
    @GetMapping("/user/all/")
    public List<User> getAll() {
        return userMapper.selectList(null);
    }

    /**
     * 查询单个用户
     */
    @GetMapping("/user/{userId}/")
    public User getUser(@PathVariable int userId) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id",userId);

        return userMapper.selectOne(queryWrapper);

        // 范围遍历
        // public List<User> getUser(int userId)
        // queryWrapper.ge("id", 2).le("id", 3);
        // return userMapper.selectList(queryWrapper);
    }

    /**
     * 添加某个用户 直接输入 id name password
     * @param userId
     * @param username
     * @param password
     * @return Add User Sucessfully
     */
    @GetMapping("/user/add/{userId}/{username}/{password}/")
    public String addUser (@PathVariable int userId,
                           @PathVariable String username,
                           @PathVariable String password) {

        User user = new User(userId, username, password);
        userMapper.insert(user);
        return "Add User Sucessfully";
    }

    /**
     * 删除某个用户,直接输入 id
     * @param userId
     * @return Delete User Successfully
     */
    @GetMapping("/user/delete/{userId}/")
    public String deleteUser(@PathVariable int userId) {
        userMapper.deleteById(userId);
        return "Delete User Successfully";
    }
}

 查询user中的全部数据:

在这里插入图片描述

查询user中的单个数据:

 在这里插入图片描述

添加 user 中的数据:

 在这里插入图片描述

 在这里插入图片描述

 删除 user 中的数据:

在这里插入图片描述

 在这里插入图片描述

四、配置Spring Security

什么是 Spring Security ?

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

1、添加依赖

spring-boot-starter-security

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.7.0</version>
</dependency>

 

刷新之后显示登陆:

在这里插入图片描述

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

在这里插入图片描述

 2、与数据库对接:

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

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    //快捷键 windowsalt + insert / mac是option + enter
    @Autowired
    private UserMapper userMapper;
    // 传入 username 返回对应的信息,在这里也就是id name pwd
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", username);
        User user = userMapper.selectOne(queryWrapper);
        if (user == null) {
            throw new RuntimeException("用户不存在");
        }

        return new UserDetailsImpl(user);
    }
}

 在这里插入图片描述

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

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDetailsImpl implements UserDetails {

    private User user;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

在这里插入图片描述 

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

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDetailsImpl implements UserDetails {

    private User user;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

 在这里插入图片描述

 3、测试

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

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

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

 在这里插入图片描述

 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的注册,密码直接存储加密之后的密码。

@GetMapping("/user/add/{userId}/{username}/{password}/")
    public String addUser(
            @PathVariable int userId,
            @PathVariable String username,
            @PathVariable String password) {
        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String encodedPassword = passwordEncoder.encode(password);
        User user = new User(userId, username, encodedPassword);
        userMapper.insert(user);
        return "Add User Successfully";
    }

 在这里插入图片描述

 在这里插入图片描述

 在这里插入图片描述

记得 git 维护~

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值