Php Laravel 5.4:按节自定义的用户权限
我正在创建一个管理面板,您可以在其中为每个用户分配访问和管理每个部分的权限 在用户表中,我有以下内容:Php Laravel 5.4:按节自定义的用户权限,php,authentication,laravel-5,login,permissions,Php,Authentication,Laravel 5,Login,Permissions,我正在创建一个管理面板,您可以在其中为每个用户分配访问和管理每个部分的权限 在用户表中,我有以下内容: id name password news reports events documents communities videos tags active created_at updated_at 字段:新闻、报告、事件、文档、社区、视频和标记,是值为“0”或“1”的tinyint(1)字段。如果该值等于“1”,则用户有权限;如果等于“0”,则用户没有权限。这些字段对应于面板的每个部分 我
id
name
password
news
reports
events
documents
communities
videos
tags
active
created_at
updated_at
字段:新闻、报告、事件、文档、社区、视频和标记,是值为“0”或“1”的tinyint(1)字段。如果该值等于“1”,则用户有权限;如果等于“0”,则用户没有权限。这些字段对应于面板的每个部分
我已经成功地建立了基本的访问和授权连接,但是现在我不知道如何根据用户有没有限制来检查每个部分的访问权限。我已经看到了一些权限包和用户角色,但它们并不满足我的需要。要帮忙吗
在登录控制器中,我有:
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');
}
}
// 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']);
在每个控制器中,我都放置了\uu构造():
public function __construct()
{
$this->middleware('auth');
}
在路线中我有:
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');
}
}
// 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
{!!Form::open(['method'=>'POST','route'=>'login.acceso','class'=>'Form','id'=>'acceso\u Form'])
Bienvenido al-Panel de Gestión
请帮我介绍一下常用名称和名称:
{!!Form::text('name','',['class'=>'表单控件','placeholder'=>'usuario'])
{!!Form::password('password',['class'=>'表单控件','placeholder'=>'clave'])
{!!Form::submit('加入者',['class'=>'btn-btn-primary'])
{{csrf_field()}}
{!!Form::close()!!}
@如果(session()->has('message'))
{{session()->get('message')}
@恩迪夫
要处理基于权限的访问,可以使用Laravel的中间件功能来处理此问题。首先,让我们创建一个中间件CanAccessReports
(app\Http\middleware\CanAccessReports.php
):
接下来,通过将其添加到内核,将其分配为可用于路由:(app\Http\Kernel.php
)
注意,您还可以将其分配给现有的中间件组,或者创建自己的中间件组。取决于你想如何使用它。如果您需要更多信息,请阅读
最后,要在应用程序中使用此选项,请将其分配给路由/路由组:(routes\web.php
):
如果经过身份验证的用户尝试访问http://yourApp/reports/exampleReport
,并且他们没有报告的权限,他们将被重定向回。您可以使用session()->flash(“拒绝访问”)
返回消息,或使用其他方法
我已经介绍了如何使用当前设置(每个权限的users
列,中间件中的Sentinel
功能也是一个例子。希望有帮助!通常在这种情况下,您要做的是在需要特定访问的路由周围分配一个中间件,检查通过中间件登录的用户,看看他们是否拥有正确的权限n、 如果他们不这样做,你就把它们重定向到某个地方。另外,出于好奇,身份验证包不能完成什么?谢谢Tim,我不太知道怎么做你说的,我对此有点迷茫,我要看看我是否能把它取出来。无论如何,如果你有时间给我看一个样本,我将非常感激。关于包,我看到的信息是指用户角色(管理员、编辑等)但我还没有看到权限可以由每个用户的特定部分授予;这就是我撤销它们的原因。这很公平,也可以理解。如果可以,请看一下Sentinel
,特别是它如何处理权限:。它既有角色也有用户权限,因此存在一些继承。我可以发布一个示例,说明iddleware很管用;请给我一点时间。谢谢!我要看一下。用户的这一点对我来说有点困难……哇!非常感谢你,Tim。我要将它集成到我的应用程序中,我会告诉你;)亲爱的Tim,我有一个错误:Container.php第721行中的ReflectionException:Class canAccessReports不存在。我将编辑我的问题以详细说明我所做的工作…确认文件名在需要的位置正确,canAccessReports
,小写“C”应仅在Kernel.php
中;在其他地方应为CanAccessReports
,大写。然后,如果仍然保持,请运行composer dump autoload
以重新加载可用类。缺少“s”在routes中!它工作完美,我将完成整合。谢谢Tim!是的,我已经编辑了问题并删除了该部分,以便在下一个问题中保持干净;)祝你有一个愉快的一天!
...
// 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");
});