2017-04-14 107 views
0

我是Laravel的新手,为多个用户构建网站,在其中一个网页上列出与登录用户相关的项目,允许用户点击某个项目,然后在下一页上查看或编辑细节。非常简单的概念,但我想知道何时由Laravel提供详细信息页面,如何简单可靠地知道哪个项目被点击并显示正确项目的详细信息。Laravel 5.4:如何在页面浏览中安全地跟踪所选项目?

解决此问题的一个显而易见的方法是在详细信息页面的URL中指定项目的主键ID - 即为第一页上的列表中的每个项目指定项目的主键ID,然后指定使用该项目返回正确的项目:

Route::get('/itemdetails/{ID}', '[email protected]'); 

然后显然使用指定的ID来做数据库查找。 问题是,这是完全不安全的,即任何用户都可以在ID字段中尝试不同的数字并访问其他用户的项目详细信息。

那么,如何以一种用户无法伪造的身份证等做到这一点牢固Laravel? 我在想什么会议或ID的散列或什么东西,但不知道如何实际执行此操作。

由于我是新手,源代码或特定细节非常感谢!

非常感谢。

回答

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,您可以确保没有人可以访问该页面,即使他们确实拥有该URL(当然这只有在认证正确实施的情况下才有效)。

我的例子只有一种方法来检查身份验证Laravel有一个精心制作的方法来授权人员和操作,使用他们的门可以阅读更多here

+0

很好。很好的解决方案,谢谢:) –

0

会话是安全存储这类信息的最佳方式!您可以使用session()->put('key','value')在会话中添加值。这意味着您可以根据需要输入尽可能多的值!它将安全地存储您的数据,因为Laravel会将其存储在我认为的文件中!

您可以通过登录除外信息(session()->forget('key'))去除一切清除会话值时,你不需要在特定会话的值,也可以在阵列存储,并删除整个阵列时不再需要它!我也一样将服务器的ID存储在我的系统中,因为一个用户可以管理多台服务器!

让我知道这是否有帮助!

+0

谢谢,但与会话,我不看我怎么跟踪用户点击了哪些项目(让服务器拉起了正确的细节记录),以及如何防止用户访问其他用户的项目细节,他们'没有授权看?谢谢 –

0

如果你使用内置的Laravel AUTH你可以在你的控制器的顶部用一个简单的构造函数,记得使用use Auth; ,如果它是一个干净的安装,你也必须运行php artisan make:auth

use Auth; 

class WhateverController extends Controller 
{ 
    public function __construct() 
     { 
      $this->middleware('auth', ['except' => 'logout']); 
     } 

    ... Your Controller code 

这将允许(除了注销)只有权限的访问(即在Laravel默认设置为用户)

+0

谢谢。这将确保非用户无法查看详细信息页面(即公开发布),但它不会阻止一个用户查看其他用户的详细信息页面 - 因为它们都将被登录/授权。 –

相关问题