Spring Boot+Vue项目 微博系统
前边已经定位到,如果要想用Spring Security做自定义权限认证,只需要实现框架内的 UserDetailsService
接口,在其loadUserByUsername
方法中,访问自己的数据库获取用户。然后把我们自己写的service配置上即可,所以按部就班,先创建数据库表。
通过命令行或数据库可视化工具在blog数据库下创建user表。也可以用IDEA内置的数据库管理工具来操作,点击View=》Tool Windows=》Database,点击 + =》datasource 来选择、配置、操作数据库。这里先简单的创建一个用户表:自增主键id
、username
、password
:
create table user
(
id bigint auto_increment comment '自增主键',
username varchar(256) default '' not null comment '用户名',
password varchar(256) default '' not null comment '密码',
constraint user_pk
primary key (id)
)
comment '用户表';
我用的是8版本的MySQL,不同关系型数据库在语法上可能会有细微差异,但是大差不差,也好改。
这里注意,在设计数据库时,对于那些没有初值的字段,最好设置not null
并指定默认初值,防止在程序中出现NullPointerException
异常,比如这里我把username、password
默认初值设置为''
空字符串。
在默认路径下,右键创建 model.entity
目录下的 User
类。
在User
类中添加与数据库对应的字段。
package cn.novalue.blog.model.entity;
import lombok.Data;
@Data
@TableName("user")
public class User implements Serializable {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String password;
}
这里使用的Lombok的注解来简化实体的编写,@Data
会自动生成该类所有非final
字段的getter、setter方法,以及toString
、hashCode
方法等。这样代码看起来会清爽很多。
@TableName
和@TableId(type = IdType.AUTO)
是MyBatis Plus的注解,即标注该类与数据库哪个表对应,并且定义主键字段以及主键策略(自增)。
可以在TestController
中新建个User
对象测试
可以看到IDEA已经能够提示setter方法了。
典型的spring boot项目中一般都会有以下三层:
层级 | 功能 |
---|---|
controller | 对应不同的用户请求,然后调用相应的service来处理请求,并返回结果 |
service | 负责主要的业务处理,接收controller层传来的数据并处理,其中可能会使用dao层提供的接口来访问数据库。一般会写个xxService 接口和xxServiceImpl 实现类 |
dao | 提供访问数据库的接口 |
看一看感觉有些臃肿,因为对于小项目可能并不需要分这么多层。但是还是规范着来吧。其实现在这些都是可以自动生成的,有各种各样的方法,比如Mybatis Generator啥的,建议初学还是多手动敲敲,等到熟悉一些了再自动生成。
所以自底向上,先从dao开始。
使用过MyBatis的都知道,MyBatis都会写一个接口类与对应的数据库表对接,并且配置个对应的xml文件,在文件中写具体的SQL语句。执行的时候,我们只需要调用接口类中的对应方法,它会去执行xml中配置的SQL语句,然后把返回结果封装成对应的对象返回。
新建dao包,并新建UserDao接口类,编写对应的方法。
package cn.novalue.blog.dao;
import cn.novalue.blog.model.entity.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface UserDao {
User findByUsername(@Param("username") String username);
}
然后在 resources
目录下,新建 mapper
包.
新建 UserMapper.xml
:
<mapper namespace="cn.novalue.blog.dao.UserDao">
<select id="findByUsername" resultType="cn.novalue.blog.model.entity.User">
select * from user where username = #{username}
select>
mapper>
这里的
说明该文件与UserDao对应, 标签就与
findByUsername
方法对应,resultType="cn.novalue.blog.model.entity.User"
与方法的返回值对应。#{username}
与对应配置的 @Param("username")
对应。
其实这里还有个知识点,MyBatis中获取参数有两种方式: #{}
和${}
,具体区别网上很容易搜到,还可以延伸了解下占位符,SQL预编译,SQL注入等知识。这里就不多解释了。
按照规范,新建service包,包下新建UserService接口文件:
import cn.novalue.blog.model.entity.User;
public interface UserService {
User findByUsername(String s);
}
注意这里的 findByUsername
和之前dao层的方法没啥关系,只是为了统一,都用一个名字了。
在service
包下,新建impl
包,用于放Service的对应实现类。然后在impl
包下,新建UserServiceImpl类:
import cn.novalue.blog.dao.UserDao;
import cn.novalue.blog.model.entity.User;
import cn.novalue.blog.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
User findByUsername(String s) {
return userDao.findByUsername(s);
}
在实现类里,调用 dao 层的方法,根据输入的用户名,从数据库中读取用户信息。注意添加 @Service
注解,为了Spring能将其加入到容器中。
到此我们就可以通过调用UserService.findByUsername
方法从数据库中获取数据了,以后也业务流程也都差不多。
为了测试数据库访问操作,可以先在数据库可视化工具中手动插入一条数据。
这里因为Spring Security默认会以加密方式(BCryptPasswordEncoder类)校验密码。
所以为了后续借助Spring Security操作,我先手动生成了个账户密码:
zhangsan
$2a$10$5PerCq8LezShd0TRwudup.MkzrTSni.DGUF2VReOszKUYaEjsXj9C
可以理解为输入账号:“zhangsan”,密码:“zhangsan”即可匹配这条数据。
然后新建个测试类试一下,在项目中有个 test
目录如下:
这里新建个UserTest测试类,来测试功能。
package cn.novalue.blog;
import cn.novalue.blog.model.entity.User;
import cn.novalue.blog.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.junit.jupiter.api.Test;
@SpringBootTest
public class UserTest {
@Autowired
private UserService userService;
@Test
public void testUser(){
String username = "zhangsan";
User user = userService.findByUsername(username);
String password = user.getPassword();
System.out.println(password);
}
点击运行该方法,即可看到从数据库中读取到的密码:
到此我们已经能够通过调用userService.findByUsername
从数据库获取用户了,再按照之前的结论,实现UserDetailsService接口并配置即可。下一步就来配置Spring Security,实现登录用户登录功能。
上一篇:
Spring Boot+Vue项目 微博系统(5):Spring Security登录流程源码分析
下一篇:
Spring Boot+Vue项目 微博系统(7):Spring Boot+Vue项目 微博系统(7):登录流程后端实现之配置Spring Security