我正在开发一个Laravel ACL系统。我的基表是users,roles,permissions
,数据透视表是role_user,role_permission,user_permission
。
我想使用我的自定义中间件HasPermission
检查用户权限。我已经尝试过这种方式,但它不能正常工作。每个用户都可以访问所有的权限有或没有。
现在,我如何解决这个问题。请看我的代码示例。
我的控制器。
function __construct()
{
$this->middleware('auth');
$this->middleware('HasPermission:Role_Read|Role_Update|Role_Delete');
}
我的中间件。
class HasPermission
{
public function handle($request, Closure $next,$permissions)
{
$permissions_array = explode('|', $permissions);
// $user = $this->auth->user();
foreach($permissions_array as $permission){
if(!$request->user()->hasPermission($permission)){
return $next($request);
}
}
return redirect()->back();
}
}
以及我的User
模型方法。
public function user_permissions()
{
return $this->belongsToMany(Permission::class,'user_permission');
}
public function hasPermission(string $permission)
{
if($this->user_permissions()->where('name', $permission)->first())
{
return true;
}
else
{
return false;
}
}
4条答案
按热度按时间weylhg0b1#
最好的办法是你需要引入一个新的服务提供商,在那你可以检查授权和权限。
我做了一个测试项目(去年)的数据库驱动的权限,我使用的服务提供者。
这是实现的最佳方式。
kqlmhetl2#
基本上
!$request->user()->hasPermission($permission)
是说如果与请求相关的用户没有这个权限,中间件就会通过,但是这不是你想要的。下面是你应该做的:如果您需要用户拥有一个所述权限,您需要执行以下操作:
如果您希望用户拥有所有规定的权限,您需要执行以下操作:
作为补充说明,如果您想以更优雅的方式执行此操作,可以执行以下操作:
还有
如果您使用逗号,则框架会将字符串拆分为参数。
u3r8eeie3#
在我的例子中,我只是添加了一个简单的函数来从数据库中获取权限,然后检查它的中间件。检查以下代码:
//添加新函数从数据库获取权限
//在中间件中检查您的权限
nxowjjhe4#
在web.php/api.php中:
在中间件中: