我如何保护其他用户laravel 5.3的配置文件表单更新

时间:2016-11-04 10:12:36

标签: php laravel

这次我有这样的Url 的 http://Blog/user/profile/51 并且我使用 id = 51 的用户登录但是如果我将此ID更改为50,则会显示包含id为50的用户数据的表单我想停止这个我如何保护帮助请。 如何在执行othere之前检查这个条件

public function profile($id, Request $request)
    {    

  ***if($id == Auth::user()->id){
        Now Check get or post method
    }else{
        return ('Out');
    }***

$method = $request->method();
    if ($request->isMethod('get')) {
             $user = User::findOrFail($id);
            $users = DB::table('users')->select('id', 'name')->get();
            $user_fields = DB::table('users')->where('id', $user->id)->get();
     $page_data = [
                            'title' => 'Edit User Account',
                            'action' => 'edit'
                         ];

            return view('user.profile')->with(compact('user', 'page_data', 'users'));

    }else{
    $this->validate($request, [
           'name' => 'required|max:255',

         ]);

        $user = User::findOrFail($id);
        $input = $request->all();
        $user->fill([
        'name'           => $request->input('name'),
        'password'       => $request->password ? bcrypt($request->input('password')) : $user->password,
        'time_zone'   => $request->input('time_zone'),
        'address_line_1' => $request->input('address_line_1'),
        'address_line_2' => $request->input('address_line_2'),
         ])->save();
        session()->flash('msg',trans('successfully Updated.'));
}

我知道我可以检查auth用户ID等于这个id但不知道如何实现我在这里打磨网址

<form action="/user/profile/{{$user->id}}" method="POST">

我正在将auth用户ID作为

<a href="{{ route('user.profile', ['id' => Auth::user()->id ]) }}">

路线如下

Route::any('/user/profile/{id}', ['as' => 'user.profile', 'uses' => 'UserController@profile']);

现在我如何在show form之前检查用户是否是相关表单 感谢

2 个答案:

答案 0 :(得分:1)

如果要将用户个人资料设为私有,则不应将其与GET参数绑定(仅对公共个人资料页面执行此操作)。您应该做什么将配置文件路由放在auth中间件组中:

Route::group(['middleware' => 'auth'], function () {
    Route::get('profile', 'UserController@showProfile');
}

使用auth()->user()对象来显示数据:

{{ auth()->user()->name }}
{{ auth()->user()->email }}

答案 1 :(得分:0)

Laravel Middleware docs

中间件将帮助您,它将允许您检查请求该URL的用户是否具有与其会话中存储的相同的ID。如果他们匹配他的所有者&#39;如果没有,你可以重定向他提供错误信息。

创建middelware (App \ Http \ Middleware \ IsOwnerOfProfile.php)

<?php

namespace App\Http\Middleware;

use Closure;

class IsOwnerOfProfile {
    /**
     * Check if the user accessing the profile is the owner of the profile
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next){
        if ($request->id != auth()->user()->id) {
            return redirect('home')->with('error','You are not the owner of this profile');
        }

        return $next($request);
    }
}

注册middelware (App \ Http \ Kernel.php)

protected $routeMiddleware = [
    // other defined middlewares
    'profileOwner' => \App\Http\Middleware\IsOwnerOfProfile::class,
]

更新路线

Route::any('/user/profile/{id}', [
    'middleware' => 'profileOwner'
    'as' => 'user.profile',
    'uses' => 'UserController@profile'
]);

注意&amp;更新: 正如@Alexey Mezenin所提到的,auth middelware必须在此之前执行。否则,您将无法访问auth()->user(),中间件将抛出异常。