我需要根据登录的用户限制对应用程序某些部分的访问。我的意思是让用户只在博客应用程序上编辑自己的帖子。
是否有比控制器的每个功能更好的方法,如果用户不是所需帖子的所有者,重定向到某个错误页面?
例如,如果我的路由是/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');
}
谢谢!
答案 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);