Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在Spring Security 5中如何使用默认的Password Encoder

在Spring Security 5中如何使用默认的Password Encoder

作者头像
烟雨平生
发布于 2023-03-07 08:17:53
发布于 2023-03-07 08:17:53
1.6K00
代码可运行
举报
文章被收录于专栏:数字化之路数字化之路
运行总次数:0
代码可运行
原文链接:https://www.baeldung.com/spring-security-5-default-password-encoder

作者: baeldung

译者: helloworldtang

1. 概览

在Spring Security 4中,可以使用in-memory认证模式直接将密码以纯文本的形式存储。

在Spring Security 5中,密码管理机制进行了一次大的修改,默认引入了更安全的加/解密机制。这意味着,如果您的Spring应用程序使用纯文本的方式存储密码,升级到Spring Security 5后可能会出现问题。

在这个简短的教程中,我们将描述其中一个潜在的问题,并演示如何解决。

2. Spring Security 4

我们将给出一个常规的安全配置,它使用了简单的in-memory认证模式(适用于Spring 4):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class InMemoryAuthWebSecurityConfigurer 
  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) 
      throws Exception {
        auth.inMemoryAuthentication()
          .withUser("spring")
          .password("secret")
          .roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .antMatchers("/private/**")
          .authenticated()
          .antMatchers("/public/**")
          .permitAll()
          .and()
          .httpBasic();
    }
}

这个配置定义了所有映射到/private/的方法都需要身份认证,并且所有映射到/public/的方法都不需要身份认证。

如果我们在Spring Security 5使用相同的配置,将会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"

这个错误告诉我们,给定的密码 不能被解码,这是因为我们的in-memory认证模式没有配置Password Encoder 。

3. Spring Security 5

我们可以通过使用PasswordEncoderFactories类创建一个DelegatingPasswordEncoder的方式来解决这个问题。

我们使用这个Password Encoder来配置我们的用户信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class InMemoryAuthWebSecurityConfigurer 
  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) 
      throws Exception {
        PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
        auth.inMemoryAuthentication()
          .withUser("spring")
          .password(encoder.encode("secret"))
          .roles("USER");
    }
}

在这个配置中,我们将使用BCrypt Password Encoder。内存中存储密码的格式如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS

虽然我们可以实现自定义的Password Encoder,但建议使用PasswordEncoderFactories类提供的默认编码器。

3.1. 迁移现有的密码

我们可以通过以下方式将现有密码升级到推荐的Spring Security 5标准:

  • 用BCryptPasswordEncoder加密后的密码更新老密码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String encoded = new BCryptPasswordEncoder().encode(plainTextPassword);
  • 在加密后的密码前添加Password Encoder各自的标识符
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0
  • 当存储密码的Password Encoder未知时,提示用户更新他们的密码

4. 总结

在这个简短的例子中,我们使用新的密码存储机制将一个Spring 4下的,使用了in-memory 认证模式的配置升级到了Spring 5。

