gpt4 book ai didi

php - Laravel 5.1 ACL 路由资源不工作

转载 作者:可可西里 更新时间:2023-10-31 23:29:05 25 4
gpt4 key购买 nike

关注一个 tutorial 后关于 laravel 的内置 acl 是如何工作的,我尝试了它,它通过自己定义每条路线而运行良好。

现在我正在尝试使用资源,但它没有按预期工作。我将以下代码添加到我的路由文件中:

Route::group(['middleware' => 'acl:create_client'], function()
{
Route::resource('clients', 'ClientController');
});

现在我明白问题是什么了:

如果此用户具有 acl:create_client,则 Clientcontroller 中的所有方法都将根据我的数据库进行检查,从而导致具有此 acl 的登录用户可以使用所有方法。

如何拆分每个方法以使用它自己的 acl 而不必像这样编写它:
Route::get('/client/create', [
'middleware' => 'acl:create_client',
'as' => 'clients.create',
'uses' => 'ClientController@create'
]);

结果是这样的:

创建需求 create_client

index 需要 index_client

更新需要更新客户端

等等等等

最佳答案

底线是:您需要以某种方式在访问控制列表 (ACL) 中设置“列表”。 IMO,最灵活的方法是根据 session 用户从数据库中提取此列表;你有一个好的开始。您可以使用已分配的 'as' 跳过显式路由分配。您在路由中定义的。示例路线:
Route::get('/', ['as'=>'clients.create', 'uses'=>'ClientsController@create']);
在这里,您将使用 'clients.create'在您的 ACL 检查中。请记住:ACL 仍然需要 'as'为所有路线设置的值(无论如何都很好)。

一步一步

现在您已获得所需的背景信息,下面介绍如何使其工作。这些步骤假设您能够正确设置教程代码和数据库。这将坚持原始教程设置,并将重点放在使 ACL 独立于路由配置。

1) 在 App\Http\Middleware\Acl\CheckPermission ,您将需要替换参数 $permission = null'as'您在 routes.php 中设置的字符串.新代码:

<?php namespace App\Http\Middleware;

use Closure;

class CheckPermission
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next/*, $permission = null REMOVE THIS*/)
{
// Add the next two lines:
$action = $request->route()->getAction();
$permission = isset($action['as']) ? $action['as'] : '';

if (!app('Illuminate\Contracts\Auth\Guard')->guest()) {
if ($request->user()->can($permission)) {
return $next($request);
}
}

return $request->ajax ? response('Unauthorized.', 401) : redirect('/login');
}
}

2) 现在,您需要以不同的方式分配这个中间件。您不想使用特定权限,而是使用 'as'我们刚刚在中间件中设置的字符串。您可以通过两种不同的方式分配中间件:a) 将其分配给一组路由,或 b) 将其分配给每个页面。我建议使用 2a 而不是 2b,因为您可能不想在所有路由上使用 ACL。

2a)这是将其仅分配给一组路由的方法。这里要注意的两个重要事项是 'as'=>'clients.*'字符串和中间件到路由组的分配 'middleware' => 'acl' .另请注意,此路由组不会像教程那样传递额外的字符串参数(例如 'middleware' => 'acl:manage_user' )。这是因为我们从 handle() 中删除了该参数。以上功能。您将需要更改这些示例路由以匹配您的目标 URI 和 Controller 功能。
Route::group(['middleware' => 'acl'], function()
{
Route::get('/clients', ['as'=>'clients.view', 'uses'=>'ClientsController@index']);
Route::get('/clients/new', ['as'=>'clients.create', 'uses'=>'ClientsController@create']);
// Add more routes ...
}

2b) 这是将它分配给每个页面的方法。本教程使用文件 /app/Http/Kernel.php将中间件设置为 $routeMiddleware .这是执行上述步骤 2a 的正确方法,但如果您希望在每一页上都这样做,则不是。使中间件成为全局中间件:添加 '\App\Http\Middleware\CheckPermission'$middleware在同一个文件中找到的变量。您将不需要 $routeMiddleware如果您使用全局变量,则从教程中添加。

3)在教程数据库中,需要使用 'as' permissions 中的字符串内表 permission_slug柱子。以下是允许 ID 为 123 的用户的示例 SQL 插入访问路线 clients.create .这两个创建了我们创建访问 'client.create'所需的权限和角色。路线。
INSERT INTO permissions ('permission_title', 'permission_slug', 'permission_description')
VALUES ('Create a Client', 'clients.create', 'Allow the user to create a client');

INSERT INTO roles ('role_title', 'role_slug')
VALUES ('Client Admin', 'clients.admin');

对于下一个查询,您需要知道 id上面两行。这假设您的数据库是新创建的,尚未添加任何行,因此每个插入都是 id=1 .这说:许可 id=1分配给角色 id=1 .
INSERT INTO permission_role ('permission_id', 'role_id') VALUES (1, 1);

下一个查询也假定新角色是 id=1并且用户 ID 是 123 .这将使用 id=1 分配新角色给现有用户 id=123 .
INSERT INTO role_user ('role_id', 'user_id') VALUES (1, 123);

此时,您应该有一个用户 id=123Client Admin角色。 Client Admin角色应该有 'clients.create'允许。当您以用户 id=123 登录时,您将被验证拥有 'clients.create'权限,您应该能够访问该页面(在我的示例中为 example.com/clients/new)。任何其他用户将无权访问,他们将被重定向到登录页面(如果您已经登录,这对我来说没有意义;这正是教程设置的内容)。

关于php - Laravel 5.1 ACL 路由资源不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34802283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com