Laravel auth基于上下文过滤

时间:2014-08-12 21:00:11

标签: php laravel

使用laravel我们为我们设置了一些auths,我们可以在路径文件中控制或在控制器构造函数中设置但是我需要找到更好的方法来做到这一点,并且不确定路由是否可以处理它? / p>

对于我的用户,我允许自己和管理员编辑它们。所以我的控制器看起来像这样。

function edit($id)
{
    $user = User::findOrFail($id);
    if(!Auth::user()->isAdmin() && $user->id != Auth::user()->id)
    {
        return Redirect::route('users.index')->withError('Unable to access that user');
    }
    return View::make('users.edit', compact('user'));
}

这没关系,但是在我的更新代码上,我还必须进行相同的身份验证/用户检查,以确保用户或管理员只能对自己进行更改。

所以我们得到一个双倍,在一些控制器中重复3次。上下文的另一个例子是论坛帖子,发布它的人或管理员可以编辑它。

路由过滤器是否有办法处理这个问题?

1 个答案:

答案 0 :(得分:0)

这可能对您有用,也可能没有用,我的应用程序中存在类似的问题,用户只能访问自己的用户个人资料,但管理层可以访问任何人。

我的路线如下:

Route::get('user_profile/{user_id?}', array('as' => 'user_profile', 'uses' => 'UserController@get_user_profile'))->where(array('user_id' => '[0-9]+', 'tab' => '[A-Za-z]+'))->before('auth');
Route::when('user_profile/*', 'management');

如果用户尝试转到特定用户,则应用管理过滤器,如果未给出ID,则默认为自己的配置文件。

Route::filter('management', function()
{
    if(Helper::managementStatus() === NOT_MANAGEMENT)
        return Redirect::route('home')
            ->with('flash_error', 'You must be logged in as a manager to view this page!');

});

或者你可以创建一个类似的过滤器:

Route::filter('management', function()
{
    $user = User::findOrFail(Input::get('user_id'));
    if(!Auth::user()->isAdmin() && $user->id != Auth::user()->id)
    {
        return Redirect::route('users.index')->withError('Unable to access that user');
    }
}

然后将该过滤器应用于相关路线。

我希望这会有所帮助。