在第一篇的教程中,咱们简单的了解了一下 SpringSecurity 的使用姿式,添加依赖,在application.yml
文件中加几行配置,就能够实现一个基本的登陆认证;git
默认的配置只能设置一个帐号,那么若是须要多个帐号能够怎么支持呢?github
本文将介绍一下基于内存的认证方式spring
<!-- more -->app
基于内存保存认证信息的方式,本篇博文中,会介绍两种常见的使用姿式ide
环境配置和前面一致,相关内容能够参考博文: 191223-SpringBoot 整合 SpringSecurity 之起源篇(零)spring-boot
这里主要是借助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(基于角色的受权)中介绍它的做用ui
这里介绍另一种方式,在后面的 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; } }
上面两种方式,均可以实如今内存中保存认证信息,接下来咱们进入实测环节,首先写一个 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 的,下面的演示过程主要是基于第二种方式给出的示例
博文
源码
尽信书则不如,以上内容,纯属一家之言,因我的能力有限,不免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的我的博客,记录全部学习和工做中的博文,欢迎你们前去逛逛