Spring Boot+Spring Security:基于内存的认证信息 - 第3篇

本文介绍了如何在Spring Boot结合Spring Security项目中,通过内存配置多个用户认证信息。首先,需要创建一个配置类`WebSecurityConfig`,继承`WebSecurityConfigurerAdapter`并重写`configure`方法。接着,通过`AuthenticationManagerBuilder`的`inMemoryAuthentication()`设置用户和密码。在Spring Security 5.x版本中,由于密码加密方式的改变,会出现错误。解决方法包括:在`AuthenticationManagerBuilder`中直接指定加密方式,如使用BCrypt,或者通过@Bean注入`PasswordEncoder`。推荐使用第二种方式,以提高代码可读性和扩展性。
摘要由CSDN通过智能技术生成

需求缘起

       上面我们简单体验了下Spring Security,但是现在只能有一个用户信息,我们这里希望可以配置多个账号信息,本节主要讲解下如何在内存中配置认证信息。

 

编码思路

       我们要在内存中初始化我们的认证信息的话,那么需要是重写WebSecurityConfigurerAdapter类中的configure方法:

configure(AuthenticationManagerBuilder auth)

然后通过auth对象的inMemoryAuthentication()方法指定认证信息:

auth.inMemoryAuthentication().withUser("admin").password("123456");

       综上所述,首先需要定义一个配置类WebSecurityConfig继承WebSecurityConfigurerAdapter;接着重写里面的configure方法;最后使用AuthenticationManagerBuilder构建认证信息。

 

一、基于内存的认证信息

       我们基于上一篇文章中的项目springboot2-springSecurity01进行编码。

1.1 创建一个配置类

       我们定义一个WebSecurityConfig,继承WebSecurityConfigurerAdapter,如下代码:

package com.kfit.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
	
	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		
		/*
		 * 配置为从内存中进行加载认证信息.
		 * 这里配置了两个用户 admin和user
		 */
		auth.inMemoryAuthentication().withUser("admin").password("123456").roles();
		auth.inMemoryAuthentication().withUser("user").password("123456").roles();
	}
}

说明:

(1)@Configuration:注解这是一个配置类。

(2)@EnableWebSecurity:注解开启Spring Security的功能。

(3)WebSecurityConfigurerAdapter:继承WebSecurityConfigurerAdapter,并重写它的方法来设置一些web安全的细节。

(4)configure(AuthenticationManagerBuilder auth):在内存中创建了用户admin/user,密码为123456。

       如果是5.x之前的版本的话,那么到这里启动的话,就可以正常访问了,但是如果是5.x的版本的话,可以正常启动,但是在登录页面输入admin/123456账号进行访问的话,会报如下错误:

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

       这是因为Spring Security 5.0中新增了多种加密方式,也改变了密码的格式。

1.2 密码加密

       上面异常原因就是因为没有指定加密方式,那么怎么指定呐?

1.2.1 方式一:通过AuthenticationManagerBuilder指定

       在AuthenticationManagerBuilder的方法中就可以指定加密方式了,如下代码:

		auth.inMemoryAuthentication()
			.passwordEncoder(new BCryptPasswordEncoder())
			.withUser("admin")
			.password(new BCryptPasswordEncoder().encode("123456"))
			.roles();
		
		auth.inMemoryAuthentication()
			.passwordEncoder(new BCryptPasswordEncoder())
			.withUser("user")
			.password(new BCryptPasswordEncoder().encode("123456"))
			.roles();

说明:

(1)Bcrypt: bcrypt是一种跨平台的文件加密工具。bcrypt 使用的是布鲁斯·施内尔在1993年发布的 Blowfish 加密算法。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。

 

1.2.2 方式二:通过@Bean注入指定PasswordEncoder

       在WebSecurityConfig配置类中,通过@Bean注入PasswordEncoder具体的实现类,如下代码:

	@Bean  
    public PasswordEncoder passwordEncoder() {  
        return new BCryptPasswordEncoder();  
    }

       加入这个之后,需要修改configure的密码加密:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		
		/*
		 * 配置为从内存中进行加载认证信息.
		 * 这里配置了两个用户 admin和user
		 */
		auth.inMemoryAuthentication()
			.withUser("admin")
			.password(passwordEncoder().encode("123456"))
			.roles();
		
		auth.inMemoryAuthentication()
			.withUser("user")
			.password(passwordEncoder().encode("123456"))
			.roles();
}

       对于上面的两种方式,推荐使用第二种方式,这种方式一方面更容易理解,另外代码扩展性更强。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟纤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值