未经授权的laravel 5

Posted

技术标签:

【中文标题】未经授权的laravel 5【英文标题】:Unauthorized 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') 看起来很可疑 【参考方案1】:

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

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

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

根据php手册:

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

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

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

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

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

【讨论】:

我没有看到添加代码的执行有任何变化。 非常感谢您^^

以上是关于未经授权的laravel 5的主要内容,如果未能解决你的问题,请参考以下文章

未经授权的laravel 5

角度 laravel 未经授权的 401 错误

用户未经授权时的 Laravel 护照自定义错误消息和状态码

Laravel registerPolicies 总是得到“这个动作是未经授权的”。

laravel 6护照中未经授权的401错误

Laravel 8 Policy 总是返回“此操作未经授权”。