【问题标题】:Laravel 8 Multi Auth with Jetstream livewireLaravel 8 Multi Auth with Jetstream livewire
【发布时间】:2021-04-07 09:35:13
【问题描述】:

我试图在我的 ecomm 项目中使用 jetstream livewire 在 laravel 8 中设置多身份验证系统(一个用于管理员的登录页面(/admin/login)和另一个用于用户的登录页面(/login)) 我已经按照教程进行操作,一切正常,当我从 /login 页面登录到用户时,我可以使用该用户访问 /admin/dashboard,并且使用 admin 可以访问用户 /dashboard

routes\web.php

Route::get('/', function () {
    return view('welcome');
});

Route::group(['prefix'=>'admin','middleware'=>['admin:admin']],function(){
    Route::get('/login', [AdminController::class, 'loginForm']);
    Route::post('/login', [AdminController::class, 'store'])->name('admin.login');
    Route::get('/logout', [AdminController::class, 'Logout'])->name('admin.logout');
});

Route::middleware(['auth:sanctum,admin', 'verified'])->get('/admin/dashboard', function () {
    return view('admin.index');
})->name('dashboard.admin');


Route::middleware(['auth:sanctum,web', 'verified'])->get('/dashboard', function () {
    return view('dashboard');
})->name('dashboard');

Models\Admin.php

<?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;
use Laravel\Fortify\TwoFactorAuthenticatable;
use Laravel\Jetstream\HasProfilePhoto;
use Laravel\Sanctum\HasApiTokens;

class Admin extends Authenticatable
{
    use HasApiTokens;
    use HasFactory;
    use HasProfilePhoto;
    use Notifiable;
    use TwoFactorAuthenticatable;

    /**
     * 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',
        'two_factor_recovery_codes',
        'two_factor_secret',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /**
     * The accessors to append to the model's array form.
     *
     * @var array
     */
    protected $appends = [
        'profile_photo_url',
    ];
}

Controllers\AdminController.php

<?php



namespace App\Http\Controllers;

use Illuminate\Contracts\Auth\StatefulGuard;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Routing\Pipeline;
use App\Actions\Fortify\AttemptToAuthenticate;
use Laravel\Fortify\Actions\EnsureLoginIsNotThrottled;
use Laravel\Fortify\Actions\PrepareAuthenticatedSession;
use App\Actions\Fortify\RedirectIfTwoFactorAuthenticatable;
use App\Http\Responses\LoginResponse;
use Laravel\Fortify\Contracts\LoginViewResponse;
use Laravel\Fortify\Contracts\LogoutResponse;
use Laravel\Fortify\Features;
use Laravel\Fortify\Fortify;
use Laravel\Fortify\Http\Requests\LoginRequest;
use Auth;


class AdminController extends Controller
{
    /**
     * The guard implementation.
     *
     * @var \Illuminate\Contracts\Auth\StatefulGuard
     */
    protected $guard;

    /**
     * Create a new controller instance.
     *
     * @param \Illuminate\Contracts\Auth\StatefulGuard
     * @return void
     */
    public function __construct(StatefulGuard $guard, Request $request)
    {
        $this->guard = $guard;
    }


    public function loginForm(){
        return view('admin.login',['guard'=>'admin']);
    }

    public function Logout(){
        Auth::logout();
        return Redirect()->url('admin/login')->with('success', 'Logged Out');
    }



    /**
     * Show the login view.
     *
     * @param \Illuminate\Http\Request $request
     * @return \Laravel\Fortify\Contracts\LoginViewResponse
     */
    public function create(Request $request): LoginViewResponse
    {
        return app(LoginViewResponse::class);
    }

    /**
     * Attempt to authenticate a new session.
     *
     * @param \Laravel\Fortify\Http\Requests\LoginRequest $request
     * @return mixed
     */
    public function store(LoginRequest $request)
    {
        return $this->loginPipeline($request)->then(function ($request) {
            return app(LoginResponse::class);
        });
    }

    /**
     * Get the authentication pipeline instance.
     *
     * @param \Laravel\Fortify\Http\Requests\LoginRequest $request
     * @return \Illuminate\Pipeline\Pipeline
     */
    protected function loginPipeline(LoginRequest $request)
    {
        if (Fortify::$authenticateThroughCallback) {
            return (new Pipeline(app()))->send($request)->through(array_filter(
                call_user_func(Fortify::$authenticateThroughCallback, $request)
            ));
        }

        if (is_array(config('fortify.pipelines.login'))) {
            return (new Pipeline(app()))->send($request)->through(array_filter(
                config('fortify.pipelines.login')
            ));
        }

        return (new Pipeline(app()))->send($request)->through(array_filter([
            config('fortify.limiters.login') ? null : EnsureLoginIsNotThrottled::class,
            Features::enabled(Features::twoFactorAuthentication()) ? RedirectIfTwoFactorAuthenticatable::class : null,
            AttemptToAuthenticate::class,
            PrepareAuthenticatedSession::class,
        ]));
    }

    /**
     * Destroy an authenticated session.
     *
     * @param \Illuminate\Http\Request $request
     * @return \Laravel\Fortify\Contracts\LogoutResponse
     */
    public function destroy(Request $request): LogoutResponse
    {
        $this->guard->logout();

        $request->session()->invalidate();

        $request->session()->regenerateToken();

        return app(LogoutResponse::class);
    }
}

响应\LoginResponse.php

<?php

namespace App\Http\Responses;

use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;

class LoginResponse implements LoginResponseContract
{
    /**
     * Create an HTTP response that represents the object.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function toResponse($request)
    {
        return $request->wantsJson()
            ? response()->json(['two_factor' => false])
            : redirect()->intended('admin/dashboard');
    }
}

我还按照该教程在 App\Guards\AdminStatefulGuard.php 中创建了 StatefulGuard 的副本,但从未使用过。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    通过将此代码添加到我的管理控制器来解决问题。

    public function __construct()
        {
            $this->middleware(['auth:admin,admin', 'verified']);
        }
    
    

    并在网络路由中替换它:

    Route::middleware(['auth:sanctum,admin', 'verified'])->get('/admin/dashboard', function () {
        return view('admin.index');
    })->name('dashboard.admin');
    

    用这个:

    Route::middleware(['auth:admin,admin', 'verified'])->get('/admin/dashboard', function () {
        return view('admin.index');
    })->name('dashboard.admin');
    

    【讨论】:

    • 你在哪里找到在 laravel 8 中创建多重身份验证的教程?我找到的所有教程都来自 5.8
    • @elgranchuchu link 这是我找到的教程
    • @elgranchuchu 你也可以在这里找到这个教程 [链接] (webdevtrainee.com/post/laravel-jetstream-multi-auth) 教程下面还有一个视频
    【解决方案2】:

    在管理中间件上试试这个

    public function handle(Request $request, Closure $next, $guard)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/admin/dashboard');
        }
    
        if(Auth::guard('web')->check()) {
            return redirect('/dashboard');
        }
    
        return $next($request);
    }
    

    在 RedirectIfAuthenticated 中间件上:

    public function handle(Request $request, Closure $next, ...$guards)
    {
    
        $guards = empty($guards) ? [null] : $guards;
    
        foreach ($guards as $guard) {
    
            if (Auth::guard($guard)->check()) {
                return redirect(RouteServiceProvider::HOME);
            }
        }
        
        if(Auth::guard('admin')->check()) {
            return redirect('admin/dashboard');
        }
    
    
        return $next($request);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2021-09-18
      • 2021-12-20
      • 2021-01-20
      • 2021-03-05
      • 1970-01-01
      相关资源
      最近更新 更多