保护show()方法以防止用户访问其他用户消息的最佳方法

时间:2015-05-30 20:19:59

标签: laravel laravel-4 routing models relationships

好的,所以我有一个基本的消息系统,我有一个关系设置,所以我可以调用$user->messages来检索用户收件箱消息的数组。我还有一个非常简单的show方法,目前只抓取传递给show()函数的id的消息。

问题是什么是保护该消息/ 2 URL的最佳方式,因此用户不能只在URL中键入任何数字并访问其他用户消息。

我应该使用路由过滤器并且基本上运行另一个查询以确保用户可以访问消息ID,或者我可以对该关系执行某些操作,也许可以针对messages数组检查id,如果它存在,那么用户必须有权访问?

public function up()
    {
        Schema::create('messages', function(Blueprint $table) {
            $table->increments('id');
            $table->mediumText('subject');
            $table->text('message');
            $table->boolean('draft');
            $table->integer('sender_id')->unsigned();
            $table->softDeletes();
            $table->timestamps();

            $table->foreign('sender_id')->references('id')->on('users')->onUpdate('cascade');
        });

        Schema::create('message_assets', function(Blueprint $table) {
            $table->increments('id');
            $table->integer('message_id')->unsigned();
            $table->string('filename', 255);
            $table->softDeletes();

            $table->foreign('message_id')->references('id')->on('messages')->onUpdate('cascade');
        });

        Schema::create('message_users', function(Blueprint $table) {
            $table->increments('id');
            $table->integer('message_id')->unsigned();
            $table->integer('user_id')->unsigned();
            $table->integer('read')->default(0);
            $table->string('folder', 255)->nullable();
            $table->softDeletes();

            $table->foreign('message_id')->references('id')->on('messages')->onUpdate('cascade');
            $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade');
        });
    }

1 个答案:

答案 0 :(得分:2)

以最简单的形式,在show方法的MessagesController中,您可以向查询中添加一个附加参数,并获取记录,其中message_id =来自url的参数,而该消息上的user_id是经过身份验证的用户的ID。 ..做类似

的事情
$message = App\Message::where('id', '=', $id)
                      ->where('user_id', '=', Auth::user()->id)
                      ->first();

如果您正在进行更高级的设计并拥有MessageRepository,则可以在此处提取此逻辑,因此在您的控制器中执行类似

的操作
$this->repository->getById($id);

并且在消息库中,getById()方法将使用一个雄辩的模型执行与上面的代码示例类似的操作。此方法允许控制器清洁,并在需要时在应用程序的其他位置重用逻辑

添加以使用上面指定的数据透视表。这仅适用于收件箱中包含消息的用户:

DB::table('messages')
    ->join('message_users', 'messages.id', '=', 'message_users.message_id')
    ->where('message_users.message_id', $id)
    ->where('message_users.user_id', $userId)
    ->where('message_users.deleted_at', null)
    ->select('messages.*')
    ->first();
相关问题