我正在开发Laravel ACL系统。我的基本表是mongodb://mongodb:27017/my-app
,数据透视表是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
答案 0 :(得分:0)
最好的方法是,您需要引入新的服务提供商,并且可以检查授权和权限。
我为去年的数据库驱动许可做了一个测试项目,并使用了服务提供商。
那是实现的完美方法。
答案 1 :(得分:0)
基本上,!$request->user()->hasPermission($permission)
表示如果与请求关联的用户没有此权限,则中间件将通过,但这不是您想要的。这是您应该做的:
如果您需要用户拥有一个规定的权限,则需要执行以下操作:
class HasPermission
{
public function handle($request, Closure $next,$permissions)
{
$permissions_array = explode('|', $permissions);
foreach($permissions_array as $permission){
if ($request->user()->hasPermission($permission)){
return $next($request);
}
}
return redirect()->back();
}
}
如果您希望用户拥有所有所述的权限,则需要执行以下操作:
class HasPermission
{
public function handle($request, Closure $next,$permissions)
{
$permissions_array = explode('|', $permissions);
foreach($permissions_array as $permission){
if (!$request->user()->hasPermission($permission)){
return redirect()->back();
}
}
return $next($request);
}
}
作为补充说明,如果您想以更优雅的方式执行此操作,则可以这样做:
class HasPermission
{
public function handle($request, Closure $next, ...$permissions_array)
{
//Function body from above without the explode part
}
}
还有
function __construct()
{
$this->middleware('auth');
$this->middleware('HasPermission:Role_Read,Role_Update,Role_Delete');
}
如果使用逗号,则框架会将字符串拆分为参数。
答案 2 :(得分:0)
就我而言,我只是添加了简单的功能来从数据库获取权限,然后检查它为中间件。检查此代码:
//添加新功能以从数据库获取权限
public static function user_permissions($user) {
$permissions=DB::table('permissions')->where('user_id', $user)->first();
return $permissions;
}
//在中间件中检查您的权限
if(Auth::guest())
{
return redirect('/');
}
elseif(Functions::user_permissions(Auth::user()->id)->user_managment != 1) {
return redirect('/');
} else {
return $next($request);
}