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 异常信息来拒绝访问。

使用授权策略需要注意以下两点:

  1. 并不需要检查 $currentUser 是不是 NULL。未登录用户,框架会自动为其 所有权限 返回 false
  2. 调用时,认情况下, 不需要 传递当前登录用户至该方法内,因为框架会自动加载当前登录用户

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);
    }

 

相关文章

laravel的dd函数不生效怎么办
看不懂laravel文档咋办
安装laravel框架出现command怎么办
Laravel开发API怎么使用事务
laravel怎么构建复杂查询条件
laravel如何实现防止被下载