【问题标题】:Unauthorized laravel 5未经授权的laravel 5
【发布时间】:2018-03-30 09:33:20
【问题描述】:

我尝试使用 Laravel 的访问策略,但是,我一遍又一遍地收到相同的错误,我看不到我需要在函数或模型中导入和/或使用什么。

首先我向你展示我的 AuthServiceProvider

use Illuminate\Support\Facades\Gate;
use App\User;
use App\Policies\UserPolicy;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as 
ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
    User::class => UserPolicy::class,
];

public function boot()
{
    $this->registerPolicies();

    //
}
}

现在我的用户策略

namespace App\Policies;

use App\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class UserPolicy
{
 use HandlesAuthorization;


public function __construct()
{
    //
}

public function edit(User $authUser, User $user) 
{
    return $authUser === $user;
}
}

最后是我的 UsersControllers 的编辑功能

use App\User;
use Illuminate\Http\Request;
use App\Http\Requests\UpdateUserRequest;

public function edit($id)
{
    $user = User::findOrFail($id);
    $this->authorize($user);

    return view('users.edit', compact('user'));
}

使用我的 UpdateUserRequest 和授权

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UpdateUserRequest extends FormRequest
{
/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    return true;
}

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'name' => 'required',
        'email' => 'required|unique:users,email,'.$this->route('usuario')
    ];
}
}

当我尝试访问它时,它总是告诉我我没有授权,即使我修改了 UserPolicy 的编辑功能。

【问题讨论】:

  • 你已经声明了一个UpdateUserRequest,但不要在你的控制器动作中使用它。
  • 我这样做了,现在我没有收到错误,但它不会重定向我或继续执行代码,它只是让我留在原来的地方。也许在退货的时候atuhorize带我出去,但它不应该是唯一应该退货的东西?
  • 有什么错误吗? $this->route('usuario') 看起来很可疑

标签: php laravel


【解决方案1】:

您的授权调用错误。授权方法的第一个参数需要是您尝试授权的操作。所以授权检查的正确代码是:

$this->authorize('edit', $user);

您正在使用身份运算符=== 来比较用户模型。喜欢return $authUser === $user;

根据php手册:

使用恒等运算符 (===) 时,当且仅当对象变量引用同一类的同一实例时,它们才是相同的。

但是,$authUser 实例和$user 实例是同一模型的不同实例。使用比较运算符==

在使用比较运算符(==)时,对象变量的比较方式很简单,即:如果两个对象实例具有相同的属性和值(值与==比较),则它们是相等的,并且是同一个班级。

现在您的用户策略方法将是:

public function edit(User $authUser, User $user) {
    return $authUser == $user;
}

【讨论】:

  • 我没有看到添加代码的执行有任何变化。
  • 非常感谢您^^
猜你喜欢
  • 2020-11-15
  • 2018-10-23
  • 2018-06-15
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2022-11-26
  • 2022-08-07
相关资源
最近更新 更多