SpringBoot 集成 SpringSecurity 详解(三)-- 基于内存实现多用户认证信息

SpringBoot 集成 SpringSecurity 详解(三)-- 基于内存实现多用户认证信息

需求缘起

上一节我们实现了默认单用户认证,这一节我们来实现通过基于内存配置多个用户认证信息,主要是为了方便进一步理解SpringSecurity 这个框架。

技术要点

通过 auth.inMemoryAuthentication() 对象配置用户身份信息。

编码

@Configuration
@EnableWebSecurity//开启Spring Security的功能
public class SecurityConfig  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //通过内存创建用户名和密码
        auth.inMemoryAuthentication().withUser("user").password("123456").roles();
        auth.inMemoryAuthentication().withUser("admin").password("123456").roles();
    }
}

加密

以上的代码可以正常启动,但是输入用户名和密码后会出现异常:

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"

在 SpringSecurity 5.x 中,密码需要经过加密,也就是需要一个编码器 PasswordEncorder的实例。

有两种添加的方式
1. 通过 AuthenticationManagerBuilder 指定添加
修改以上代码

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //通过内存创建用户名和密码
        auth.inMemoryAuthentication().withUser("user").password("123456").roles();
        auth.inMemoryAuthentication()
                .withUser("admin")
                //指定编码器
                .password(new BCryptPasswordEncoder().encode("123456"))
                .roles();
    }

2. 通过bean 指定编码器
在SecurityConfig 类中直接添加

    @Bean
    public PasswordEncoder passwordEncoder() {
        //SpringSecurity 提供的一种编码器,我们也可以自己实现PasswordEncoder
        return new BCryptPasswordEncoder();
    }

最后整体代码如下(采用第二种加密方式):

@Configuration
@EnableWebSecurity//开启Spring Security的功能
public class SecurityConfig  extends WebSecurityConfigurerAdapter {
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        //SpringSecurity 提供的一种编码器,我们也可以自己实现PasswordEncoder
        return new BCryptPasswordEncoder();
    }

   @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //通过内存创建用户名和密码
        auth.inMemoryAuthentication().withUser("user").password(passwordEncoder.encode("123456")).roles();
        auth.inMemoryAuthentication().withUser("admin").password(passwordEncoder.encode("123456")).roles();
    }
}

测试

重启应用,访问http://localhost:8080/hello测试即可

demo 代码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值