【问题标题】:Laravel restrict users to only be able to see their own profileLaravel 限制用户只能看到自己的个人资料
【发布时间】:2018-04-21 09:17:23
【问题描述】:

我希望能够限制用户在我的 laravel 项目中只能看到他们自己的个人资料。因此,当用户想要访问他们的个人资料时,他们会转到 /userprofile/{id} 后跟的 url。但截至目前,任何用户都可以输入不同用户的特定 ID 并访问他们的个人资料。因此,如果我作为第一个注册用户登录,我的 id 将为 1。但我只想能够访问我的个人资料。如果我尝试在 url 中输入 id 2 或 3,我希望它把我踢回主页。知道我怎么能做到这一点吗?也许使用某种中间件?

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use DB;
use App\User;
use App\Salutation;
use App\Http\Requests\UserRequest;
use Auth;

class HomeController extends Controller
{
    public function index(){
        $users_info = User::all();
        return view('userprofile.index', compact("users_info"));
    }

    public function show($user_info){
        $user_info = User::find($user_info);
        return view('userprofile.show', compact("user_info"));
    }

    public function create(){
        return view('userprofile.create');
    }

    public function store(UserRequest $request){
        $formData = $request->all();

        User::create($formData);

        return redirect('userprofile');
    }

    public function edit($user_info) {
        $user_info = User::findOrFail($user_info);

        return view('userprofile.edit', compact("user_info"));
    }

    public function update(UserRequest $request, $user_info){
        $formData = $request->all();
        $user_info = User::findOrFail($user_info);
        $user_info->update($formData);

        return redirect('userprofile');
    }

    public function __construct(){
        $this->middleware('auth', ['only' =>['create', 'edit', 
'destroy']]);
    }
}

【问题讨论】:

  • 你的控制器是什么样的?与其做return User::find($id) 之类的事情,不如做return Auth::user()。这就是它的全部内容。
  • 有很多不同的方法来处理这个问题。可能是 devk 所说的,可能是检查 Auth::id() 是否与请求的 id 匹配,或者您可以使用 Laravel 中内置的 Gate/Authorization 逻辑并编写访问此端点的策略。你读过 Laravel 的文档吗?
  • 我刚刚发布了我的用户控制器。还有一种方法可以做到这一点,我可以简单地检查请求ID是否与当前登录的用户ID相同,如果不是,将它们踢回主页?这就是为什么我问中间件是否可以工作。
  • 您需要查询个人资料页面的用户id并与登录用户进行比较,并根据比较结果允许或重定向访问。
  • 简单的解决方案是在show中执行abort_unless($user_info == \Auth::id(), 403)

标签: php laravel authentication


【解决方案1】:

只需将当前用户与参数 id 进行比较

示例:

public function getProfile(Request $request, $id)
{
     if(Auth::id() == $id) {
          // valid user
          $user_info = Auth::user();
          return view('userprofile.show', compact("user_info"));
     } else {
          //not allowed
     }
}

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2022-07-29
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    相关资源
    最近更新 更多