项目实战——配置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
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 {@AutowiredUserMapper 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@Autowiredprivate UserMapper userMapper;// 传入 username 返回对应的信息,在这里也就是id name pwd@Overridepublic 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;@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return null;}@Overridepublic String getPassword() {return user.getPassword();}@Overridepublic String getUsername() {return user.getUsername();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}
在backend 的 service 包的 impl 包下创建utils 包 新建 UserDetailsImpl:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDetailsImpl implements UserDetails {private User user;@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return null;}@Overridepublic String getPassword() {return user.getPassword();}@Overridepublic String getUsername() {return user.getUsername();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}
3、测试
如果实现登录的话,需要提供一个 PassworEncoder。
如果在数据库中指定明文来存储,需要在自己的密码加上{noop},才可以登录。
1. 实现密文存储:
在 config 下新建 SecurityConfig 。
实现config.SecurityConfig类,用来实现用户密码的加密存储。
@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic 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 维护~
项目实战——配置MySQL与Spring Security模块相关推荐
- 【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2
[Java闭关修炼]SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2 传统的登录验证模式 JWT登录验证方式 下载安装依赖 创建JWTUTIL JwtAuthenticati ...
- 联系人管理-客户拜访记录| CRM客户关系管理系统项目 实战七(Struts2+Spring+Hibernate)解析+源代码
联系人管理-客户拜访记录| CRM客户关系管理系统项目 实战七(Struts2+Spring+Hibernate)解析+源代码 客户拜访记录的列表的显示, 客户拜访记录的保存, 客户拜访记录查询(条件 ...
- 基于mysql的springmvcjar_糊涂jar_SpringMVC+Spring+Mybatis项目实战[SSM/MySQL/AJAX/IDEA]_Java视频-51CTO学院...
鸟哥QQ交流群:833468344 我所有课程的学习主线为:java基础--->面向对象--->java高级部分(集合.多线程.正则表达式等)--->html5+css3---> ...
- 客户管理模块(保存查询客户)| CRM客户关系管理系统项目实战二(Struts2+Spring+Hibernate)解析+源代码
引入数据字典,配置一对多的关系 异步加载 (JSON的使用,将list集合封装为json的数据,然后删除部分数据,JSON的数据发送到前端,前端页面获取对应的数据,遍历json的数据) 数据字典(下拉 ...
- mysql初始化加载插件_Hapi+MySql项目实战配置插件-加载文件渲染母版(三)
加载插件 一般在其它node框架下,我们安装好插件直接require('插件')就能正常使用了,但是在Hapi下我们必须要Server.register()方法,才能正常使用插件.举个例子: 1 se ...
- Redis高级项目实战!mysql和java的管理系统源码
分享第一份Java基础-中级-高级面试集合 Java基础(对象+线程+字符+接口+变量+异常+方法) Java中级开发(底层+Spring相关+Redis+分布式+设计模式+MySQL+高并发+锁+线 ...
- android博学谷实验报告,《Android项目实战-博学谷》我的模块
我的模块界面 思路 由于此界面只是主界面中的一部分,所以无需创建一个新的 Activity ,只需要在 layout 目录下新建一个布局即可,同理导入图片至 drawable 目录下 具体代码如下: ...
- 小d课堂mysql_小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类...
笔记 6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类 简介:实战使用IDE根据Mysql自动生成java pojo实体类 1.IDEA连接数据库 菜单View→Tool Window ...
- 项目实战-解决AES(java.security.InvalidKeyException: Illegal key size)
异常: java.security.InvalidKeyException: Illegal key size 今天在做接口测试的时候遇到个异常: java.security.InvalidKeyEx ...
最新文章
- android 布局 站位符,基于android布局中的常用占位符介绍
- 【Java Web后台实验与开发】ServletHTTPRequest笔记
- Android layout布局属性、标签属性总结大全
- SQL2005 属性 IsLocked 不可用于 登录[sa]
- CG-CTF-Web-单身一百年
- Linux C 读取文件夹下所有文件(包括子文件夹)的文件名
- TreeMap实现排序
- gulp如何保存后自动刷新?看这里就够了
- Win10 OneDrive无法同步文件怎么办?一个命令搞定
- 新手 Spring 疑惑
- 什么视频会议系统好?
- 【原】对txt文本进行数据读取
- 网页版bpc电波对时_BPC电波对时app
- win7右键显示隐藏文件及扩展名
- teamviewer12 linux安装,ubuntu16.04安装teamviewer12依赖包解决
- 第一学:pytorch入门60min
- Win10自带录屏怎么用?一键开启,超级简单!
- 您需要Administrators提供的权限才能对此文件进行更改
- Android ADB原理及常用命令
- java 使用*打印图形(菱形、平行四边形、三角形)