在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 并使用映射方法。