我是Laravel的新手并为多个用户构建网站,其中一个网页列出了与登录用户相关的项目,允许用户点击某个项目然后在下一页上查看或编辑细节。非常简单的概念,但我想知道Laravel何时提供详细信息页面,如何简单安全地知道点击了哪个项目并显示正确项目的详细信息。
解决此问题的显而易见的方法是在详细信息页面的URL中指定项目的主键ID - 即对于第一页上列表中的每个项目,然后指定使用该项目返回正确的路由项:
Route::get('/itemdetails/{ID}', 'MyController@showitemdetailspage');
然后显然使用指定的ID来进行数据库查找。 麻烦的是,这是完全不安全的,即任何用户都可以在ID字段中尝试不同的号码并访问其他用户的项目详细信息。
那么我如何在Laravel中以一种用户无法欺骗ID等方式安全地执行此操作? 我正在考虑使用会话或ID的哈希,但不知道如何实际实现它。
由于我是新手,我非常感谢源代码或具体细节!
非常感谢。
答案 0 :(得分:2)
作为标识符放入URL的任何内容都可以被破解,某种散列可以减慢(显着)但不会解决您的问题,您最好使用"正确的"认证。
在控制器内部,您可以检查用户是否有权访问指定的页面。
public function showitemdetailpage($ID){
$someModel = MyModel::find($ID);
if($someModel->user_id == Auth::user()->id){
return view('myawesomeview', ['detail' => $someModel]);
}
abort(404);
}
我在此处选择了404错误,以防止其他用户查看指定的detailPage是否存在,您还可以返回状态代码403
(不允许)。这会让其他用户知道详细信息页面存在但无法被他们访问。
通过阻止访问而不是模糊ID,您可以确定没有人可以访问该页面,即使他们确实有网址(当然这只有在正确实施身份验证时才有效)。
我的示例只是检查身份验证的一种方法Laravel有一种精心设计的方法来授权人员和操作,使用他们的门可以阅读更多here。
答案 1 :(得分:0)
会话是安全存储此类信息的最佳方式!您可以使用session()->put('key','value')
在会话中添加值。这意味着您可以根据需要输入尽可能多的值!它将安全地存储您的数据,因为Laravel会将其存储在我认为的文件中!
当您不需要特定会话中的值时,您可以通过删除除登录信息(session()->forget('key')
)之外的所有内容来清除会话值,或者您可以将其存储在数组中并删除整个阵列不再需要时!我也这样做是为了在我的系统中存储服务器的ID,因为一个用户可以管理许多服务器!
请告诉我这是否有帮助!
答案 2 :(得分:0)
如果您使用内置的Laravel身份验证,则可以在控制器顶部使用简单的构造函数,并记住使用use Auth;
如果是全新安装,您还必须运行php artisan make:auth
use Auth;
class WhateverController extends Controller
{
public function __construct()
{
$this->middleware('auth', ['except' => 'logout']);
}
... Your Controller code
这将允许(注销除外)仅访问auth(在Laravel中默认设置为用户)