Estou desenvolvendo a parte de autenticação da minha API com Spring Security, mas agora encontrei um problema na hora de dar uma 'role' para o meu usuário.
Tenho duas entidades 'User' e 'Role', a roles seriam por exemplo 'USER' e 'ADMIN' para conseguir administrar as permissões de cada uma nos acessos da API.
Através das minhas classes SecurityConfig, UserPrincipal, CustomUserDetailsService, UserRepository, CreateRoleUserService, CreateUserRoleDTO, UserController eu faço toda essa configuração.
O projeto usa JPA Hibernate e todas as tabelas sobem automaticamente inclusive já fazendo o Join de User e Role criando a outra table users_roles no DB.
Ao cadastrar o novo usuário através da requisição no Insomnia dá tudo certo, e na hora de dar a role aparentemente também.
Mas ao tentar usar as credenciais para realizar uma requisição GET que precisa de autorização ele retorna como se o usuário não existisse, mesmo eu tendo acabado de cadastrar e checar no banco de dados se ele ainda está lá.
java.lang.Error: User does not exists!
É o que retorna, essa mensagem é uma personalizada que criei com a exception "Error' no meu service:
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User existsUser = userRepository.findByUserNameFetchRoles(username);
if(existsUser != null) {
throw new Error("User does not exists!");
}
return UserPrincipal.create(existsUser);
}
}
Link do repositório completo: https://github.com/matthewmatheus/renda-familiar-api
Ao subir só precisa adicionar no banco de dados manualmente o seguinte:
INSERT INTO ROLES(ID, NAME) VALUES(1, 'USER');
INSERT INTO ROLES(ID, NAME) VALUES(2, 'ADMIN');
Pois não consegui configurar ainda para fazer isso automaticamente.