【问题标题】:Laravel Fortify Customize Authentication RedirectLaravel Fortify 自定义身份验证重定向
【发布时间】:2021-01-12 09:03:31
【问题描述】:

在 Laravel fortify 的自定义身份验证过程中,我无法重定向到带有错误消息的登录页面,而我们可以在 Auth 中执行此操作。 这是自定义文档链接:https://jetstream.laravel.com/1.x/features/authentication.html#customizing-the-authentication-process

        if ($user && Hash::check($request->password, $user->password) && $user->status == 'active') {
            return $user;
        } elseif ($user->status == 'inactive') {
            //redirect with some error message to login blade
        } elseif ($user->status == 'blocked') {
            //redirect with some error message to login blade
        }

请帮我解决这个问题。

【问题讨论】:

  • 该方法仅用于返回用户,所以你不能在那里做任何重定向......你可以返回nullfalse,但你不会有任何自定义留言
  • 但是在向用户返回消息的情况下,我如何在 fortify 中做到这一点?

标签: laravel authentication redirect fortify laravel-8


【解决方案1】:

我理解您对文档(或缺少文档)的不满。我遇到了类似的问题,这就是我设法做到的:

if ($user && in_array($user->status_id, [1,2,3])) {
    if (Hash::check($request->password, $user->password)) {
        return $user;
    }
}
else {
    throw ValidationException::withMessages([
        Fortify::username() => "Username not found or account is inactive. Please check your username.",
    ]);
}

https://github.com/laravel/fortify/issues/94#issuecomment-700777994

【讨论】:

  • 这确实有助于在用户登录之前检查用户角色
【解决方案2】:

对于那些来自谷歌搜索并使用Laravel Jetstream(使用 Fortify)的用户: Laracasts answered this questionSnapey 并创建了一个 tutorial,它使用您自己的 LoginResponse 来覆盖默认登录行为。

我是这样制作的,但当然你应该根据自己的需要创建自己的。

// app/Http/Responses/LoginResponse.php
namespace App\Http\Responses;

use Illuminate\Support\Facades\Auth;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;

class LoginResponse implements LoginResponseContract
{

    /**
     * @param  $request
     * @return mixed
     */
    public function toResponse($request)
    {
        // replace this with your own code
        // the user can be located with Auth facade
        
        $home = Auth::user()->is_admin ? config('fortify.dashboard') : config('fortify.home');
            
        return $request->wantsJson()
            ? response()->json(['two_factor' => false])
            : redirect($home);
    }

}

下一步它修改JetstreamServiceProvider以使用你的LoginReponse

public function boot()
{
    $this->configurePermissions();

    Jetstream::deleteUsersUsing(DeleteUser::class);

    // register new LoginResponse
    $this->app->singleton(
        \Laravel\Fortify\Contracts\LoginResponse::class,
        \App\Http\Responses\LoginResponse::class
    );
}

希望它能节省您的时间。

【讨论】:

    【解决方案3】:

    对于只需要自定义 JSON 响应而不是默认 {two_factor: false} 的 SPA 应用程序。

    创建一个实现 Fortify 的 LoginResponse 合约的自定义响应(在这种情况下,我将返回用户对象):

    <?php
    
    declare(strict_types=1);
    
    namespace App\Http\Responses;
    
    use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
    use Symfony\Component\HttpFoundation\Response;
    
    class LoginResponse implements LoginResponseContract
    {
        public function toResponse($request): Response
        {
            return response()->json(auth()->user());
        }
    }
    

    FortifyServiceProvider的启动方法中加入这一行:

    $this->app->singleton(LoginResponseContract::class, LoginResponse::class);
    

    确保您已正确导入命名空间:

    use App\Http\Responses\LoginResponse;
    use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
    

    如果您仍未从服务器获取 JSON,请确保您的请求具有正确的标头。它应该是一个接受application/json 的 XHR 请求。

    灵感来自 Laravel 新闻的 this 文章。

    【讨论】:

      【解决方案4】:

      在第 66 行转到 \config\fortify.php,将 home 值更改为您想要的任何路径

      'home' => '/dashboard',

      【讨论】:

        【解决方案5】:

        例如 - 登录/注销/注册后的自定义重定向。通过请求参数-别名

        在 FortifyServiceProvider 类中

        添加。

        use Laravel\Fortify\Contracts\LoginResponse;
        use Laravel\Fortify\Contracts\LogoutResponse;
        use Laravel\Fortify\Contracts\RegisterResponse;
        

        然后在注册方法中。

            $this->app->instance(LogoutResponse::class, new class implements LogoutResponse {
                public function toResponse($request)
                {
                    return redirect('/'.$request->alias);
                }
            });
        
            $this->app->instance(LoginResponse::class, new class implements LoginResponse {
                public function toResponse($request)
                {
                    return redirect()->intended('/'.$request->alias.'/admin/dashboard');
                }
            });
        
            $this->app->instance(RegisterResponse::class, new class implements RegisterResponse {
                public function toResponse($request)
                {
                    return redirect('/'.$request->alias.'/admin/dashboard');
                }
            });
        

        【讨论】:

          【解决方案6】:

          目前,Fortify 无法自定义重定向。

          这里有一个请求此行为的未解决问题:https://github.com/laravel/fortify/issues/77

          很有可能会很快添加!

          【讨论】:

            猜你喜欢
            • 2020-03-11
            • 2020-01-14
            • 2015-02-23
            • 2017-01-24
            • 2018-08-24
            • 1970-01-01
            • 2014-03-30
            • 2016-04-18
            相关资源
            最近更新 更多