基于数据库用户名和密码认证

环境准备

本次数据库我们选择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

配置密码器

启动测试

posted @ 2024-04-22 11:10  无涯子wyz  阅读(54)  评论(0)    收藏  举报