在Spring Boot App中,我想使用Orika Mapper将一个简单的(登录,传递)UserDTO
映射到一个用户实体。我不知道如何在映射时对调用PasswordEncoder.encode
方法的密码进行编码。
我应该使用其他映射器吗?
答案 0 :(得分:1)
在映射到实体之前,可以使用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
答案 1 :(得分:1)
例如,如果您的实体是类似
@Entity
public class User{
private long id;
private String username;
private String encodedPassword;
//getters and setters
}
您的UserDTO是
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()));
...
}
}
答案 2 :(得分:0)
您可能想找到这样的东西:
@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自动连线到任何需要的地方,并使用地图方法即可。