首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >采用Jetstream直播线的Laravel 8多个8月

采用Jetstream直播线的Laravel 8多个8月
EN

Stack Overflow用户
提问于 2020-12-30 22:41:41
回答 2查看 5.9K关注 0票数 1

我试图在laravel 8中安装一个多个auth系统,在我的ecomm项目中使用jetstream livewire (一个用于管理员的登录页面(/ admin /login ),另一个用于用户(/login)),我遵循了一个教程,当我从/login页面登录到用户时,一切都很好,我可以与该用户一起访问/管理/管理/仪表板,以及它的良好和无法访问的用户/dashboard。

routes\web.php

代码语言:javascript
复制
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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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);
    }
}

Responses\LoginResponse.php

代码语言:javascript
复制
<?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中创建了一个App\Guards\AdminStatefulGuard.php副本,但从未使用过。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-06 21:46:18

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

代码语言:javascript
复制
public function __construct()
    {
        $this->middleware(['auth:admin,admin', 'verified']);
    }

并且在网络路由中也替换了这一点:

代码语言:javascript
复制
Route::middleware(['auth:sanctum,admin', 'verified'])->get('/admin/dashboard', function () {
    return view('admin.index');
})->name('dashboard.admin');

在这方面:

代码语言:javascript
复制
Route::middleware(['auth:admin,admin', 'verified'])->get('/admin/dashboard', function () {
    return view('admin.index');
})->name('dashboard.admin');
票数 0
EN

Stack Overflow用户

发布于 2022-02-04 02:59:41

在管理中间件上试一试

代码语言:javascript
复制
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中间件上:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65514452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档