环境准备
本次数据库我们选择MySQL 5.7
,新建一个boot_study
库,建立一张登录用户表login_user
CREATE TABLE `login_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`enabled` tinyint(1) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `username_union_index`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
使用Mybatis-Plus配置实体类和mapper
新建实体类:
@Data
@TableName("login_user")
@ApiModel(value = "loginUserDO对象", description = "用户登录信息表")
public class LoginUserDO {
@TableId(type = IdType.AUTO)
@ApiModelProperty("id")
private Integer id;
@TableField
@ApiModelProperty("用户名")
private String username;
@TableField
@ApiModelProperty("密码")
private String password;
@TableField
@ApiModelProperty("是否启用")
private Boolean enabled;
}
新建mapper文件
@Mapper
public interface BookMapper extends BaseMapper<BookDO> {
}
UserDetailsService
我们要通过数据库来存储我们用户信息,也是通过这个类来实现。我们可以看一下继承关系:
我们之前使用内存来存储用户信息的InMemoryUserDetailsManager
也是实现了这个接口。
自定义实现UserDetailsService
接口:
/**
* @author hejing
* @date 2024/4/22
*/
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Resource
private LoginUserMapper mapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 根据用户名查询用户数据
LambdaQueryWrapper<LoginUserDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(StrUtil.isNotBlank(username),LoginUserDO::getUsername, username);
LoginUserDO user = mapper.selectOne(queryWrapper);
if(user == null) {
throw new UsernameNotFoundException(StrUtil.format("用户 {} 没有找到", username));
}else {
// 账号权限设置
List<GrantedAuthority> authorities = AuthorityUtils.
commaSeparatedStringToAuthorityList("role");
// 生成用户信息给Spring Security
return new User(username, user.getPassword(),user.getEnabled(),true,
true,true, authorities);
}
}
}
返回的是UserDetails
接口的实现,Spring Security中为我们提供了一个大部分情况下都能直接使用的实现类User
,如果User
不能满足项目需求,也可以自定义实现UserDetails
。