Laravel 5.4:按部分定制的用户权限

时间:2018-01-18 16:12:25

标签: php authentication laravel-5 login permissions

我正在创建一个管理面板,您应该能够为每个用户分配访问和管理每个部分的权限。

用户表中,我有以下内容:

id
name
password
news
reports
events
documents
communities
videos
tags
active
created_at
updated_at

字段:新闻,报告,事件,文档,社区,视频标记,是tinyint(1)字段,其值为" 0"或" 1"。如果该值等于" 1",则用户具有权限;如果它等于" 0",则用户没有权限。这些字段对应于面板的每个部分。

我已成功完成基本访问和授权连接,但现在我不知道如何根据用户拥有或不受限制来检查每个部分的访问权限。我见过一些权限包和用户角色,但是他们没有做我需要的。一些帮助?

LoginController 中我有:

class LoginController extends Controller
{
    protected $redirectTo = 'panel.index';

    public function username()
    {
        return 'name';
    }

    public function acceso(Request $request)
    {
        $data['name'] = $request->name;
        $password = $request->password;

        if (Auth::attempt(['name' => $data['name'], 'password' => $password, 'active' => 1])) {
            // Authentication passed...
            return view('panel.login.index', compact('data'));
        }
        else {
            return back()->with('message' , 'Ups! El nombre o la clave no son correctos.');
        }
    }

    public function index()
    {
        Auth::logout();
        return view('panel.index');
    }

}

在每个控制器中,我放置了 __ construct()

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

路线中,我有:

// Login
    Route::resource('login', 'LoginController');
    Route::get('/panel', 'LoginController@index');
    Route::post('login/index', ['as' => 'login.acceso', 'uses' => 'LoginController@acceso']);
    Route::post('login', ['as' => 'login', 'uses' => 'LoginController@index']);

这是在视图中登录:

{!! Form::open(['method' => 'POST', 'route' => 'login.acceso', 'class' => 'form', 'id' => 'acceso_form']) !!}
    Bienvenido al Panel de Gestión.</br>
    Por favor, introduce el nombre de usuario y la clave:<br><br>

    {!! Form::text('name', '', ['class' => 'form-control', 'placeholder' => 'usuario']) !!}
    {!! Form::password('password', ['class' => 'form-control', 'placeholder' => 'clave']) !!}
    {!! Form::submit('ACCEDER', ['class' =>'btn btn-primary']) !!}

{{ csrf_field() }}
{!! Form::close() !!}
@if(session()->has('message'))
    <div class="dialogo_requerido" style="width: 80%; margin: 2em 10% 0 10%">{{ session()->get('message') }}</div>
@endif

1 个答案:

答案 0 :(得分:1)

要处理基于权限的访问,可以使用Laravel的中间件功能来处理这个问题。首先,让我们创建一个中间件CanAccessReportsapp\Http\Middleware\CanAccessReports.php):

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class CanAccessReports {
    public function handle($request, Closure $next, $guard = null) {

        $user = Auth::user(); // or Sentinel::getUser(), etc

        // Check if the User has access to `reports`, redirect otherwise
        if($user->reports == 0){ // or if($user->hasAccess(["reports"]){ ... }
            return back(); // or redirect("/");
        }

        return $next($request);
    }
}

接下来,通过将其添加到内核,将其指定为路径可用:(app\Http\Kernel.php

protected $routeMiddleware = [
    ...
    "canAccessReports" => \App\Http\Middleware\CanAccessReports::class
];

注意,您也可以将其分配给现有的中间件组,或创建自己的中间件组。取决于您想如何使用它。如果您需要更多信息,请阅读https://laravel.com/docs/5.5/middleware

最后,要在您的应用中使用它,请将其分配给路线/路线组:(routes\web.php):

...
// Assign to a single Route
Route::get("/reports/exampleReport", "ReportsController@example")->middleware("canAccessReports");

// Or assign to a Route Group
Route::group(["prefix" => "reports", "middleware" => "canAccessReports"], function(){
    Route::get("/exampleReport", "ReportsController@example");
});

使用其中任何一种方法,如果经过身份验证的用户尝试访问http://yourApp/reports/exampleReport,并且他们没有reports的权限,则会重定向回来。您可以使用session()->flash("Access Denied");传回消息或其他方法。

我已经介绍了它如何与您当前的设置一起使用(users列中的每个权限,以及中间件中的Sentinel函数也是如此。希望有所帮助!