从DTO映射到实体时如何编码密码?

时间:2019-04-17 09:43:19

标签: java spring-boot orika

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

3 个答案:

答案 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自动连线到任何需要的地方,并使用地图方法即可。