内容简介:200111-SpringBoot 整合 SpringSecurity 之基于内存认证(一)在第一篇的教程中,我们简单的了解了一下 SpringSecurity 的使用姿势,添加依赖,在默认的配置只能设置一个账号,那么如果需要多个账号可以怎么支持呢?
200111-SpringBoot 整合 SpringSecurity 之基于内存认证(一)
在第一篇的教程中,我们简单的了解了一下 SpringSecurity 的使用姿势,添加依赖,在 application.yml 文件中加几行配置,就可以实现一个基本的登录认证;
默认的配置只能设置一个账号,那么如果需要多个账号可以怎么支持呢?
本文将介绍一下基于内存的认证方式
I. 内存认证
基于内存保存认证信息的方式,本篇博文中,会介绍两种常见的使用姿势
0. 项目配置
环境配置和前面一致,相关内容可以参考博文: 191223-SpringBoot 整合 SpringSecurity 之起源篇(零)
1. WebSecurityConfigurerAdapter
这里主要是借助 SpringSecurity 的配置适配器来处理,下面是一个简单的 case
@Configuration
public class SecurityAdapterConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 测试时,可以直接用下面的方式
// User.UserBuilder builder = User.withDefaultPasswordEncoder();
User.UserBuilder builder = User.builder().passwordEncoder(passwordEncoder()::encode);
auth.inMemoryAuthentication().withUser(builder.username("hui1").password("123456").roles("guest").build());
auth.inMemoryAuthentication().withUser(builder.username("hui2").password("123456").roles("guest").build());
}
}
主要逻辑在 configure 这个方法中,但是需要注意,我们额外的设置了密码的加密方式, 当我们不设置这个的时候,实际登录的时候会发现,即便你输入了正确的用户名密码,也会提示失败(欢迎各位大佬实测一下)
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
其次,在创建用户的时候,需要注意的是,除了设置了用户名和密码之外,还给用户加上了一个角色,这个会在后续文章的 RBAC(基于角色的授权)中介绍它的作用
2. UserDetailsService
这里介绍另外一种方式,在后面的 db 中保存认证信息时,也会用到;在 SpringSecurity 的实现中,通过 UserDetailService 这个 bean 来根据用户名查询对应的用户信息;所以我们只需要实现一个我们自定义的 Bean 来替换默认的,就可以来实现我们的目标
我们的配置类如下
@Configuration
public class SecurityAutoConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
/**
* 基于内存的认证方式
*
* @param passwordEncoder
* @return
*/
@Bean
public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
User.UserBuilder users = User.builder().passwordEncoder(passwordEncoder::encode);
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(users.username("1hui").password("123456").roles("guest").build());
manager.createUser(users.username("2hui").password("666666").roles("manager").build());
manager.createUser(users.username("3hui").password("root").roles("admin").build());
return manager;
}
}
3. 测试
上面两种方式,都可以实现在内存中保存认证信息,接下来我们进入实测环节,首先写一个 http 接口
@RestController
public class IndexRest {
public String getUser() {
// 获取用户信息
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
String userName;
if (principal instanceof UserDetails) {
userName = ((UserDetails) principal).getUsername();
} else {
userName = principal.toString();
}
return userName;
}
/**
* @return
*/
@GetMapping(path = {"/"})
public String index() {
return "hello this is index! welcome " + getUser();
}
}
在实际测试时,上面两种 case 都是 ok 的,下面的演示过程主要是基于第二种方式给出的示例
II. 其他
0. 系列博文&项目源码
博文
源码
-
工程: https://github.com/liuyueyi/spring-boot-demo [1]
-
源码:- https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-security/001-authentication-mem-config [2] - https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-security/001-authentication-mem-userdetail [3]
1. 一灰灰 Blog
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
-
一灰灰 Blog 个人博客 https://blog.hhui.top [4]
-
一灰灰 Blog-Spring 专题博客 http://spring.hhui.top [5]
参考资料
https://github.com/liuyueyi/spring-boot-demo: https://github.com/liuyueyi/spring-boot-demo
https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-security/001-authentication-mem-config: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-security/001-authentication-mem-config
https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-security/001-authentication-mem-userdetail: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-security/001-authentication-mem-userdetail
https://blog.hhui.top: https://blog.hhui.top
http://spring.hhui.top: http://spring.hhui.top
以上所述就是小编给大家介绍的《Spring Boot 整合 Spring Security 之基于内存认证(一)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- (七) SpringBoot起飞之路-整合SpringSecurity(Mybatis、JDBC、内存)
- Spring Boot 整合 Spring Security 之基于内存认证(一)
- SpringBoot整合MybatisPlus的简单教程(简单整合)
- springmvc教程--整合mybatis开发(spring+springMVC+mybatis整合开发)
- springboot整合springsecurity从Hello World到源码解析(五):springsecurity+jwt整合restful服务
- SSM整合搭建(二)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员修炼之道(影印版)
Andrew Hunt、David Thomas / 中国电力出版社 / 2003-8-1 / 39.00
本书直击编程陈地,穿过了软件开发中日益增长的规范和技术藩篱,对核心过程进行了审视——即根据需求,创建用户乐于接受的、可工作和易维护的代码。本书包含的内容从个人责任到职业发展,直至保持代码灵活和易于改编重用的架构技术。从本书中将学到防止软件变质、消除复制知识的陷阱、编写灵活、动态和易适应的代码、避免出现相同的设计、用契约、断言和异常对代码进行防护等内容。一起来看看 《程序员修炼之道(影印版)》 这本书的介绍吧!