基于数据库的用户认证
小于 1 分钟
基于数据库的用户认证
1、SQL
-- 创建数据库
CREATE DATABASE `security-demo`;
USE `security-demo`;
-- 创建用户表
CREATE TABLE `user`(
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(50) DEFAULT NULL ,
`password` VARCHAR(500) DEFAULT NULL,
`enabled` BOOLEAN NOT NULL
);
-- 唯一索引
CREATE UNIQUE INDEX `user_username_uindex` ON `user`(`username`);
-- 插入用户数据(密码是 "abc" )
INSERT INTO `user` (`username`, `password`, `enabled`) VALUES
('admin', '{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW', TRUE),
('Helen', '{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW', TRUE),
('Tom', '{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW', TRUE);
2、示例代码
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
private String username;
private String password;
private Boolean enabled;
}
3、自定义管理器
@Component
public class DbUserManager implements UserDetailsManager, UserDetailsPasswordService {
private final UserMapper userMapper;
public DbUserManager(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public UserDetails updatePassword(UserDetails user, String newPassword) {
return null;
}
@Override
public void createUser(UserDetails user) {
}
@Override
public void updateUser(UserDetails user) {
}
@Override
public void deleteUser(String username) {
}
@Override
public void changePassword(String oldPassword, String newPassword) {
}
@Override
public boolean userExists(String username) {
return false;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
List<User> userList = userMapper.selectList(Wrappers.<User>query().eq("username", username));
if (userList.isEmpty()) {
throw new UsernameNotFoundException("用户不存在");
}
User user = userList.getFirst();
if (user == null) {
throw new UsernameNotFoundException("用户不存在");
}
List<GrantedAuthority> authorities = new ArrayList<>();
org.springframework.security.core.userdetails.User securityUser = new org.springframework.security.core.userdetails.User(
user.getUsername(),
user.getPassword(),
true,
true,//用户是否过期
true,//账号凭证是否过期
true,//用户是否锁定
authorities
);
return securityUser;
}
}