I'm developing a web application with Spring Boot, and I'm trying to implement authentication using spring security. I'm following the Michelli tutorial, but I have the following error:
ButIalreadyregisteredtheuserandassignRoletohim,usingmysql.MyROLEmodel:
packagecom.bigboss.comprafacil.models;importjava.util.List;importjavax.persistence.Entity;importjavax.persistence.Id;importjavax.persistence.ManyToMany;importjavax.persistence.ManyToOne;importjavax.persistence.OneToMany;importorg.springframework.security.core.GrantedAuthority;@EntitypublicclassRoleimplementsGrantedAuthority{@IdprivateStringnomeRole;@ManyToMany(mappedBy="roles")
private List<Usuario> usuarios;
public String getNomeRole() {
return nomeRole;
}
public void setNomeRole(String nomeRole) {
this.nomeRole = nomeRole;
}
public List<Usuario> getUsuarios() {
return usuarios;
}
public void setUsuarios(List<Usuario> usuarios) {
this.usuarios = usuarios;
}
@Override
public String getAuthority() {
// TODO Auto-generated method stub
return this.nomeRole;
}
}
My model USER:
package com.bigboss.comprafacil.models;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import com.bigboss.comprafacil.enuns.Status;
@Entity
public class Usuario implements UserDetails, Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@NotBlank(message = "Nome é uma informação obrigatória.")
@Size(min = 2, max = 30)
private String nome;
private String nomeFantasia;
@NotBlank(message = "Rua é uma informação obrigatória.")
private String rua;
@NotBlank(message = "Bairro é uma informação obrigatória.")
private String bairro;
private String complemento;
@NotBlank(message = "Estado é uma informação obrigatória.")
private String estado;
@NotBlank(message = "Cidade é uma informação obrigatória.")
private String cidade;
@NotBlank(message = "É uma informação obrigatória.")
private String cnpjCpf;
@NotBlank(message = "Telefone é uma informação obrigatória.")
private String telefone;
public String categoria;
@NotBlank(message = "E-mail é uma informação obrigatória.")
@Email(message = "Não é um e-mail válido")
private String email;
@NotBlank(message = "Senha é uma informação obrigatória.")
private String senha;
@ManyToMany
@JoinTable(
name = "usuarios_roles",
joinColumns = @JoinColumn(
name = "usuario_id", referencedColumnName = "email"),
inverseJoinColumns = @JoinColumn(
name = "role_id", referencedColumnName = "nomeRole"))
private List<Role> roles;
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
public String getCategoria() {
return categoria;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public void setCategoria(String categoria) {
this.categoria = categoria;
}
public String getEstado() {
return estado;
}
public void setEstado(String estado) {
this.estado = estado;
}
public List<Produto> getProdutos() {
return produtos;
}
public void setProdutos(List<Produto> produtos) {
this.produtos = produtos;
}
@Enumerated(EnumType.STRING)
public Status status;
public Usuario() {
status = Status.ATIVO;
}
@ManyToMany
@JoinTable(name = "usuarios_produtos", joinColumns = @JoinColumn(name = "usuario_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "produto_id", referencedColumnName = "id"))
private List<Produto> produtos;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getNomeFantasia() {
return nomeFantasia;
}
public void setNomeFantasia(String nomeFantasia) {
this.nomeFantasia = nomeFantasia;
}
public String getRua() {
return rua;
}
public void setRua(String rua) {
this.rua = rua;
}
public String getBairro() {
return bairro;
}
public void setBairro(String bairro) {
this.bairro = bairro;
}
public String getComplemento() {
return complemento;
}
public void setComplemento(String complemento) {
this.complemento = complemento;
}
public String getCidade() {
return cidade;
}
public void setCidade(String cidade) {
this.cidade = cidade;
}
public String getCnpjCpf() {
return cnpjCpf;
}
public void setCnpjCpf(String cnpjCpf) {
this.cnpjCpf = cnpjCpf;
}
public String getTelefone() {
return telefone;
}
public void setTelefone(String telefone) {
this.telefone = telefone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getPassword() {
// TODO Auto-generated method stub
return this.senha;
}
@Override
public String getUsername() {
// TODO Auto-generated method stub
return this.email;
}
@Override
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
}
WebSecurity:
package com.bigboss.comprafacil.security;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@Configuration
@EnableWebSecurity
public class SecurityWebConfig extends WebSecurityConfigurerAdapter {
@Autowired
private ImplementsUserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/resources/**").permitAll()
.antMatchers(HttpMethod.GET, "/cadastrarFornecedor").hasRole("ADMIN")
.antMatchers(HttpMethod.POST, "/cadastrarFornecedor").hasRole("ADMIN")
.antMatchers(HttpMethod.POST, "/lista").hasRole("ADMIN")
.and()
.formLogin()
.loginPage("/login").permitAll()
.and()
.rememberMe()
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
auth.userDetailsService(userDetailsService)
.passwordEncoder(new BCryptPasswordEncoder());
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/resources/**").antMatchers("/h2/**");
}
}
ImplementsUserDetails
@Repository
@Transactional
public class ImplementsUserDetailsService implements UserDetailsService{
@Autowired
private UsuarioRepository ur;
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
Usuario usuario = ur.findByEmail(email);
if(usuario == null){
throw new UsernameNotFoundException("Usuario não encontrado!");
}
return new User(usuario.getUsername(), usuario.getPassword(), true, true, true, true, usuario.getAuthorities());
}
}