Cannot pass a null Grantedauthority Collection Spring Security

Asked

Viewed 1,052 times

4

I am developing a web application with Spring Boot, and I am trying to implement authentication using Spring Security. I am following the tutorial from Michelli, but I’m making the following mistake:

Caused by: java.lang.Illegalargumentexception: Cannot pass a null Grantedauthority Collection

But I already registered the user and assigned the Role to him, using the Mysql. My model Role:

package com.bigboss.comprafacil.models;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import org.springframework.security.core.GrantedAuthority;

@Entity
public class Role implements GrantedAuthority{

@Id
private String nomeRole;

@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 Usuario:

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());
}

}

Mysql Workbench: inserir a descrição da imagem aqui inserir a descrição da imagem aqui inserir a descrição da imagem aqui Someone can help me?

  • 1

    In your class Usuario, the method getAuthorities(), that must return a collection, is returning null. It is a possible focus of this error, since this collection is one of the parameters used to search the user.

  • That’s all it was, my ass.

2 answers

3


The problem is here, when returning null.

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    // TODO Auto-generated method stub
    return null;
}

1

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

You have to return a collection of authorities.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.