- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在现有应用程序中引入 Spring Security。目前 db 有 MD5 编码的密码,我们希望将其迁移到 bcrypt。由于我们最初拥有大量用户,因此我们希望同时支持 MD5 和 bcrypt。我们考虑过建立一个表来存储有多少用户迁移到 bcrypt,一旦我们将所有用户迁移到 bcrypt,我们将停止支持 MD5。
所以我想到扩展 SpringSecurity 的 BCryptPasswordEncoder 类并在 matches 方法中执行操作。所以我有下面的类(class),
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
public class CustomPasswordEncoder extends BCryptPasswordEncoder {
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
if (rawPassword == null || encodedPassword == null) {
return false;
}
if (!super.matches(rawPassword, encodedPassword)) { // This is not BCrypt password try OLD password encoding instead
boolean isOldPasswordMatched = rawPassword.equals(SHA1.getSHA1Hash(encodedPassword));
if(isOldPasswordMatched){
migrateToBCrypt(userName /* error here*/, encode(rawPassword));
}
return isOldPasswordMatched;
}
return true;
}
private boolean migrateToBCrypt(String userName, String newBcryptPassword){
//update password in database
//Insert to migrated table
return true;
}
}
但是我的问题是我没有在此函数内获取用户名来进行迁移,如何在密码编码器的 matches() 内获取用户名?我在这里做错了什么吗?在这种情况下最好的方法是什么?
最佳答案
建议的逻辑只是我的想法,您可以根据您的需要进行修改。
public class UserService extends BCryptPasswordEncoder{
public Response login(@RequestBody User user){
User existingUser = UserDao.getInstance().getUserByUsername( user.getUsername() );
//Assuming all the users have `PasswordType` column as "MD5" in user table
if( existingUser.getPasswordType().equals("MD5") ){
// Your MD5 verification method, return boolean
if( verifyMD5(user.getPassword, existingUser.getPassword()) ){
migrateToBCrypt(existingUser, user);
return Response.status(200).entity("Successfully Logged in").build();
}else{
return Response.status(400).entity("Invalid Credentials").build();
}
}else if( existingUser.getPasswordType().equals("BCrypt") ){
if( matches(user.getPassword(), existingUser.getPassword()) ){
return Response.status(200).entity("Successfully Logged in").build();
}else{
return Response.status(400).entity("Invalid Credentials").build();
}
}
}
private void migrateToBcrypt(User existingUser, User user){
existingUser.setPassword( encode(user.getPassword()) );
existingUser.setPasswordType( "Bcrypt" );
UserDao.getInstance().updateUser( existingUser );
}
}
或者,如果您不想在表格上引入另一列,
public class UserService extends BCryptPasswordEncoder{
public Response login(@RequestBody User user){
User existingUser = UserDao.getInstance().getUserByUsername( user.getUsername() );
if( !existingUser.getPassword().startsWith("$") ){
// Your MD5 verification method, return boolean
if( verifyMD5(user.getPassword, existingUser.getPassword()) ){
migrateToBCrypt(existingUser, user);
return Response.status(200).entity("Successfully Logged in").build();
}else{
return Response.status(400).entity("Invalid Credentials").build();
}
}else {
if( matches(user.getPassword(), existingUser.getPassword()) ){
return Response.status(200).entity("Successfully Logged in").build();
}else{
return Response.status(400).entity("Invalid Credentials").build();
}
}
}
private void migrateToBcrypt(User existingUser, User user){
existingUser.setPassword( encode(user.getPassword()) );
UserDao.getInstance().updateUser( existingUser );
}
}
关于java - 如何在Spring Security中的自定义PasswordEncoder中获取用户名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32499840/
目前我得到了主课: package com.recweb.springboot; import org.springframework.boot.SpringApplication; import o
我的密码编码器有问题, 我的代码: @Service public class UserService { private static final String DEFAULT_ROLE =
我正在使用 Spring-Boot v1.3.0.M2。我正在尝试使用注释定义一个 o.s.s.c.p.PasswordEncoder 。我的配置类如下所示。这个例子运行良好。 @Configurat
实现 Bcrypt 密码编码器后,我无法进行身份验证(凭据无效)。这是我要添加的用户: userRepository.save(new User("First", "Last", "user", "u
spring boot报错:There is no PasswordEncoder mapped for the id "null" 原因:新版spring boot需要在自定义的WebSecurit
我目前正在我的大学从事 Spring Boot/Angular 项目。我正在为 BCryptPasswordEncoder 的匹配函数苦苦挣扎,它总是返回 false。 用户.java @Entity
我正在尝试学习 spring 并创建一个网站,其中身份验证将通过登录页面关闭,角度传递给 spring,需要使用 ldap 进行身份验证。我想我会从 Spring 站点开始并浏览那里的指南,但它似乎使
我成功地建立了内存认证。但是当我要使用数据库构建它时,会出现这个错误。 There is no PasswordEncoder mapped for the id "null" 这是后续教程 - Sp
我正在使用 Spring 4.0.8 RELEASE 和 Spring-Security 3.2.5 RELEASE 我正在使用只有注册用户才能访问的 HTTP 摘要构建 REST Web 服务。 我
从 Spring Security 3.1.4.RELEASE 开始,旧的 org.springframework.security.authentication.encoding.PasswordE
我已经在我的 struts2 应用程序上实现了 Spring security,它运行良好,但它在第 3 行遇到错误 java.lang.NullPointerException。 虽然看起来 pas
我已经在我的 struts2 应用程序上实现了 Spring security,它运行良好,但它在第 3 行遇到错误 java.lang.NullPointerException。 虽然看起来 pas
在我的网络应用程序上部署时出现此错误 Context initialization failed org.springframework.beans.factory.BeanCreat
我正在从 Spring Boot 1.4.9 迁移到 Spring Boot 2.0 以及 Spring Security 5,并且我尝试通过 OAuth 2 进行身份验证。但我收到此错误: java
我已经存储(并编码)了一个电子邮件密码。我使用过 PasswordEncoder(Spring 安全)。 passwordEncoder.encode(password); 现在我需要对其进行解码以便
我可以使用一些建议来模拟 Grails 单元测试中使用的自动连接依赖项。我已经省略了大部分不必要的代码,只给出了测试类和被测文件类中的相关方法 class UserService { def
我正在从 Spring Boot 1.4.9 迁移到 Spring Boot 2.0 以及 Spring Security 5,我正在尝试通过 OAuth 2 进行身份验证。但是我收到了这个错误: j
我正在尝试运行一个基本的安全应用程序,当我在 Postman 中输入凭据时,我没有收到预期的 token 。我正在学习基本教程并正确执行了所有步骤,但我得到 401“未授权”状态。我试过使用 Bcry
使用 Spring Security Oauth2 时,我正在尝试对存储在数据库中的客户端 secret 进行 BCrypt 加密。我可以看到 JdbcClientDetailsService有一个
升级IDEA后启动项目时出现问题。 当前错误如下: CONFIGURE SUCCESSFUL in 2s |Running application... > Task :compileJava NO-
我是一名优秀的程序员,十分优秀!