如何在从 DTO 映射到实体时对密码进行编码



在Spring Boot App中,我想使用Orika Mapper将一个简单的(登录,传递(UserDTO映射到用户实体。我不知道如何在映射时对密码调用PasswordEncoder.encode方法进行编码。我应该使用其他映射器吗?

在映射到实体之前,您可以使用 Spring5 的默认编码器,其工作原理如下

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

有关更多详细信息,您可以查看此处 https://www.baeldung.com/spring-security-5-default-password-encoder

例如,如果您的实体是类似

@Entity
public class User{
 private long id;
 private String username;
 private String encodedPassword;
 //getters and setters
}

并且您的用户DTO是

public class UserDTO{
 private String username;
 private String plainPassword;
 //getters and setters
}

在控制器类或服务中,可以执行以下操作

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
...
@Controller
public class UserController{
...
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@PostMapping ...
public ResponseEntity<?> register(@RequestBody UserDTO dto){
User user = new User();
user.setUsername(dto.getUsername());
//Following line encodes password and set it for Entity
user.setEncodedPassword(bCryptPasswordEncoder.encode(dto.getPlainPassword()));
...
}
}

你可能想找到这样的东西:

@Component
public class MyOwnMapper extends ConfigurableMapper {
    private final PasswordEncoder passwordEncoder;
    @Autowired
    public MyOwnMapper(PasswordEncoder passwordEncoder) {
        this.passwordEncoder = passwordEncoder;
    }
    @Override
    protected void configure(MapperFactory factory) {
        addAdvancedMappers(factory);
    }
    private void addAdvancedMappers(MapperFactory factory) {
        factory.classMap(SourceDTO.class, DestinationEntity.class)
                .byDefault()
                .customize(new CustomMapper<>() {
                        public void mapAtoB(SourceDTO a, DestinationEntity b, MappingContext context) {
                            String encodedPassword = passwordEncoder.encode(a.getPassword());
                            b.setPassword(encodedPassword);
                        }
                    }
                ).register();
    }
}

在此配置中,您只需在所需的任何位置自动连接 MapperFacade 并使用映射方法。

最新更新