PreAuthorize - Resolvido

    @ApiOperation("Pesquisar " + ENTIDADE + " por id")
    @GetMapping("{id}")
    @PreAuthorize("@usuarioPermissaoAcesso.podePesquisar()")
    public ResponseEntity<?> buscarPorId(@PathVariable final String id, @ApiIgnore final Principal principal) {
        try {
            return ResponseEntity.status(OK).body(service.buscaPorIdExterno(id));
        } catch (final GeralException e) {
            return erroExceptionComRegra(e, ENTIDADE);
        } catch (final Exception e) {
            return mensagemRetorno(e, ERROR, ENTIDADE, getMensagemErroBuscarPorId(ENTIDADE));
        }
    }

Como chamar o método que está no @PreAuthorize, antes de entrar no controler ?

package br.com.ghnetsoft.gestorsistemas.usuario.service.permissao;

import static br.com.ghnetsoft.gestorsistemas.model.enuns.UsuarioPerfilEnum.ADMINISTRADOR;
import static br.com.ghnetsoft.gestorsistemas.model.enuns.UsuarioPerfilEnum.OPERADOR;

import java.io.Serializable;
import java.security.Principal;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.ghnetsoft.gestorsistemas.model.Usuario;
import br.com.ghnetsoft.gestorsistemas.repository.UsuarioRepository;

@Service("usuarioPermissaoAcesso")
public class UsuarioPermissaoAcesso implements Serializable {

    private static final long serialVersionUID = 7816159556263191916L;
    @Autowired
    private transient UsuarioRepository repository;

    public boolean podeIncluir(final Principal principal) {
        final Optional<Usuario> usuarioExiste = repository.findById(principal.getName());
        if (usuarioExiste.isPresent() && (ADMINISTRADOR == usuarioExiste.get().getGrupoAcesso() || OPERADOR == usuarioExiste.get().getGrupoAcesso())) {
            return true;
        }
        return false;
    }

    public boolean podeAlterar(final Principal principal) {
        final Optional<Usuario> usuarioExiste = repository.findById(principal.getName());
        if (usuarioExiste.isPresent() && (ADMINISTRADOR == usuarioExiste.get().getGrupoAcesso() || OPERADOR == usuarioExiste.get().getGrupoAcesso())) {
            return true;
        }
        return false;
    }

    public boolean podePesquisar() {
        return true;
    }

    public boolean podeAtivar() {
        return true;
    }

    public boolean podeDesativar() {
        return true;
    }
}

Precisa habilitar o pré-post authorizer do spring security, teoricamente fazendo isso deveria conseguir interceptar normalmente.

1 curtida
package br.com.ghnetsoft.gestorsistemas.usuario.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration;

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class SecurityConfig extends GlobalMethodSecurityConfiguration {
}

E funcionou.

Grato @Jonathan_Medeiros

2 curtidas