具有模型对象的Laravel访问控制

时间:2015-07-06 12:47:14

标签: php laravel laravel-4

我需要根据登录的用户限制对应用程序某些部分的访问。我的意思是让用户只在博客应用程序上编辑自己的帖子。

是否有比控制器的每个功能更好的方法,如果用户不是所需帖子的所有者,重定向到某个错误页面?

例如,如果我的路由是/post/{post_id}/edit/post/{post_id}/preview/post/{post_id}/delete,我可以在PostController中以某种方式声明一般函数,如:

if(Post::find($post_id)->user_id != Auth::user()->id){
    return View::make('access-error');
}

谢谢!

3 个答案:

答案 0 :(得分:1)

我认为这个会非常有用, https://github.com/Zizaco/entrust/tree/1.0

您可以创建角色

$owner = new Role;
$owner->name = 'Owner';
$owner->save();

$admin = new Role;
$admin->name = 'Admin';
$admin->save();

现在我们只需要为这些角色添加权限。

$managePosts = new Permission;
$managePosts->name = 'manage_posts';
$managePosts->display_name = 'Manage Posts';
$managePosts->save();

$manageUsers = new Permission;
$manageUsers->name = 'manage_users';
$manageUsers->display_name = 'Manage Users';
$manageUsers->save();

$owner->perms()->sync(array($managePosts->id,$manageUsers->id));
$admin->perms()->sync(array($managePosts->id));

现在我们只需执行以下操作即可检查角色和权限:

$user->hasRole("Owner");    // false
$user->hasRole("Admin");    // true
$user->can("manage_posts"); // true
$user->can("manage_users"); // false

还有,

Route::filter('manage_posts', function()
{
    if (! Entrust::can('manage_posts') ) // Checks the current user
    {
        return Redirect::to('admin');
    }
});

答案 1 :(得分:1)

在您的控制器中,您可以执行以下操作:

public $check = ['edit', 'preview', 'delete'];

public function callAction($method, $parameters) {
    if(in_array($method, $this->check, true) && 
    $post_id = $parameters['post_id'] &&
    Post::find($post_id)->user_id != Auth::user()->id) {
        return View::make('access-error');
    }

    return parent::callAction($method, $parameters);
}

答案 2 :(得分:0)

您可以抛出401错误并将其捕获到其他位置以显示自定义页面

App::abort(401);

http://laravel.com/docs/4.2/errors#handling-404-errors