在具有多种角色限制的方法之前

问题描述:

我很想知道是否有可能阻止没有角色所有者或管理员的用户访问laravel应用程序中的某些控制器?在具有多种角色限制的方法之前

+0

当然有可能,但我们不会为你做所有的工作。首先尝试一下(我确定在互联网上有关于此的教程),如果您遇到特定问题,请再次询问。 – lukasgeiter 2014-11-01 21:06:43

+0

好吧,我见过像属于lukasgeiter的例子,但如果它是多种类型的用户。 – user3732216 2014-11-01 23:01:25

+0

我不确定我是否理解你,但我只是想向你提出一些想法;) 一种方法是为每个角色分配一个数字,而较高者包含较低分数的许可。所以你可以检查“权限级别”是否足够高。 如果这不够灵活,它会变得更加复杂... 无论你做什么,你至少需要一个用户表引用的角色表。可能通过数据透视表。如果你想得到更详细的答案,可能试图提出更具体的问题 – lukasgeiter 2014-11-01 23:11:52

是的,你可以。您可以使用路由过滤器来完成此操作。

routes.php文件

Route::group(['prefix' => 'admin', 'before' => 'auth.admin'), function() 
    { 

    // Your routes  

    } 
]); 

和filters.php

Route::filter('auth.admin', function() 
{ 
    // logic to set $isAdmin to true or false  

    if(!$isAdmin) 
    { 
    return Redirect::to('login')->with('flash_message', 'Please Login with your admin credentials'); 
    } 
}); 
+0

但是,如果我有不止一种类型的用户(例如管理员或所有者)可以访问,那么该怎么办。 – user3732216 2014-11-01 22:29:09

+0

@ user3732216 - 然后,您只需添加一个新的过滤器与您的特定规则集。 或者,您可以使用名为https://cartalyst.com/manual/sentry或其付费哨兵包的软件包。不过,我个人对他们的文档(或缺乏)感到不满意,这意味着你必须做一些黑客工作才能做一些不寻常的事情。 – Gravy 2014-11-02 09:24:13

路由过滤器已经被提出,但因为你的过滤器应该是控制器具体你可能想尝试controller filters

首先,让我们来添加此控制器(S)

public function __construct() 
{ 
    $this->beforeFilter(function() 
    { 
     // check permissions 
    }); 
} 

执行一个控制器动作之前,此函数被调用。

在那里它取决于你想要做什么。我刚才猜测,因为我不知道您的具体架构,但我想你想要做这样的事情:

$user = Auth::user(); 
$role = $user->role->identifier; 

if($role !== 'admin' && $role !== 'other-role-that-has-access'){ 
    App::abort(401); // Throw an unauthorized error 
} 

而不是抛出一个错误,你可以也使重定向,渲染视图或根本无论你想要什么。只要做一些事情就会停止进一步的执行,所以你的控制器动作不会被调用

编辑

而不是使用闭合功能,你可以使用预定义的过滤器(从routes.php文件或filters.php)

$this->beforeFilter('filter-name', array('only' => array('fooAction', 'barAction'))); 

欲了解更多信息,请查看documentation

+0

这是伟大的,但我有很多这些。那么有没有一种方法可以在路线文件中执行此操作,或者适用于过滤器文件。 – user3732216 2014-11-02 00:20:42

+0

我个人不使用控制器过滤器。我更喜欢把这个逻辑放在路由文件中。 (分离关注点并保持代码清洁)只需将控制器嵌入带Route过滤器的'Route :: group'中即可。 – Gravy 2014-11-02 09:29:20

+0

@Gravy这是真的。在我看来,它有点味道和要求。例如。将每个控制器路由封装在一个组中,因为它具有不同的角色不会吸引我。 (对我来说一个组应该是多条路线)。 我知道你可以指定没有组的过滤器,但在某些情况下不像使用控制器过滤器那样详细(对于特定操作) – lukasgeiter 2014-11-02 11:57:20