Acompanhei todo o curso e resolvi fazer uma atividade diferente para fixar o assunto abordado, porem estou com duvidas sobre como criar o cadastro de um usuário e definir permissão de administrador ou não através de um check box e não de um List<>, já que tem apenas uma opção. Tentei fazer como segue abaixo:Eu criei uma classe UsuarioDAO herdando de UserDetailsService:
public interface UsuarioDAO extends UserDetailsService{
void salvar(Usuario usuario);
void editar(Usuario usuario);
void excluir(Long id);
Usuario getEmail(String email);
List<Usuario> getTodos();
List<Usuario> getBySexo(TipoSexo sexo);
List<Usuario> getByNome(String nome);
UserDetails loadUserByUsername(String arg0);
}
e criei uma classe para implementar esse o UsuarioDAO:
@Repository
@Transactional
public class UsuarioDAOImpl implements UsuarioDAO {
@PersistenceContext
private EntityManager entityManager;
@Override
public void salvar(Usuario usuario) {
BCryptPasswordEncoder passwordEncoder= new BCryptPasswordEncoder();
String hasSenha = passwordEncoder.encode(usuario.getSenha());
usuario.setSenha(hasSenha);
entityManager.persist(usuario);
}
@Override
public void editar(Usuario usuario) {
entityManager.merge(usuario);
}
@Override
public void excluir(Long id) {
entityManager.remove(entityManager.getReference(Usuario.class, id));
}
@Transactional(readOnly = true)
@Override
public Usuario getEmail(String email) {
String jpql = "from Usuario u where u.email = :email";
TypedQuery<Usuario> query = entityManager.createQuery(jpql, Usuario.class);
query.setParameter("email", email);
return query.getSingleResult();
}
@Transactional(readOnly = true)
@Override
public List<Usuario> getTodos() {
String jpql = "from Usuario u";
TypedQuery<Usuario> query = entityManager.createQuery(jpql, Usuario.class);
return query.getResultList();
}
@Transactional(readOnly = true)
@Override
public List<Usuario> getBySexo(TipoSexo sexo) {
String jpql = "from Usuario u where u.sexo = :sexo";
TypedQuery<Usuario> query = entityManager.createQuery(jpql, Usuario.class);
query.setParameter("sexo", sexo);
return query.getResultList();
}
@Transactional(readOnly = true)
@Override
public List<Usuario> getByNome(String nome) {
String jpql = "from Usuario u where u.nome like :nome or u.sobrenome like :sobrenome";
TypedQuery<Usuario> query = entityManager.createQuery(jpql, Usuario.class);
query.setParameter("nome", "%"+nome+"%");
query.setParameter("sobrenome", "%"+nome+"%");
return query.getResultList();
}
@Transactional(readOnly=true)
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
String jpql = "select u from Usuario u where u.email = :email";
List<Usuario> usuarios = entityManager.createQuery(jpql, Usuario.class)
.setParameter("email", email).getResultList();
if (usuarios.isEmpty()) {
throw new UsernameNotFoundException("O usuário " + email + " não foi encontrado");
}
return usuarios.get(0);
}
}
Criei um Enum Role com apenas uma opção que é ADMIN:
public enum Role {
ADMIN("Administrador");
private String descricao;
private Role(String descricao) {
this.descricao = descricao;
}
public String getDescricao() {
return descricao;
}
}
Desta forma gera um erro na classe Usuario na implementação do método getAuthorities da classe UserDetails:
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return Role.ADMIN.getDescricao();
}
@Override
public String getPassword() {
return this.senha;
}
@Override
public String getUsername() {
return this.email;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}