【问题标题】:How do I authenticate a user in Laravel 8 Jetstream only if his status is active?仅当用户状态为活动时,如何在 Laravel 8 Jetstream 中对用户进行身份验证?
【发布时间】:2021-02-26 07:17:36
【问题描述】:

我正在构建一个 Laravel 8 应用程序并已成功实现身份验证。现在我想在用户登录之前检查用户的状态是否处于活动状态。我在用户表中添加了一个字段

username varchar
password varchar
....
status tinyint(1)
...

我正在使用 JetStreamFortify

谢谢

【问题讨论】:

    标签: php laravel fortify laravel-8 jetstream


    【解决方案1】:

    您可以在boot 方法上从app\Providers\JetStreamServiceProvider.php 自定义用户身份验证:

    use App\Models\User;
    use Illuminate\Http\Request;
    use Laravel\Fortify\Fortify;
    
    public function boot()
    {
        $this->configurePermissions();
    
        Jetstream::createTeamsUsing(CreateTeam::class);
        Jetstream::updateTeamNamesUsing(UpdateTeamName::class);
        Jetstream::addTeamMembersUsing(AddTeamMember::class);
        Jetstream::deleteTeamsUsing(DeleteTeam::class);
        Jetstream::deleteUsersUsing(DeleteUser::class);
        // Below code is for your customization
        Fortify::authenticateUsing(function (Request $request) {
            $user = User::where('email', $request->email)->first();
    
           if ($user && Hash::check($request->password, $user->password)) {
                if ($user->status == 1) {  // it will return if status == 1
                     return $user;
                }
           }
    
        });
    }
    

    查看Customizing User Authentication的官方Jetstream文档

    【讨论】:

    • 感谢您的示例。在查询中添加另一个“where”不是更好吗?
    • @JuliSmz,是的,你可以
    • 你不检查密码!!!在您的示例中,活跃的每个人都可以使用错误的密码登录!!!
    • 是的,你可以。你试过你的剪吗?我现在试过了,你可以用随机密码登录
    • 官方例子中是密码校验:$user && Hash::check($request->password, $user->password)
    【解决方案2】:

    你也应该添加:使用 Illuminate\Support\Facades\Hash;

    【讨论】:

      【解决方案3】:

      这是带有自定义错误消息的。

      Fortify::authenticateUsing(function (Request $request) {
          $user = User::where('email', $request->email)->first();
      
          if ($user && Hash::check($request->password, $user->password)) {
              if ($user->active == 1) { 
                  return $user;
              }
              throw ValidationException::withMessages(['Your Message Here!']);        
          }
      
      });
      

      确保导入 ValidationException

      use Illuminate\Validation\ValidationException;
      

      您也可以只发送一条客户 403 消息

      abort(403,'Your Message Here!')
      

      【讨论】:

        猜你喜欢
        • 2020-01-25
        • 1970-01-01
        • 2021-03-08
        • 1970-01-01
        • 2018-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多