3
respostas

Formulário para cadastro de usuário

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;
    }
3 respostas

Fala Edu, tudo bem?

Qual é o erro que está ocorrendo?

Abraço!

Tudo bem cara, obrigado! Cara, o método getAuthorities aguarda por um Collection, não é isso? E como a minha classe Role só possui uma opção, Admin, eu retorno uma string que é a descrição. Aí não sei o que fazer. Eu tentei return Role.Admin.getDescricao.

Alguém poderia me ajudar?!