【问题标题】:laravel 4.2. user permissions and hiding link source拉拉维尔 4.2.用户权限和隐藏链接源
【发布时间】:2014-10-31 04:34:07
【问题描述】:

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

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

  2. 例如,当我在 Basic 组中有一个用户并且他使用按钮删除了一些评论时,会发生什么情况。在浏览器的左侧下方,用户可以在悬停链接时看到指向此评论的链接。例如 www.test.com/cmets/345/delete,其中 id 为 345。如果用户使用另一个 id 键入,这意味着他可以删除另一个评论。我找到了一些关于如何解决这个问题的建议,用 jQuery 和 javascript 制作它,这样链接就不会显示,并且 POST 将使用例如 AJAX 进行。但是由于我是新手,我在想这需要多少时间,这真的是一个好方法吗? 1.问题中的打包Sentry能否帮助我获得每个组可以访问的路线的权限?

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

【问题讨论】:

  • 嗯,为什么这个问题被否决了?
  • 没有人回答你的第二个问题,所以我要发表评论。用户可以采取他不应该采取的行动吗? 是的,他可以。你需要在服务器端检查他是否被授权的权限。 Sentry 的文档对此进行了非常详细的说明,因此我认为您在这里不会感到任何困难。

标签: laravel


【解决方案1】:

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();
}

【讨论】:

  • 非常感谢,我已经看到了您在此处链接的帖子。 :) 你能否更具体地使用 POST 和 GET,我是否遗漏了一些东西,因为我还是看到了链接
  • 因为我知道它可以像这样工作:
【解决方案2】:

1) Sentry 确实是帮助您的最佳软件包。

2) 为确保用户只能删除他的 cmets,您可以执行以下操作(但还有更多解决方案,无论您是否使用 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。我认为您应该让用户始终删除他们自己的 cmets,但如果您需要特殊角色(例如管理员)才能删除任何评论或特殊权限 cmets.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!
}

通过表单请求进行删除的更好方法检查以下内容: Laravel RESTfull deleting

【讨论】:

    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多