Estou implementando uma autenticação na minha API com Spring Security,
consigo cadastrar um novo usuário tudo certo porém estou tendo problemas ao dar a ROLE para esse usuário.
Quando realizo a requisição o hibernate retorna:
Hibernate:
select
receita0_.id as id1_1_,
receita0_.ano as ano2_1_,
receita0_.data as data3_1_,
receita0_.descricao as descrica4_1_,
receita0_.mes as mes5_1_,
receita0_.valor as valor6_1_
from
receitas receita0_
Hibernate:
select
receita0_.id as id1_1_,
receita0_.ano as ano2_1_,
receita0_.data as data3_1_,
receita0_.descricao as descrica4_1_,
receita0_.mes as mes5_1_,
receita0_.valor as valor6_1_
from
receitas receita0_
Hibernate:
select
receita0_.id as id1_1_,
receita0_.ano as ano2_1_,
receita0_.data as data3_1_,
receita0_.descricao as descrica4_1_,
receita0_.mes as mes5_1_,
receita0_.valor as valor6_1_
from
receitas receita0_
Hibernate:
select
user0_.id as id1_3_0_,
user0_.name as name2_3_0_,
user0_.password as password3_3_0_,
user0_.username as username4_3_0_
from
users user0_
where
user0_.id=?
Hibernate:
select
role0_.id as id1_2_0_,
role0_.name as name2_2_0_
from
roles role0_
where
role0_.id=?
Hibernate:
delete
from
users_roles
where
user_id=?
Nesse final da pra ver que eles faz um "from user_roles" acredito que seja aí o problema mas não consegui identificar ainda no código o por quê.
Será problema de mapeamento?
Minha entidade User:
@Entity
@Data
@Table(name = "users")
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String username;
private String password;
@ManyToMany
private List<Role> roles;
}
Entidade role:
@Entity
@Table(name = "roles")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
public Role(Long id) {
this.id = id;
}
}
Service atribuindo role:
@Service
public class CreateRoleUserService {
@Autowired
UserRepository userRepository;
public User execute(CreateUserRoleDTO createUserRoleDTO) {
Optional<User> userExists = userRepository.findById(createUserRoleDTO.getIdUser());
List<Role> roles = new ArrayList<>();
if (userExists.isEmpty()) {
throw new Error("User does not exists!");
}
roles = createUserRoleDTO.getIdsRoles().stream().map(role -> {
return new Role(role);
}).collect(Collectors.toList());
User user = userExists.get();
user.setRoles(roles);
userRepository.save(user);
return user;
}
}
DTO para criar role:
import lombok.Data;
import java.util.List;
@Data
public class CreateUserRoleDTO {
private Long idUser;
private List<Long> idsRoles;
}
createUserService:
@Service
public class CreateUserService {
@Autowired
UserRepository userRepository;
private BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
public User execute(User user) {
User existsUser = userRepository.findByUsername (user.getUsername());
if(existsUser != null) {
throw new Error("User already exists!");
}
user.setPassword(passwordEncoder().encode(user.getPassword()));
User createdUser = userRepository.save(user);
return createdUser;
}}
Repositorio com o projeto completo: https://github.com/matthewmatheus/renda-familiar-api