【Spring Security】 使用数据库用户登录案例
【Spring Security】 使用数据库用户登录案例
Metadata
title: 【Spring Security】 使用数据库用户登录案例
date: 2023-02-02 11:43
tags:
- 行动阶段/完成
- 主题场景/组件
- 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
- 细化主题/Module/SpringSecurity
categories:
- SpringSecurity
keywords:
- SpringSecurity
description: 【Spring Security】 使用数据库用户登录案例
【Spring Security】 使用数据库用户登录案例
相关理论
- [[../【Spring Security】 认证/【Spring Security】 用户 密码 认证]]
- [[../【Spring Security】 认证/【Spring Security】 登录核心类]]
1. 创建 RBAC 五张表
RBAC,即基于角色的权限访问控制(Role-Based Access Control),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成 “用户 - 角色 - 权限” 的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。
2. 搭建基础环境
- 之前入门案例添加 mybatisplus
- 使用 mybatisplus 代码生成器生成三层代码
- 配置数据库连接,并测试环境
3. 实现 UserDetailsService 接口
[[mybatis]] 添加根据用户名查询用户信息接口:
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public User getUserByName(String username) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getUserName, username);
return getOne(queryWrapper);
}
}
实现 UserDetailsService 接口,数据库查询用户,将用户名,密码,权限集合,返回给 Security。
/**
* Created by TD on 2021/7/6
* 自定义加载用户信息接口实现
*/
@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
@Autowired
UserService userService;
/**
* @param username 用户名
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 1. 数据库查询用户
User user = userService.getUserByName(username);
if (user == null) {
throw new UsernameNotFoundException("用户名不存在!");
}
// 2. 设置权限集合,后续需要数据库查询
List<GrantedAuthority> authorityList =
AuthorityUtils.commaSeparatedStringToAuthorityList("role");
// 3. 返回Security中的用户
return new org.springframework.security.core.userdetails.User(user.getUserName(), user.getPassword(), authorityList);
}
}
4. 添加 Security 配置类
@Configuration
@EnableWebSecurity(debug = true)
public class MyWebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
MyUserDetailsService myUserDetailsService;
@Override
public void configure(WebSecurity web) throws Exception {
super.configure(web);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 设置自定义用户认证
auth.userDetailsService(myUserDetailsService);
super.configure(auth);
}
/**
* 注入密码解析器到IOC中
*/
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
5. 测试
使用 test/12356 登录成功,搭建完成。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 蝶梦庄生!
评论