前言
权限管理几乎是每一个后台都要有的功能,spring家族贴心的给我们提供了spring-security,这是一个权限管理框架,本质上是一系列过滤器组成的。
当初学这个学了好久,网上也没有很正规的教程,博客也很多,看的很乱,但最终还是配置好了了。但过一段时间就又全部忘记了,最近几天重新看了一遍,这里做一个笔记,也是做一个分享。
spring-security有很多种模式,我下面实现的是用户-角色
模式(其实我也不知道是不是叫这个名字),就是说用户和角色是多对多的关系,一个用户能有多个角色,一个角色同时有多个用户。
具体实现
1.数据库
两个表,用户表和角色表:
- 用户表:三个字段,id(自增主键)、用户账号(唯一)、密码
- 角色表:三个字段,id(自增主键)、用户账号(唯一)、角色名
说明:这里用户表根据不同需求有不同实现,实际上一定不会这么简单的,这里只是简单模拟一下,大家可以理解即可。
2.pojo层
说明:我用的不是mybatis,而是用的mybatis-plus,,而且也使用lombok,推荐大家也去使用,很方便也很容易学,如果你有mybatis基础的话。
大家如果就按照自己使用的,按照数据库对应实体类就好。
/**
* @Author: chy
* @Description: Role实体类
* @Date: Create in 22:35 2021/1/25
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Role {
@TableId(type = IdType.AUTO,value = "id")
private int id;
@TableField("username")
private String username;
@TableField("role_name")
private String roleName;
}
/**
* @Author: chy
* @Description: User实体类
* @Date: Create in 22:33 2021/1/25
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
@TableId(type = IdType.AUTO,value = "id")
private int id;
@TableField("username")
private String username;
@TableField("password")
private String password;
}
3.dao层
说明:这里也是使用的mybatis-plus,如果你不使用的话,你要在dao层实现两个功能。
第一个:用户的mapper,根据账号(username)查出用户
第二个:角色的mapper,根据账号(username)查出所有角色
/**
* @Author: chy
* @Description: user的dao层
* @Date: Create in 22:41 2021/1/25
*/
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}
/**
* @Author: chy
* @Description: role的dao层
* @Date: Create in 22:42 2021/1/25
*/
@Mapper
@Repository
public interface RoleMapper extends BaseMapper<Role> {
}
4.service层
/**
* @Author: chy
* @Description: service
* @Date: Create in 23:02 2021/1/25
*/
public interface UserService {
}
/**
* @Author: chy
* @Description: serviceImpl
* @Date: Create in 23:02 2021/1/25
*/
@Service
public class UserServiceImpl implements UserService, UserDetailsService {
private final UserMapper userMapper;
private final RoleMapper roleMapper;
public UserServiceImpl(UserMapper userMapper, RoleMapper roleMapper) {
this.userMapper = userMapper;
this.roleMapper = roleMapper;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//查询用户
User user = userMapper.selectOne(new QueryWrapper<User>().eq("username", username));
if (user == null) {
throw new UsernameNotFoundException("用户不存在");
}
//查询用户角色
List<Role> roleList = roleMapper.selectList(new QueryWrapper<Role>().eq("username", username));
//设置