繁体   English   中英

Laravel 5.5 更改未经身份验证的登录重定向 url

[英]Laravel 5.5 change unauthenticated login redirect url

Laravel < 5.5 ,我可以更改此文件app/Exceptions/Handler以更改未经身份验证的用户重定向 url:

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

    return redirect()->guest(route('login'));
}

但在Laravel 5.5中,它已移至此位置vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php那么我现在如何更改它? 我不想更改供应商目录中的内容,以免它被作曲家更新覆盖。

protected function unauthenticated($request, AuthenticationException $exception)
{
    return $request->expectsJson()
                ? response()->json(['message' => 'Unauthenticated.'], 401)
                : redirect()->guest(route('login'));
}

但是在 Laravel 5.5 中,这已经移动到这个位置 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php 那么我现在如何更改它? 我不想更改供应商目录中的内容,以防它被作曲家更新覆盖。

只是默认情况下该功能不再存在。

您可以像在 5.4 中那样覆盖它。 只要确保包括

use Exception;
use Request;
use Illuminate\Auth\AuthenticationException;
use Response;

在处理程序文件中。

例如我的app/Exceptions/Handler.php看起来有点像这样:

<?php
    namespace App\Exceptions;
    use Exception;
    use Request;
    use Illuminate\Auth\AuthenticationException;
    use Response;
    use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
    class Handler extends ExceptionHandler
    {
        (...) // The dfault file content
        /**
         * Convert an authentication exception into a response.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Illuminate\Auth\AuthenticationException  $exception
         * @return \Illuminate\Http\Response
         */
         protected function unauthenticated($request, AuthenticationException $exception)
         {
            return $request->expectsJson()
                    ? response()->json(['message' => 'Unauthenticated.'], 401)
                    : redirect()->guest(route('authentication.index'));
    }
}

这是我解决它的方法。 在渲染函数中,我捕获了异常类。 如果它是身份验证异常类,我编写了重定向代码(我将在以前版本的未经身份验证的函数中编写的代码)。

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);
}

但是在 Laravel 5.5 中,这已经移动到这个位置 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php 那么我现在如何更改它? 我不想更改供应商目录中的内容,以防它被作曲家更新覆盖。

我们只需要包含 use Illuminate\\Auth\\AuthenticationException;

然后它就像在laravel 5.4中一样工作

对于 Laravel ( 5.4, 6, 7, 8.x )

我不想在供应商目录中进行更改,以防它被 composer updates 覆盖 您可以像在 5.4 中那样覆盖它。 只要确保包括。

文件:App\\Exceptions\\Handler.php

将此下面的code复制并粘贴到您的app\\Exception\\Handler

<?php

namespace App\Exceptions;

use Request;
use Illuminate\Auth\AuthenticationException;
use Response;

use Illuminate\Support\Arr;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param  \Throwable  $exception
     * @return void
     *
     * @throws \Exception
     */
    public function report(Throwable $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Throwable  $exception
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @throws \Throwable
     */
    public function render($request, Throwable $exception)
    {
        return parent::render($request, $exception);
    }
        protected function unauthenticated($request, AuthenticationException $exception)
    {
        // return $request->expectsJson()
        //             ? response()->json(['message' => $exception->getMessage()], 401)
        //             : redirect()->guest(route('login'));

        if($request->expectsJson()) {
            return response()->json(['message' =>  $exception->getMessage()],401);
        }

        $guard = Arr::get($exception->guards(), 0);

        switch ($guard) {
            case 'admin':
            $login = 'admin.login';
            break;
            case 'vendor':
            $login = 'vendor.login';
            break;
            
            default:
            $login = 'login';
            break;
        }

        return redirect()->guest(route($login));

    }
}

标准异常处理程序使用命名路由。

因此,您只需定义您的路线以使用该名称。

因此,在您的routes/web.php文件中,只需添加以下行:

