在具有多种角色限制的方法之前
是的,你可以。您可以使用路由过滤器来完成此操作。
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');
}
});
但是,如果我有不止一种类型的用户(例如管理员或所有者)可以访问,那么该怎么办。 – user3732216 2014-11-01 22:29:09
@ 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
这是伟大的,但我有很多这些。那么有没有一种方法可以在路线文件中执行此操作,或者适用于过滤器文件。 – user3732216 2014-11-02 00:20:42
我个人不使用控制器过滤器。我更喜欢把这个逻辑放在路由文件中。 (分离关注点并保持代码清洁)只需将控制器嵌入带Route过滤器的'Route :: group'中即可。 – Gravy 2014-11-02 09:29:20
@Gravy这是真的。在我看来,它有点味道和要求。例如。将每个控制器路由封装在一个组中,因为它具有不同的角色不会吸引我。 (对我来说一个组应该是多条路线)。 我知道你可以指定没有组的过滤器,但在某些情况下不像使用控制器过滤器那样详细(对于特定操作) – lukasgeiter 2014-11-02 11:57:20
当然有可能,但我们不会为你做所有的工作。首先尝试一下(我确定在互联网上有关于此的教程),如果您遇到特定问题,请再次询问。 – lukasgeiter 2014-11-01 21:06:43
好吧,我见过像属于lukasgeiter的例子,但如果它是多种类型的用户。 – user3732216 2014-11-01 23:01:25
我不确定我是否理解你,但我只是想向你提出一些想法;) 一种方法是为每个角色分配一个数字,而较高者包含较低分数的许可。所以你可以检查“权限级别”是否足够高。 如果这不够灵活,它会变得更加复杂... 无论你做什么,你至少需要一个用户表引用的角色表。可能通过数据透视表。如果你想得到更详细的答案,可能试图提出更具体的问题 – lukasgeiter 2014-11-01 23:11:52