Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何限制用户只查看自己的配置文件_Php_Laravel_Laravel 6 - Fatal编程技术网

Php 如何限制用户只查看自己的配置文件

Php 如何限制用户只查看自己的配置文件,php,laravel,laravel-6,Php,Laravel,Laravel 6,我有一个视图(resources/view/front/auth/profile.blade.php),我在web.php中的路径是: Route::get('/profile/{user}','UserController@edit') ->name('profile') ->middleware('profilecheck'); 我的问题是,当用户登录并被重定向到他们自己的个人资料页面时(http://exmaple.com/profile/2),他可以将url

我有一个视图(
resources/view/front/auth/profile.blade.php
),我在
web.php
中的路径是:

Route::get('/profile/{user}','UserController@edit')
    ->name('profile')
    ->middleware('profilecheck');
我的问题是,当用户登录并被重定向到他们自己的个人资料页面时(
http://exmaple.com/profile/2
),他可以将url更改为
http://exmaple.com/profile/3
并查看其他用户配置文件

我想使用一个中间件来检查url参数为
{user}
的经过身份验证的用户id。
$user->id
将传递给
{user}
,但我不知道如何传递

谢谢你的帮助

中间件
UserProfile.php

<?php

namespace App\Http\Middleware;

use App\User;
use Closure;

class UserProfile
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // $request->user()->id
        // Auth::user()->id

        return $next($request);

    }
}

只需从url中删除用户id,而通过身份验证会话即可保护路由

因此,您的路线签名应该来自:

Route::get('/profile/{user}', 'UserController@edit')->name('profile');
为此:

Route::get('/profile', 'UserController@edit')->name('profile');
因此,在控制器中,不要从请求中获取用户id:

public function edit(Request $request)
{
     $user = User::findOrFail($request->id);
     // ...
}
您可以通过
Auth
facade获得登录的
用户

use Illuminate\Support\Facades\Auth;

public function edit(Request $request)
{
     $user = Auth::user();
     // ...
}
或者只是
auth()
帮助程序:

public function edit(Request $request)
{
     $user = auth()->user();
     // ...
}

这样,您就屏蔽了url,以避免恶意用户做他/她不应该做的事情。

您只需从url中删除用户id,然后通过身份验证会话来保护路由

因此,您的路线签名应该来自:

Route::get('/profile/{user}', 'UserController@edit')->name('profile');
为此:

Route::get('/profile', 'UserController@edit')->name('profile');
因此,在控制器中,不要从请求中获取用户id:

public function edit(Request $request)
{
     $user = User::findOrFail($request->id);
     // ...
}
您可以通过
Auth
facade获得登录的
用户

use Illuminate\Support\Facades\Auth;

public function edit(Request $request)
{
     $user = Auth::user();
     // ...
}
或者只是
auth()
帮助程序:

public function edit(Request $request)
{
     $user = auth()->user();
     // ...
}

这样,您就屏蔽了url,以避免恶意用户做他/她不应该做的事情。

您需要这样做

你的路线

Route::get('/profile', [
    'uses' => 'UserController@profile',
    'middleware' => 'profilecheck'
]);
您的中间件

class CheckUserMiddleware
{    
  public function handle($request, Closure $next)
  {

    if(!auth()->user()) {
        return redirect()->route('login');
    }

    return $next($request);
  }
}

你需要这样做

你的路线

Route::get('/profile', [
    'uses' => 'UserController@profile',
    'middleware' => 'profilecheck'
]);
您的中间件

class CheckUserMiddleware
{    
  public function handle($request, Closure $next)
  {

    if(!auth()->user()) {
        return redirect()->route('login');
    }

    return $next($request);
  }
}

如果已记录,只需使用“/profile”作为url,并在控制器中使用
返回视图(…)->with('user',auth()->user())
,或定义一些策略删除在url中传递id的选项,只需使用控制器中的auth facade通过auth::user()访问用户即可返回当前文件user@Berto99非常感谢。我只是照你说的做了,它成功了。如果它被记录了,只需使用一个“/profile”作为url,在控制器中使用
返回视图(…)->with('user',auth()->user())
,或者定义一些策略删除在url中传递id的选项,然后通过auth::user()访问用户在控制器中使用auth facade返回当前user@Berto99,谢谢你,我只是照你说的做了,它成功了。这是一种方法,但是你错过了一些东西,比如路由模型绑定。从长远来看,使用auth中间件和策略可能会更好run@Spholt为什么会错过模型绑定?如果需要绑定其他内容,只需在路由中定义它并在函数中接收它。我并不是说在每个请求中都应该这样做,只是在阻止用户修改其配置文件的特殊情况下。这种方法也适用于编辑与用户相关的内容。这是一种方法,但是你会错过一些东西,比如路由模型绑定。从长远来看,使用auth中间件和策略可能会更好run@Spholt为什么会错过模型绑定?如果需要绑定其他内容,只需在路由中定义它并在函数中接收它。我并不是说在每个请求中都应该这样做,只是在阻止用户修改其配置文件的特殊情况下。这种方法也适用于编辑与用户相关的内容。