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>