Laravel Eloquent如何仅限制登录用户的访问权限

时间:2014-01-15 22:51:11

标签: mysql laravel eloquent

我有一个小应用程序,用户可以在其中创建分配给它们的内容。

有多个用户,但所有内容都在同一个表中。 我通过检索具有该用户ID的所有内容来显示属于用户的内容,但没有任何内容会阻止用户通过在URL中手动键入该内容的ID来查看其他用户的内容。

此外,当用户想要创建一个新东西时,我将验证规则设置为唯一,但显然如果其他人有一个具有相同名称的东西,则不会起作用。

我的Eloquent模型中是否有一种方法可以指定只允许属于登录用户的所有交互?

这意味着当用户尝试进入/ thing / edit并且他没有拥有该东西时,他会收到错误消息。

2 个答案:

答案 0 :(得分:3)

这样做的最好方法是检查一下""属于"事物"的控制器中的用户。

例如,在控制器中,您可以这样做:

// Assumes that the controller receives $thing_id from the route.
$thing = Things::find($thing_id); // Or how ever you retrieve the requested thing.

// Assumes that you have a 'user_id' column in your "things" table.
if( $thing->user_id == Auth::user()->id ) {
    //Thing belongs to the user, display thing.
} else {
    // Thing does not belong to the current user, display error.
}

使用关系表也可以实现同样的效果。

// Get the thing based on current user, and a thing id 
// from somewhere, possibly passed through route.
// This assumes that the controller receives $thing_id from the route.
$thing = Users::find(Auth::user()->id)->things()->where('id', '=', $thing_id)->first();

if( $thing ) {
    // Display Thing
} else {
    // Display access denied error.
}

第三种选择:

// Same as the second option, but with firstOrFail().
$thing = Users::find(Auth::user()->id)->things()->where('id', '=', $thing_id)->firstOrFail();

// No if statement is needed, as the app will throw a 404 error 
// (or exception if errors    are on)

如果我错了,请纠正我,我自己仍然是laravel的新手。但我相信这就是你要做的。如果没有看到你的"","""路线,或者#34;"控制器或你的"事情"使用eloquent设置模型(如果你使用雄辩的话)。

答案 1 :(得分:0)

我认为您正在寻找的功能可以通过授权来实现(此软件包基于Ryan Bates的rails CanCan gem):https://github.com/machuga/authority-l4

首先,您需要定义权限规则(请参阅文档中的示例),然后您可以将过滤器添加到具有id(编辑,显示,销毁)的特定路由中,并且可以在过滤器内部添加过滤器检查您的权限权限,以确定当前用户是否应该能够访问相关资源。