史上最简单的Spring Security教程(十三):动态用户
前面我们讲过的例子,都是在配置文件中配置的用户信息,包括用户名、密码、角色等,而这些,会被初始化到InMemoryUserDetailsManager中,即存储在内存中。
但是,在实际的业务场景中,不可能只有一个用户,更不可能用户信息都是固定的,而是动态的,需要从存储的地方获取,如数据库。
首先,我们把用户信息存储在数据库中,创建数据库 springsecuritylearning,编码方式 utf8mb4,排序规则 utf8mb4_bin。
然后定义用户表 SYS_USER。
create table SYS_USER
(
ID varchar(32) not null comment '主键',
NAME varchar(60) comment '姓名',
USERNAME varchar(60) comment '账号',
PASSWORD varchar(100) comment '密码',
AGE int comment '年龄',
STATE int comment '状态',
SORT int comment '顺序号',
GMT_CREATE timestamp default CURRENT_TIMESTAMP comment '新增时间,默认当前时间,不随数据改变而改变',
GMT_MODIFIED timestamp default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '修改时间,默认当前时间,随数据改变而改变',
primary key (ID)
);
alter table SYS_USER comment '系统用户';
然后,自定义 UserDetailsService,其核心就是从数据库中获取用户信息。
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
SysUser sysUser = this.userDao.getByUsername(username);
UserDetails user = User.builder()
.username(sysUser.getUsername())
.password(sysUser.getPassword())
.roles("User")
.build();
return user;
}
修改 Spring Security 配置,配置 UserDetailsService 为我们刚才创建的自定义实现。另外,密码加密方式使用的是 BCryptPasswordEncoder。
......
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(customJdbcUserDetailsService()).passwordEncoder(new BCryptPasswordEncoder());
}
private UserDetailsService customJdbcUserDetailsService() {
CustomJdbcUserDetailsService userDetailsService = new CustomJdbcUserDetailsService();
userDetailsService.setUserDao(userDao);
return userDetailsService;
}
......
然后,把配置文件中,关于用户配置的信息全部删除掉。
启动系统,使用原用户名、密码登录,可以成功登录,动态用户改造成功。
至此,动态用户实现完成。
其它详细源码,请参考文末源码链接,可自行下载后阅读。
源码
github
https://github.com/liuminglei/SpringSecurityLearning/tree/master/13
gitee
https://gitee.com/xbd521/SpringSecurityLearning/tree/master/13
回复以下关键字,获取更多资源
SpringCloud进阶之路 | Java 基础 | 微服务 | JAVA WEB | JAVA 进阶 | JAVA 面试 | MK 精讲
笔者开通了个人微信公众号【银河架构师】,分享工作、生活过程中的心得体会,填坑指南,技术感悟等内容,会比博客提前更新,欢迎订阅。
推荐阅读
-
史上最简单的SpringCloud教程 | 分布式配置中心(Spring Cloud Config)(Finchley版本)
-
史上最简单的Spring Security教程(十一):url区分不同的登录失败场景
-
史上最简单的 Spring 教程 | 第四篇:基于注解的IOC配置
-
史上最简单的Spring Security教程(二十):AccessDecisionVoter必须全部拥有请求所需权限才可访问
-
史上最简单的Spring Security教程(四十):SecurityContextPersistenceFilter详解
-
史上最简单的Spring Security教程(十三):动态用户
-
史上最简单的Spring Security教程(十四):动态权限(自定义UserDetailsService)
-
史上最简单的Spring Security教程(十九):AccessDecisionVoter简介及自定义访问权限投票器
-
史上最简单的Spring Security教程(十五):资源权限动态控制(FilterSecurityInterceptor)
-
史上最简单的Spring Security教程(二十七):AuthenticationManager默认实现之ProviderManager详解