【问题标题】:Laravel Sanctum can be use Multiauth guardLaravel Sanctum 可以使用 Multiauth 保护
【发布时间】:2020-07-24 23:51:48
【问题描述】:

我正在使用 laravel sanctum 进行测试,但这里有一些问题.. 我正在创建管理员守卫。

当我将中间件更改为 auth:sanctum_admin.. 它应该只能由管理员访问,但在这里我可以使用普通用户帐户和 web Guard 访问。我不知道为什么?...我使用带有多重身份验证包的护照。没关系。但是这里的圣所不能是单独的用户表和管理员。

【问题讨论】:

  • Zzzzz............

标签: laravel laravel-sanctum


【解决方案1】:
  1. 您必须在 config/auth.php 中添加自定义防护。

'守卫' => [

    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'custom-guard' => [
        'driver' => 'session',
        'provider' => 'custom-provider',
    ]
],

小心,custom guard 中的 driver 必须是 session。 并将提供者设置为:

'providers' => [
   'users' => [
       'driver' => 'eloquent',
       'model' => App\User::class,
   ],

   'custom-provider' => [
       'driver' => 'eloquent',
       'model' => App\CustomProvider::class,
   ],

], App\CustomProvider::class 必须是模型。 之后可以轻松地在身份验证中使用防护。

auth('custom-guard')->user()

【讨论】:

    【解决方案2】:

    config/auth.php

    司机是圣所

    'guards' => [
        'users' => [
            'driver' => 'sanctum',
            'provider' => 'users',
        ],
    
        'partners' => [
            'driver' => 'sanctum',
            'provider' => 'partners',
        ],
    
        'admins' => [
            'driver' => 'sanctum',
            'provider' => 'admins',
        ],
    
            ],
    

    提供者:

    providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
    
        'partners' => [
            'driver' => 'eloquent',
            'model' => App\Models\Partner::class,
        ],
    
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Models\Admin::class,
        ],
    ],
    

    型号:

    必须添加可验证

    <?php
    
    namespace App\Models;
    
    use Illuminate\Contracts\Auth\MustVerifyEmail;
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Illuminate\Notifications\Notifiable;
    
    class Admin extends Authenticatable
    {
        use HasFactory, Notifiable;
    
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'name',
            'email',
            'password',
        ];
    
        /**
         * The attributes that should be hidden for arrays.
         *
         * @var array
         */
        protected $hidden = [
            'password',
            'remember_token',
        ];
    
        /**
         * The attributes that should be cast to native types.
         *
         * @var array
         */
        protected $casts = [
            'email_verified_at' => 'datetime',
        ];
    }
    

    中间件:

    Route::middleware(['auth:admin'])->get('/user', function(){
       
    }
    

    后卫:

    auth()->guard('admin')->user();
    

    未经身份验证的用户消息:

    在 app/Exceptions/Handler.php 中

    use Illuminate\Auth\AuthenticationException;
    

    功能:

    protected function unauthenticated($request, AuthenticationException $exception)
        {
           return response()->json(['message' => 'Unauthenticated.'], 401);
    
    }
    

    自定义保护和自定义重定向

    public function render($request, Exception $exception)
    {
        $class = get_class($exception);
    
        switch($class) {
            case 'Illuminate\Auth\AuthenticationException':
                $guard = array_get($exception->guards(), 0);
                switch ($guard) {
                    case 'admin':
                        $login = 'admin.login';
                        break;
                    default:
                        $login = 'login';
                        break;
                }
    
                return redirect()->route($login);
        }
    
        return parent::render($request, $exception);
    }
    

    【讨论】:

      【解决方案3】:

      @Abhishek Mitra

      对于Multiple Auth Guard的情况下使用Laravel Sanctum进行授权,我们可以使用中间件

      Route::middleware(['auth:guard_name'])->get('/user', function(){
          return auth()->guard('guard_name')->user();
      }
      

      【讨论】:

        【解决方案4】:

        你可以,也可以在圣所中使用多个守卫。为此,请按照以下步骤操作 -

        1. 根据需要创建自己的警卫。 (在config/auth.php
        'guards' => [
                'web' => [
                    'driver' => 'session',
                    'provider' => 'users',
                ],
        
                'api' => [
                    'driver' => 'token',
                    'provider' => 'users',
                    'hash' => false,
                ],
        
                'admin' => [
                    'driver' => 'session',
                    'provider' => 'admins',
                ]
            ],
        
        1. 设置提供程序。 (在config/auth.php
        'providers' => [
               'users' => [
                   'driver' => 'eloquent',
                   'model' => App\User::class,
               ],
        
               'admins' => [
                   'driver' => 'eloquent',
                   'model' => App\Admin::class,
               ],
           ],
        
        1. 在对用户进行身份验证时使用此防护。 (在路线文件中)
          if(auth()->guard('admin')->attempt($request->only('email','password')))
          {
              return auth()->guard('admin')->user();
          }
          

        【讨论】:

        • 欢迎您!感谢您的贡献。我可以要求您从图像中复制代码并将它们放入降价中吗?我们尽量避免在 Stack Overflow 上截取代码,因为其他用户很难从中复制和粘贴它们,而且它们不会出现在搜索结果中(例如,如果有人正在使用其中的关键字进行搜索)。
        【解决方案5】:

        我认为默认的守卫应该是这样的:

        'defaults'{
            'guard' : "sanctum_admin",
            'passwords': 'admins',
        }
        

        或者

        'defaults'{
            'guard' : 'web',
            'passwords' : 'users',
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-05
          • 2021-05-18
          • 1970-01-01
          • 1970-01-01
          • 2022-12-18
          • 2016-07-30
          相关资源
          最近更新 更多