3
respostas

Formulário para Cadastro de Usuários

Olá, estou tentando criar um formulário para cadastro de Usuários seguindo o curso SPRING MVC II, porém estou tendo algumas dificuldades. Quero implementar para que quando o usuário realize um cadastro, seja atribuido a ele automaticamente a role "ROLES_USER" por exemplo. Tentei fazer com <form:hidden path="roles[0].nome" value="ROLE_USER"/> , porém ele vai tentar inserir esse valor no banco, e vai dar conflito de chave estrangeira. O meu mapeamento está igual ao utilizado no curso. Alguém poderia me dar uma ajuda nisso?

Segue as minhas classes:

@Repository
public class UsuarioDAO implements UserDetailsService  {

    @PersistenceContext
    private EntityManager manager;

    @Override
    public UserDetails loadUserByUsername(String email){
        List<Usuario> usuarios = manager.createQuery("select u from Usuario u where u.email = :email", Usuario.class)
                .setParameter("email", email)
                .getResultList();

        if (usuarios.isEmpty()) {
            throw new UsernameNotFoundException("O usuário " + email + " não foi encontrado");
        }
        return usuarios.get(0);
    }

    public void cadastrar(Usuario usuario) {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String hasSenha = passwordEncoder.encode(usuario.getSenha());
        usuario.setSenha(hasSenha);
        manager.persist(usuario);
    }

}
@Entity
public class Role implements GrantedAuthority{

    private static final long serialVersionUID = 1L;

    @Id
    private String nome;


    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public String getAuthority() {
        return this.nome;
    }
@Entity
public class Usuario implements UserDetails{

    private static final long serialVersionUID = 1L;

    @Id
    private String email;
    private String nome;
    private String senha;

    @OneToMany(fetch=FetchType.EAGER)
    private List<Role> roles = new ArrayList<Role>();


    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getSenha() {
        return senha;
    }
    public void setSenha(String senha) {
        this.senha = senha;
    }
    public List<Role> getRoles() {
        return roles;
    }
    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return this.roles;
    }

    @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;
    }
    <form:form action="${s:mvcUrl('UC#cadastrar').build() }" method="POST" commandName="usuario">
        <h5 id="ajuste">Dados Pessoais</h5>
        <div class="form-row">
            <div class="col-md-4 mb-3">
                <label for="validationDefault01">Nome Completo</label> <input
                    type="text" name="nome" class="form-control" placeholder="Digite seu Nome"
                    required>
            </div>
        </div>

        <h5 id="ajuste">Dados de Acesso</h5>
        <div class="form-row">
            <div class="col-md-4 mb-3">
                <label for="validationDefault02">Email</label> <input type="email"
                    class="form-control" name="email" placeholder="Digite seu Email" required>
            </div>
            <div class="col-md-4 mb-3">
                <label for="validationDefault02">Senha</label> <input type="password"
                    class="form-control" name="senha" placeholder="Senha" required>
            </div>
            <form:hidden path="roles[0].nome" value="ROLE_USER"/>
        </div>
        <button class="btn btn-primary btn-dark" type="submit">Cadastrar</button>
    </form:form>
3 respostas

Oi Mateus,

por favor use o mapeamento @ManyToMany entre usuário e role. vc precisa gerar o banco novamente para refletir a alteração.

estamos corrigindo essa parte no curso.

abs, Nico

Olá Nico!

Coloquei o mapemaneto ManyToMany, porém recebo um erro.

HTTP Status 500 - Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

Oi Mateus,

vc gerou as tabelas novamente? Isso é preciso pois o relacionamento mudou. Gerando as tabelas, vc deve ter uma tabela apra Roles e uma outra tabela nova separada para representar o relacionamento Usuario_roles.

abs