【问题标题】:laravel custom auth - attempt(), sessionlaravel 自定义身份验证 - 尝试(),会话
【发布时间】:2019-07-04 20:21:56
【问题描述】:

我正在学习如何创建自定义身份验证系统。我创建了自己的后卫球员。在我的测试功能上,我正在使用尝试()来验证用户身份。检查通过。然后我创建了 test2 方法,该方法仅适用于登录用户。

我的路线是:

Route::get('test', 'MyController@test');
Route::get('test2', 'MyController@test2')->middleware('auth');

我的控制者是:

class MyController extends Controller
{
    public function test()
    {
        $cr = ['name' => 'pl', 'password' => 'pl'];

        if (Auth::guard('player')->attempt($cr)) {
            $user = Auth::guard('player')->user();
            return 'ok';
        }

        return 'not found';
    }

    public function test2()
    {
        return 'test2';
    }
}

我的守卫配置是:

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

        'player' => [
            'driver' => 'session',
            'provider' => 'player',
        ],

        'club' => [
            'driver' => 'session',
            'provider' => 'club',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],

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

        'club' => [
            'driver' => 'eloquent',
            'model' => App\Club::class,
        ],
    ],

我想在执行测试功能后手动(而不是通过重定向)访问 test2 路由,但我不能。我收到 Auth 默认登录表单。

我应该自己编写中间件还是手动设置会话?请帮忙。

【问题讨论】:

  • 你能发布“玩家”守卫配置吗?

标签: laravel authentication


【解决方案1】:

您需要编写自己的中间件,

<?php

namespace App\Http\Middleware;

use Closure;

class RedirectIfNotPlayer
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = 'player')
    {
        if(!auth()->guard($guard)->check()) {
            return redirect(url('/player/login'));
        }

        return $next($request);

    }
}

将此中间件添加到您的kernel.php 文件中,在routeMiddleware 内,

'player' => \App\Http\Middleware\RedirectIfNotPlayer::class,

然后你就可以在路由中使用你的中间件了,

Route::get('test2', 'MyController@test2')->middleware('player');

【讨论】:

  • 您的解决方案不起作用。 I当我在测试后执行 test2 路由时,我将重定向到玩家登录表单。在 test2 Auth::check() 中总是返回 false。我想知道为什么。
  • @appson 您是否按照我的建议更新了所有代码?
  • 是的。我由工匠创建了中间件,其余时间我进行了复制粘贴。我想知道为什么 Auth::check() 在 test2 中总是返回 false。
  • 它应该可以工作。您可以查看本教程以获取更多信息:scotch.io/@sukelali/…
【解决方案2】:

我建议你这样做可能是这样的工作!

public function test()
{
    $cr = ['name' => 'pl', 'password' => 'pl'];

    if (Auth::guard('player')->attempt($cr)) {
        $user = Auth::guard('player')->user();
        return 'ok';
redirect("test2(view)");
    }

【讨论】:

  • 我知道,但我不想进行重定向。我想用手做。首先我想在我的键盘上输入 test url,然后是 test2 url。
  • 是的。我正在测试不同的解决方案。
【解决方案3】:

您需要在登录成功后重定向到某个地方才能使会话持续存在。

【讨论】:

    【解决方案4】:

    auth 中间件使用你的保护:

    Route::get('test2', 'MyController@test2')->middleware('auth:player');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      相关资源
      最近更新 更多