Permissões spring secucurity

1 resposta
javaspringmvc
D

Fala pessoal!
Estou com o problemas com relação as permissões do usuário usando o Spring Security.
Cadastrei o usuário atribui a ele a permissão que lhe é devida, porém ao acessar o sistema a opção no menu que o usuário teria acesso não aparece.

Segue como está configurado o Spring Security no meu sistema:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{
	
	@Autowired
	IUsuarioDAO usuarioDAO;	
	
	@Override
	protected void configure(AuthenticationManagerBuilder auth)	throws Exception {
		auth.userDetailsService(usuarioDAO)
			.passwordEncoder(new BCryptPasswordEncoder());
	}	
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests()
		.antMatchers("/vendas/cadastro-vendas").hasAnyRole("VENDAS_MERCADO")
		.anyRequest().authenticated()
		.and().formLogin().loginPage("/index").permitAll()
		.failureUrl("/index?error=true").defaultSuccessUrl("/home", true).permitAll()
		.and().rememberMe().userDetailsService(usuarioDAO)
		.and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
	}	
}

Minha Entidade do Usuário:

package br.com.mercadinhojt.mercado.models;

import java.util.ArrayList;
import java.util.Collection;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

public class UsuarioDetails implements UserDetails{

private static final long serialVersionUID = 1L;
	
	private String nome;
	private String login;
	private String senha;
	private boolean ativo;
	private Collection<GrantedAuthority> permissoes = new ArrayList<>();
	
	public UsuarioDetails(String nome, String login, String senha, boolean ativo) {
		this.nome = nome;
		this.login = login;
		this.senha = senha;
		this.ativo = ativo;
	}
	
	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

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

	@Override
	public String getPassword() {
		// TODO Auto-generated method stub
		return this.senha;
	}

	@Override
	public String getUsername() {
		// TODO Auto-generated method stub
		return this.login;
	}

	@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 this.ativo;
	}

}

Minha Classe DAO

public class UsuarioDAOImpl implements IUsuarioDAO, UserDetailsService{
	
	private static final Logger logger = Logger.getLogger(UsuarioDetails.class.getSimpleName());

	
	private JdbcTemplate jdbcTemplate;	
	private Connection connection;
	private CallableStatement cs;
	private ResultSet rs;
	
	@Autowired
	public UsuarioDAOImpl(DataSource dataSource) {
		jdbcTemplate = new JdbcTemplate(dataSource);
	}	
	

	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		UsuarioDetails userDetails = null;
		try {			
			connection = jdbcTemplate.getDataSource().getConnection();
			
			userDetails = buscarUsuario(connection, username);
			
			Collection<GrantedAuthority> permissoesPorUsuario = buscarPermissoes(connection,username);
						
			userDetails.getAuthorities().addAll(permissoesPorUsuario);			
			
			return userDetails;
			
		} catch (UsernameNotFoundException e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}finally{
			try {
				connection.close();
				cs.close();
				rs.close();		
			} catch (SQLException e) {
				e.printStackTrace();
			}				
		}		
		return userDetails;
	}
	
	public UsuarioDetails buscarUsuario(Connection connection, String login) throws SQLException {
		cs = this.connection.prepareCall("{call MEJT_SP_SEL_USUARIOS(?,?)}");
		cs.setString("MODO", "BUSCAR_USUARIO");
		cs.setString("LOGIN_USER", login);

		 rs = cs.executeQuery();
		 
		 String nome = null;
		 String senha = null;
		 boolean ativo = false;
		 
		 while(rs.next()){				
			 nome = rs.getString("NOME");
			 senha  = rs.getString("SENHA");
			 ativo = rs.getBoolean("ATIVO");				
		}

		rs.close();
		cs.close();

		return new UsuarioDetails(nome, login, senha, ativo);
	}
	
	public Collection<GrantedAuthority> buscarPermissoes(Connection connection, String login) throws SQLException {
		List<GrantedAuthority> permissoes = new ArrayList<>();

		cs = this.connection.prepareCall("{call MEJT_SP_SEL_USUARIOS(?,?)}");
		cs.setString("MODO", "ACESSAR_APLICACAO");
		cs.setString("LOGIN_USER", login);

		 rs = cs.executeQuery();		

		while (rs.next()) {
			permissoes.add(new SimpleGrantedAuthority(rs.getString("NMFORMULARIO")));
		}

		rs.close();
		cs.close();

		return permissoes;
	}
}

No caso NMFORMULARIO seria o nome da minha ROLE.
Quando o usuário faz o Login no sistema eu pego os dados do Usuário e depois pego todas as permissões que esse usuário tem acesso.

Debugando o sistema o método buscarPermissoes() está pegando corretamente a permissão que o usuário possui.

No meu Header da JSP estou deixando dessa forma o menu (Especificamente o acesso que essa role permite):

image

Para montar essa regra usei como base uma aula da AlgaWorks, porém utilizavam spring bot.
Porem da forma que montei é muito parecido com o que eles estavam ensinando, porem não está funcionando. Quando acesso a minha aplicação esse item do menu não fica disponível para o usuário.
Essa aplicação que estou criando é o meu projeto de TCC e essa questão de atribuições de cada usuário seria um dos fundamentos da minha aplicação e não estou conseguindo fazer funcionar essa regra de acesso. E também não queria que todos os usuários cadastrados no sistema tivessem acesso a tudo da aplicação.

Gostaria de saber se tem algo de errado no na hora de reconhecer a permissão que o usuário possui.

Se puderem contribuir agradeceria muito, só está faltando isso para concluir meu projeto.

1 Resposta

D

up

Criado 7 de novembro de 2018
Ultima resposta 7 de nov. de 2018
Respostas 1
Participantes 1