laravel实践20.授权策略
1.生成管理用户模型的授权策略
$ php artisan make:policy UserPolicy
所有生成的授权策略文件都会被放置在 app/Policies
文件夹下。
2.在授权策略中针对各种action添加方法.如需对UserController中的update 方法添加策略,用于用户更新时的权限验证:
app/Policies/UserPolicy.php
<?php namespace App\Policies; use Illuminate\Auth\Access\HandlesAuthorization; use App\Models\User; class UserPolicy { use HandlesAuthorization; public function update(User $currentUser, User $user) { return $currentUser->id === $user->id; } }
update
方法接收两个参数,第一个参数默认为当前登录用户实例,第二个参数则为要进行授权的用户实例。当两个 id 相同时,则代表两个用户是相同用户,用户通过授权,可以接着进行下一个操作。如果 id 不相同的话,将抛出 403 异常信息来拒绝访问。
使用授权策略需要注意以下两点:
- 并不需要检查
$currentUser
是不是 NULL。未登录用户,框架会自动为其 所有权限 返回false
; - 调用时,默认情况下, 不需要 传递当前登录用户至该方法内,因为框架会自动加载当前登录用户。
3. 自动注册授权策略
自动授权默认会假设 Model 模型文件直接存放在 app
目录下,如果已将模型存放目录修改为 app/Models
,接下来还需自定义自动授权注册的规则,修改 boot()
方法:
app/Providers/AuthServiceProvider.php
<?php namespace App\Providers; . . . class AuthServiceProvider extends ServiceProvider { . . . public function boot() { $this->registerPolicies(); // 修改策略自动发现的逻辑 Gate::guessPolicyNamesUsing(function ($modelClass) { // 动态返回模型对应的策略名称,如:// 'App\Models\User' => 'App\Policies\UserPolicy', return 'App\Policies\\'.class_basename($modelClass).'Policy'; //此处的$modelClass 已在app/Policies/UserPolicy.php 中定义为app/Models/User }); } }
4.在UserController 中添加$this->authorize('update', $user);
app/Http/Controllers/UsersController.php
public function edit(User $user) { $this->authorize('update', $user); return view('users.edit', compact('user')); } public function update(User $user, Request $request) { $this->authorize('update', $user); $this->validate($request, [ 'name' => 'required|max:50', 'password' => 'nullable|confirmed|min:6' ]); $data = []; $data['name'] = $request->name; if ($request->password) { $data['password'] = bcrypt($request->password); } $user->update($data); session()->flash('success', '个人资料更新成功!'); return redirect()->route('users.show', $user->id); }