laravel5.7升级到6.0授权策略文件类AuthServiceProvider区别
今天小编在社区发现很多小伙伴都将laravel升级到了6.0 还徘徊在5.7的小编我趁着也学习下6.0的新功能,就做了一个6.0版本的多用户留言系统,在做权限的时候发现之前5.7有些不同,比如有个需求,用户只能编辑自己的的留言不能编辑别人的,下面我们就以这个需求来对比下6.0的版本和之前5.x的版本有什么不同的地方 首先我们创建一个授权策略类文件 UserPolicy
$ php artisan make:policy UserPolicy
所有生成的授权策略文件都会被放置在 app/Policies
文件夹下。
让我们为默认生成的用户授权策略添加 update
方法,用于用户更新时的权限验证。
app/Policies/UserPolicy.php
<?phpnamespace 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
;调用时,默认情况下,我们 不需要 传递当前登录用户至该方法内,因为框架会自动加载当前登录用户(接着看下去,后面有例子);
接下来我们还需要在 AuthServiceProvider
类中对授权策略进行设置。AuthServiceProvider
包含了一个 policies
属性,该属性用于将各种模型对应到管理它们的授权策略上。我们需要为用户模型 User
指定授权策略 UserPolicy
。
app/Providers/AuthServiceProvider.php
重点来了:5.7中需要手工制定 策略类,5.8以上版本可以自动授权
下面我先看看5.7 如何配置
在5.7中 我们需要在 $policies 这个数组属性中配置映射关系
代码片段如下:
protected $policies = [ 'App\Model' => 'App\Policies\ModelPolicy', \App\Models\User::class => \App\Policies\UserPolicy::class, ];
laravel5.8 版本以上新增自动授权文件在:
app/Providers/AuthServiceProvider.php
自动授权默认会假设 Model 模型文件直接存放在 app
目录下,鉴于我们已将模型存放目录修改为 app/Models
,接下来还需自定义自动授权注册的规则,修改 boot()
方法:
public function boot() { $this->registerPolicies(); // 修改策略自动发现的逻辑 Gate::guessPolicyNamesUsing(function ($modelClass) { // 动态返回模型对应的策略名称,如:// 'App\Models\User' => 'App\Policies\UserPolicy', return 'App\Policies\\'.class_basename($modelClass).'Policy'; }); }
授权策略定义完成之后,我们便可以通过在用户控制器中使用 authorize
方法来验证用户授权策略。默认的 App\Http\Controllers\Controller
类包含了 Laravel 的 AuthorizesRequests
trait。此 trait 提供了 authorize
方法,它可以被用于快速授权一个指定的行为,当无权限运行该行为时会抛出 HttpException。authorize
方法接收两个参数,第一个为授权策略的名称,第二个为进行授权验证的数据。
至此我们可以看到 随着Laravel新版本的更新,功能是越来越方便好用,授权自动授权还是很方便的,假如我们要使用这个授权,比如
app/Http/Controllers/UsersController.php
在usersController edit方法中加入
$this->authorize('update', $user);
代码片段如下:
public function edit(User $user) { $this->authorize('update', $user); return view('users.edit', compact('user')); }
这样就实现了只能自己编辑自己的留言功能了,是不是很方便了,感谢Taylor 创造出了这款伟大的产品