Solucionado (ver solução)
Solucionado
(ver solução)
13
respostas

Niveis de Acesso Laravel 5.0

Boa tarde, queria saber como verificar niveis de acesso no laravel 5.0

Por padrão eu utilizo no layout principal dessa forma apenas verificando se se tá logado ou não.

<div>
      <ul class="nav navbar-nav navbar-right">
        @if (Auth::guest())
          <li><a href="/login">Login</a></li>
        @elseif(Auth::attempt())
          <li><a href="/produtos">Produtos</a></li>
          <li><a href="/categorias">Categorias</a></li>
          <li>
            <a href="#" class="disabled">
              Seja bem vindo, {{Auth::user()->name}}
            </a>
          </li>
          <li><a href="/logout">Sair</a></li>       
        @endif
      </ul>
      </div>
      </div>
      </nav>
13 respostas

Nenhum moderador pode me ajudar?

Oi Yuri

Isso depende bastante de como você implementou ou o que você está usando pra definir esses níveis de acesso dos usuários.

Pra versão 5 do Laravel, existem algumas soluções de multi auth que te permitem fazer algo como:

Auth::('sua-custom-auth')()->check()

Assim você pode definir diferentes tipos de autenticação de acordo com o nível de acesso.

https://github.com/ollieread/multiauth/tree/laravel5

Para a versão mais nova (5.2+), você pode usar o guard que foi adicionado no façade Auth:

Auth::guard('custom')

Você pode ver alguns exemplos de uso aqui https://laravel.com/docs/5.2/authentication

Então eu tinha feito isso, mais problema queria verificar se ele tem permissão de acessar a página ou não, dessa maneira que eu fiz ele gera o menu da maneira que queria mais se a pessoa digitar na barra de endereço ele acessa e eu fiz um campo a mais no user que é acesso.

<div>
      <ul class="nav navbar-nav navbar-right">
        @if (Auth::guest())
          <li><a href="/login">Login</a></li>
        @elseif(Auth::user()->acesso == 1)
          <li><a href="/produtos">Produtos</a></li>
          <li><a href="/categorias">Categorias</a></li>
          <li>
            <a href="#" class="disabled">
              Seja bem vindo, {{Auth::user()->name}}
            </a>
          </li>
          <li><a href="/logout">Sair</a></li>       
       @elseif(Auth::user()->acesso == 2)
          <li><a href="/produtos">Produtos</a></li>
          <li>
            <a href="#" class="disabled">
              Seja bem vindo, {{Auth::user()->name}}
            </a>
          </li>
          <li><a href="/logout">Sair</a></li>
        @endif
      </ul>
      </div>

Perfeito, a ideia é exatamente essa!

Se você não vai usar ferramentas para criar auths customizados e usa uma versão que ainda não dá suporte ao guard, pode controlar o acesso via interface publica da sua classe usuário

-- usando o Auth::user()

Hummm, mais existe alguma possibilidade de colocar dentro do controller naquele construtor caso o usuário dele não seja aquele, manda ele para uma página você não tem acesso?

public function __construct(){
        $this->middleware('autorizador');
    }

Tentei fazer isso, mais não deu certo.

public function __construct(){
        if(Auth::user()->acesso == 1){
            $this->middleware('autorizador');
        }else{
            return "Você não tem acesso";
        }
    }

Rodrigo, numa das suas videos aulas você disse que poderia verificar nível do usuário no middleware autorizador

if(!$request->is('login') && \Auth::guest()){
            return redirect('/login');
        }
        return $next($request);

Criar um middleware para cada tipo de usuário?

Uma outra tentativa.....

public function __construct(){
            $this->middleware('autorizador',['only'=>['verifica']]);
    }
    public function verifica(){
        if(Auth::user()->acesso <> 1){
            return redirect()->action('CategoriaController@erro');
        }else{
            return redirect('/categorias');
        }
    }
    public function erro(){
        return view('/acessonegado');
    }
solução!

Oi Yuri

Você está no caminho certo, com o uso de middlewares.

Você pode criar um para cada tipo de acesso e registrar no construtor dos seus controllers.

Por exemplo, se para usar o CategoriaController o usuário precisa ser nível 1, você pode fazer:

class CategoriaController extends Controller {

    public function __construct()
    {
        $this->middleware('nivel-1-middleware');
    }

    // restante do código omitido
}

registrar esse middleware que será criada no Kernel como fizemos aqui:

https://cursos.alura.com.br/course/laravel-2/section/4/explanation

e na implementação desse Middleware redirecionar para uma tela de erro caso o nível de acesso do usuário seja diferente de 1 (ou qualquer outro):

class Nivel1Middleware {

    public function handle($request, Closure $next)
    {
        if (\Auth::user()->acesso <> 1)
        {
            return redirect('/url-de-nao-tem-acesso');
        }
        return $next($request); // ok, pode acessar
    }
}

Já tentou dessa forma? Se sim, o que aconteceu?

Mais ainda sim ficou uma dúvida se eu for substituir nos Controller que quero ter acesso como fica a questão do Login? Porque no Autorizador ele está verificando se está logado certo? se eu tira e colocar niveis de acesso com esse middleware que você sugeriu não vou ter como verificar se está logado ou não.

Fiz assim e deu certo.

public function __construct(){
        $this->middleware('autorizador');
        $this->middleware('nivelacesso1');
    }

Perfeito, Yuri! Que legal que chegou na solução.

Uma outra alternativa pra isso seria registrar o autorizador no kernel como um middleware global, pra todos os controllers, assim você não precisa adicionar a chamada em cada um deles.

<?php namespace estoque\Http;

class Kernel extends HttpKernel {  

    protected $middleware = [
        // outros registros omitidos
        'estoque\Http\Middleware\AutorizacaoMiddleware',
    ];

    // restante do código da classe

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software