@Mapper
public interface UserMapper {
User loadUserByUsername(String username);
List<Role> getRolesByUserId(Integer userId);}
创建UserService
@Service
public class UserService implements UserDetailsService {
@Resource
private UserMapper userMapper;
/**
* 根据用户名去数据库获取用户信息,SpringSecutity会自动进行密码的比对
* @param username
* @return
* @throws UsernameNotFoundException
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 用户名必须是唯一的,不允许重复,密码会默认使用注入的加密
User user = userMapper.loadUserByUsername(username);
if(ObjectUtils.isEmpty(user)){
throw new UsernameNotFoundException("根据用户名找不到该用户的信息!");}
List<Role> roleList = userMapper.getRolesByUserId(user.getId());
user.setRoles(roleList);return user;}}
实体类Role
public class Role implements Serializable {
private Integer id;
private String name;
private String description;
public Integer getId(){returnid;}
public void setId(Integer id){
this.id =id;}
public String getName(){return name;}
public void setName(String name){
this.name = name;}
public String getDescription(){return description;}
public void setDescription(String description){
this.description = description;}
@Override
public String toString(){return"Role{" +
"id=" + id +
", name='" + name + '\'' +
", description='" + description + '\'' +
'}';}}
实体类User
public class User implements UserDetails {
private Integer id;
private String username;
private String password;
private Boolean enabled;
private Boolean locked;
private List<Role> roles;
public Integer getId(){returnid;}
public void setId(Integer id){
this.id =id;}
public void setUsername(String username){
this.username = username;}
@Override
public Collection<? extends GrantedAuthority>getAuthorities(){
List<SimpleGrantedAuthority> list = new ArrayList<>();for(Role role : roles){
list.add(new SimpleGrantedAuthority("ROLE_" + role.getName()));}return list;}
@Override
public String getPassword(){return password;}
@Override
public String getUsername(){return username;}
// 账户是否未过期
@Override
public boolean isAccountNonExpired(){returntrue;}
// 账户是否未锁定
@Override
public boolean isAccountNonLocked(){return!locked;}
// 凭证是否未过期
@Override
public boolean isCredentialsNonExpired(){returntrue;}
@Override
public boolean isEnabled(){return enabled;}
public void setPassword(String password){
this.password = password;}
public void setEnabled(Boolean enabled){
this.enabled = enabled;}
public void setLocked(Boolean locked){
this.locked = locked;}
public List<Role>getRoles(){return roles;}
public void setRoles(List<Role> roles){
this.roles = roles;}
@Override
public String toString(){return"User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", enabled=" + enabled +
", locked=" + locked +
'}';}}
实体类UserRoleRef
public class UserRoleRef implements Serializable {
private Integer id;
private Integer userId;
private Integer roleId;
public Integer getId(){returnid;}
public void setId(Integer id){
this.id =id;}
public Integer getUserId(){return userId;}
public void setUserId(Integer userId){
this.userId = userId;}
public Integer getRoleId(){return roleId;}
public void setRoleId(Integer roleId){
this.roleId = roleId;}
@Override
public String toString(){return"UserRoleRef{" +
"id=" + id +
", userId=" + userId +
", roleId=" + roleId +
'}';}}
UserMapper.xml
<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.springsecurity.cn.Mapper.UserMapper"><select id="loadUserByUsername"resultType="com.springsecurity.cn.pojo.User">select * from user where username =#{username}</select><select id="getRolesByUserId"resultType="com.springsecurity.cn.pojo.Role">select * from role where idin(select role_id from user_role_ref where user_id =#{userId})</select></mapper>
sql
/*
Navicat Premium Data Transfer
Source Server : location
Source Server Type : MySQL
Source Server Version :50731
Source Host : localhost:3306
Source Schema : security
Target Server Type : MySQL
Target Server Version :50731
File Encoding :65001
Date: 13/07/2022 12:49:14
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS =0;
-- ----------------------------
-- Table structure for role
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role`(`id` int(11) NOT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`(`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`password` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`enabled` tinyint(1) NULL DEFAULT NULL,
`locked` tinyint(1) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT =2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for user_role_ref
-- ----------------------------
DROP TABLE IF EXISTS `user_role_ref`;
CREATE TABLE `user_role_ref`(`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NULL DEFAULT NULL,
`role_id` int(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT =2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS =1;