Route::get('mylogin', 'MyLoginController@showLoginForm')->name('login');

name('login')位为该路由命名,因此未经name('login')验证的异常将使用该路由。

您无需费心制作自己的异常处理程序或修改标准异常处理程序。

样板“auth”代码使用的命名路由可以在vendor/laravel/framework/src/Illuminate/Routing/Router.php文件的auth()函数中找到。 (登录、注销、注册、password.request、password.email 和 password.reset)。 当您使用Route::auth();时会添加这些路由Route::auth(); 路由文件中的一行。

在 Laravel 的较新版本中,您应该 go 到

应用程序/Http/Middleware/Authenticate.php

现在您可以编辑 function 并将其重定向到您想要的任何位置:

protected function redirectTo($request)
{
    if (! $request->expectsJson()) {
        return route('login');
    }
}

希望能帮助到你。

只需在路由文件中添加一个用于登录的路由:

Route::get('/login', [
   'uses' => 'UserController@getSignin',
   'as' => 'login'
]);

将您的 app\\Exceptions\\Handler.php 代码替换为以下内容....

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.`enter code here`
     *
     * @param  \Exception  $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        return parent::render($request, $exception);
    }

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


        $guard = array_get($exception->guards(),0);
        switch ($guard) {
            case 'admin':
                $login = 'admin.login';
                break;

            default:
                $login = 'login';
                break;
        }

        return redirect()->guest(route($login));
    }
}

Copy this to your app\\Exception\\Handler

use Request;
use Illuminate\Auth\AuthenticationException;
use Response;

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

  $guard = array_get($exception->guards(),0);

  switch ($guard) {
    case 'admin':
        return redirect()->guest(route('admin.login'));
       break;

     default:
       return redirect()->guest(route('login'));
      break;
  }
}

对于 Laravel 7.x+

===========**top add class:**================
use Illuminate\Auth\AuthenticationException;

use Illuminate\Support\Arr;
=======================================

public function render($request, Throwable $exception)
    {
        if($exception instanceof AuthenticationException){
            $guard = Arr::get($exception->guards(), 0);
            switch($guard){
                case 'admin':
                    return redirect(route('admin.login'));
                    break;
                default:
                    return redirect(route('login'));
                    break;
            }
        }

        return parent::render($request, $exception);
    }

对于 Laravel 版本 7.*

文件:App\\Exceptions\\Handler.php

使用 Illuminate\\Support\\Arr; //顶级

使用 Illuminate\\Foundation\\Exceptions\\Handler 作为 ExceptionHandler;

公共函数渲染($request,Throwable $exception){

    // for Multi AUth guard

    if($exception instanceof AuthenticationException){
        $guard = Arr::get($exception->guards(), 0);
        switch($guard){
            case 'admin':
                return redirect(route('admin.login'));
                break;
            default:
                return redirect(route('login'));
                break;
        }
    }



    return parent::render($request, $exception);
}

除了overriding ,你可以直接作出变更Handler.php现有功能未认证的位于vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php重定向到基于后卫的去向。

/**
 * Convert an authentication exception into a response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Illuminate\Auth\AuthenticationException  $exception
 * @return \Illuminate\Http\Response
 */
protected function unauthenticated($request, AuthenticationException $exception)
{


    $guard = array_get($exception->guards(),0);
    switch ($guard) {
        case 'admin':
            return $request->expectsJson()
                        ? response()->json(['message' => $exception->getMessage()], 401)
                        : redirect()->guest(route('admin.login'));
            break;

        default:
            return $request->expectsJson()
                        ? response()->json(['message' => $exception->getMessage()], 401)
                        : redirect()->guest(route('login'));
            break;
    }
}

1.转到vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php文件。

2.搜索方法名称unauthenticated

3.并将重定向 url 从redirect()->guest(route('login'))更改为redirect()->guest(route('api/login')) //whatever you want

如果它是 API 服务,您可以将响应作为 JSON 返回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM