我有一个小应用程序,用户可以在其中创建分配给它们的内容。
有多个用户,但所有内容都在同一个表中。 我通过检索具有该用户ID的所有内容来显示属于用户的内容,但没有任何内容会阻止用户通过在URL中手动键入该内容的ID来查看其他用户的内容。
此外,当用户想要创建一个新东西时,我将验证规则设置为唯一,但显然如果其他人有一个具有相同名称的东西,则不会起作用。
我的Eloquent模型中是否有一种方法可以指定只允许属于登录用户的所有交互?
这意味着当用户尝试进入/ thing / edit并且他没有拥有该东西时,他会收到错误消息。
答案 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(编辑,显示,销毁)的特定路由中,并且可以在过滤器内部添加过滤器检查您的权限权限,以确定当前用户是否应该能够访问相关资源。