laravel 4.2。用户权限和隐藏链接源

时间:2014-10-30 09:35:00

标签: laravel

我是Laravel的新手,现在学习一周。我有一些我无法找到答案的基本问题。下周我将开始开发CRM系统,我需要一些经验丰富的开发人员提供的信息,他们可以告诉我我正在参与制作一个好的方法。

  1. 我需要一些身份验证系统,例如4组用户(Admin,Basic,Manager,Office),其中Manager和Admin将添加Basic用户。视图和功能很少,每个组都可以定义对每个视图和功能的访问权限。几天以来,我一直在寻找包,观看教程和学习。我找到了一个有趣的包,我认为它可以帮助我使用这个用户组权限的东西。包是Sentry。这可以帮助我满足我的要求吗?

  2. 例如,我在基本组中有一个用户的情况是什么情况,他删除了例如带按钮的一些评论。在浏览器的左侧,用户可以在悬停链接时看到此评论的链接。例如www.test.com/comments/345/delete,其中id为345.如果用户使用另一个id输入,那意味着他可以删除另一个注释。我找到了一些关于如何解决这个问题的建议,用jQuery和javascript来实现它,这样就不会显示链接,例如用AJAX就可以创建POST。但由于我是一个新手,我在想这需要多少时间,这是一个好方法吗?可以从1.问题包装Sentry帮助我获得每个组可以访问的路由的权限吗?

  3. 任何帮助或建议都将不胜感激。

2 个答案:

答案 0 :(得分:2)

Sentry做你想做的,是的。 Here's一个问题,其中一些答案解释了权限部分。

可以通过执行 POST 请求而不是 GET 请求来避免可见链接部分。

当您打开表单时,添加方法属性。

Form::open(array('url' => 'foo/bar', 'method' => 'post'))

GET 请求会将参数放在 URL 中,因此显示 ID 。使用 POST 请求会将参数放入标题中,从而将其隐藏在 URL 中。

一个例子可能是删除评论。 GET 请求可能如下所示:

http://www.example.com/comments/delete/1

参数将在方法签名中定义:

public function getDelete ($id) {
    Comment::find($id)->delete();
}

POST 等价物的位置

http://www.example.com/comments/delete 

参数将在您的Input课程中定义,您可以使用get方法获取这些参数

public function postDelete() {
    Comment::find(Input::get('id'))->delete();
}

答案 1 :(得分:1)

1)最好的帮助你的包是Sentry。

2)为了确保用户只能删除他的评论你可以做这样的事情(但是你有更多的解决方案是用Ajax做的):

public function destroy($id) { 
     $user = Sentry::getUser();
     $comment = Comment::find($id);
     if($comment) {
         if($comment->user_id != $user->id) {
             return Response::back(); // optional message: Permission denied!
         }
         $comment->delete();
         return Response::back(); // optional with message: Deleted!
     }
     return Response::back(); // optional message: Comment not found!
}

在这种情况下,您可以使用Sentry来获取登录用户并检查用户ID。我认为您应该让用户始终删除自己的评论,但如果您需要特殊角色(例如管理员)才能删除任何评论或特殊权限 comments.delete (对于某些经理人) - 您也可以使用Sentry:

public function destroy($id) { 
     $user = Sentry::getUser();
     $comment = Comment::find($id);
     if($comment) {
         if($comment->user_id != $user->id && !$user->hasRole('Admin') && !$user->hasPermission('comments.delete'))) {
             return Response::back(); // optional message: Permission denied!
         }
         $comment->delete();
         return Response::back(); // optional with message: Deleted!
     }
     return Response::back(); // optional message: Comment not found!
}

通过表单请求进行DELETE的更好方法检查: Laravel RESTfull deleting