zoukankan      html  css  js  c++  java
  • laravel实践20.授权策略

    1.生成管理用户模型的授权策略

    $ php artisan make:policy UserPolicy

    所有生成的授权策略文件都会被放置在 app/Policies 文件夹下。

    2.在授权策略中针对各种action添加方法.如需对UserController中的update 方法添加策略,用于用户更新时的权限验证:

    app/Policies/UserPolicy.php

    <?php
    
    namespace AppPolicies;
    
    use IlluminateAuthAccessHandlesAuthorization;
    use AppModelsUser;
    
    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 AppProviders;
    .
    .
    .
    class AuthServiceProvider extends ServiceProvider
    {
        .
        .
        .
        public function boot()
        {
            $this->registerPolicies();
            // 修改策略自动发现的逻辑
            Gate::guessPolicyNamesUsing(function ($modelClass) {
                // 动态返回模型对应的策略名称,如:// 'AppModelsUser' => 'AppPoliciesUserPolicy',
                return 'AppPolicies\'.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);
        }
  • 相关阅读:
    “C语言” 读书札记(七)之[自白]
    代码审查就是在排大便——你懂的!
    page事件顺序(.net2.0)
    ASP.NET Custom Error Pages (asp.net自定义错误页)
    26字母中文第一字母排序
    16.448.10
    江西师范大学失物招领网(beta1)版告一段落
    处理HTML代码的若干函数
    Understanding the Session Object in ASP.NET 2.0
    获得扩展名[.net2.0]
  • 原文地址:https://www.cnblogs.com/itwatcher/p/12118952.html
Copyright © 2011-2022 走看看