与往常一样,您可以在GitHub上查看源代码。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 的数字化之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Boot + Security-01基于内存认证
代码地址:https://github.com/zhangpu1211/Spring-Security-Demos
听城
2020/02/24
7710
【Spring Boot】011-SpringSecurity(安全)
Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是 Shiro 的天下。
訾博ZiBo
2025/01/06
850
【Spring Boot】011-SpringSecurity(安全)
Spring Security 认证的三种方式及简单的授权
在pom.xml文件映入SpringSecutrity依赖启动器,启动项目,访问文章列表页面时,出现默认的登录页,需要用默认用户名:user,密码源于控制台输出,也就是最基础的登录
慕容千语
2020/12/18
3.9K0
Spring学习笔记(三十四)——Springboot集成Spring Security
spring security 是基于 spring 的安全框架。它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权。在 Spring Framework 基础上,spring security 充分利用了依赖注入(DI)和面向切面编程(AOP)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。是一个轻量级的安全框架。它与 Spring MVC 有很好地集成.
不愿意做鱼的小鲸鱼
2022/09/26
1.6K0
Spring学习笔记(三十四)——Springboot集成Spring Security
Spring Security 简单了解使用
Spring Security 是一个基于 Spring 框架的安全框架,提供了一套安全性认证和授权的解决方案,用于保护 Web 应用程序和服务。
Jimmy_is_jimmy
2023/08/02
2920
Spring Security 简单了解使用
SpringSecurity的基础使用
Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.
暴躁的程序猿
2022/03/24
5190
SpringSecurity的基础使用
Spring Security权限框架理论与简单Case
Spring Security 提供了基于javaEE的企业应用软件全面的安全服务。这里特别强调支持使用Spring框架构件的项目,Spring框架是企业软件开发javaEE方案的领导者。如果你还没有使用Spring来开发企业应用程序,我们热忱的鼓励你仔细的看一看。熟悉Spring特别是一来注入原理两帮助你更快更方便的使用Spring Security。
端碗吹水
2020/09/23
7900
Spring Security权限框架理论与简单Case
Spring Framework 学习笔记(4) Spring Security
Spring Secrity 能够在Web请求级别和方法调用级别处理身份认证和授权。
张云飞Vir
2021/07/13
3320
Spring Security入门案例
IoC/DI和AOP功能,为系统提供了声明式安全访问控制功能,减少了为系统安全而编写大量重复代码的工作。主要包含如下几个重要的内容:
ruochen
2021/11/25
1.3K0
Spring Security权限控制
Spring Security官网 : https://projects.spring.io/spring-security/
二十三年蝉
2022/03/10
1.6K0
Spring Security权限控制
Spring boot项目集成security
在进行框架选型时最常用的选择就是在Spring security 和Shiro中进行抉择,Spring security 和 shiro 一样,都具有认证、授权、加密等用于权限管理的功能。但是对于Springboot而言,Spring Security比Shiro更合适一些,他们都是Spring生态里的内容,并且在使用上Spring boot只需要引入Security就可以实现基础的登陆验证。
余生大大
2022/11/02
3820
Spring boot项目集成security
springboot系列学习(二十四):springboot项目里面整合spring Security框架。一步一步带你整合使用,小白必看(一)
我们的一个普通项目,没有安全的限制也是可以使用的,但是在公司里面,安全就是必须的,不是说非要使用安全框架springsecurity框架。之前我们学过的过滤器,拦截器也是可以实现一定的项目的安全。
一写代码就开心
2020/11/20
8080
springboot系列学习(二十四):springboot项目里面整合spring  Security框架。一步一步带你整合使用,小白必看(一)
Spring 全家桶之 Spring Security(一)
  Spring Security是基于Spring的安全框架,Spring Security提供全面的安全性解决方案,同时在Web Request和Method处理身份认证和授权,在Spring Framework基础上,Spring Security充分利用了Soring的 DI和AOP特性,为应用系统提供了声明式的安全访问控制功能,是一个轻量级的框架,可以很好的与Spring及Spring MVC集成
RiemannHypothesis
2022/08/19
5650
Spring 全家桶之 Spring Security(一)
05 Spring Boot 整合Spring Security
整合Spring Security 整合方法 创建项目时选择security依赖或在pom中添加security依赖 建立SpringSecurityConfig类,继承WebSecurityConfigurerAdapter方法 在刚刚创建的类上添加@EnableWebSecurity注解 设置授权规则 @Override protected void configure(HttpSecurity http) throws Exception { http.authorize
shimeath
2020/07/31
3870
Spring Security 表单登录
本文将重点介绍使用 SpringSecurity登录。 本文将构建在之前简单的Spring MVC示例之上,因为这是设置Web应用程序和登录机制的必不可少的。
乱敲代码
2019/06/26
1.7K0
【Spring Security】003-Spring Security web权限方案(1):用户认证
在resources目录下创建static目录,并创建login.html,name必须是username和password;
訾博ZiBo
2025/01/06
1020
【Spring Security】003-Spring Security web权限方案(1):用户认证
SpringSecurity的使用
我们使用SpringSecurity、shiro两个框架是为了更加简洁的实现安全。
用户11097514
2024/05/30
1560
SpringSecurity的使用
Spring Security 快速了解
我曾经使用 Interceptor 实现了一个简单网站Demo的登录拦截和Session处理工作,虽然能够实现相应的功能,但是无疑Spring Security提供的配置方法更加简单明确,能够更好的保护Web应用。
Rekent
2018/09/04
5580
Spring Security 快速了解
SpringBoot与安全(Spring Security)
​ SpringSecurity 是针对 Spring 项目的安全框架,也是 Spring Boot 底层安全模块的技术选项。他可以实现强大的 web 安全控制。对于安全控制,我们需要引入 spring-boot-starter-securiy 模块。
OY
2022/03/12
7520
SpringBoot与安全(Spring Security)
学习学习SpringSecurity
SpringSecurity是Spring下的一个安全框架,与shiro 类似,一般用于用户认证(Authentication)和用户授权(Authorization)两个部分,常与与SpringBoot相整合。
mySoul
2020/06/07
6100
相关推荐
Spring Boot + Security-01基于内存认证
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验