Как создать сеанс проверки кода между контроллерами - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть 2 контроллера, которые являются Verify Controller и Register Controller. Чтобы получить доступ к странице регистрации, я добавил специальное промежуточное ПО, где супер-администратору нужно ввести код для доступа к нему, что означает, что только супер-администратор имеет доступ к форме регистрации.

Я создал форму кода подтверждения, и внутри контроллера Verify я жестко закодировал код, чтобы проверить, вводил ли пользователь тот же код. Я также создаю переменную сеанса на контроллере проверки для сохранения в случае успеха.

Как работает мой сеанс

  1. Если я go войду в superadmin / зарегистрироваться, сохраните сеанс как пустой.

  2. Если он совпадает, сохраните значение сеанса как успешное.

Проверка сеанса

Окончательно проверьте сеанс на промежуточном программном обеспечении с использованием условия if else.

  1. Если пусто, перенаправить на страницу подтверждения.
  2. Если не пусто, перенаправить на страницу регистрации и перейти к регистрации нового супер-администратора.

Проблема в том, что я все еще могу получить прямой доступ к superadmin / register. Он не перенаправляет на страницу подтверждения.

Проверка контроллера

<?php

namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Session;

class SuperAdminVerifyController extends Controller
{
    public function showVerifyForm()
    {
        return view('auth.superadmin-verify');
    }

    public function verify(Request $request)
    {
        // Validate the form data
        $this->validate($request, [
            'verifycode' => 'required'
        ]);

        $code = "123";
        $verifycode = $request->verifycode;   

        if ($code != $verifycode) 
        {
            return redirect()->back()->with('status', 'Invalid Code');
        }
        else
        { 
            Session::put('session_val', 'success');
            return redirect()->route('superadmin.register');
        }        
    }    
}

Регистрация контроллера

<?php

namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Session;
use App\Superadmin;

class SuperAdminRegisterController extends Controller
{
    public function __construct()
    {     
        $this->middleware('checksessionvar');
    }

    public function showRegisterForm()
    {      
        return view('auth.superadmin-register');
    }

    protected function register(Request $request)
    {
        $this->validate($request, [
            'name'   => 'required',
            'email' => 'required|email',
            'password' => 'required'
        ]);

        if (Superadmin::where('email', '=', $request->email)->exists()) 
        {
            return redirect()->route('superadmin.register')->with('status', "Email already exists");  
        }
        else
        {
            $admin = new Superadmin;
            $admin->name = $request->name;
            $admin->email = $request->email;
            $admin->password = Hash::make($request->password);
            $admin->save();

            Session::flush();

            return redirect()->route('superadmin.register')->with('status', "Successfull added to database. Please go to Super Admin login page.");   
        }
    }
}

Пользовательское промежуточное ПО

<?php

namespace App\Http\Middleware;

use Closure;
use Session;

class CheckSessionVariable
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $getSession = Session::get('session_val');  

        if($getSession == null)
        {
            return redirect()->route('superadmin.verify');
        }            
        else if($getSession == "success")
        {
            return $next($request);       
        }    
    }
}

Маршруты

Route::prefix('superadmin')->group(function() {        

    Route::get('/verify', 'Auth\SuperAdminVerifyController@showVerifyForm')->name('superadmin.verify');  
    Route::post('/verify', 'Auth\SuperAdminVerifyController@verify')->name('superadmin.verify.submit');

    Route::get('/register', 'Auth\SuperAdminRegisterController@showRegisterForm')->name('superadmin.register');  
    Route::post('/register', 'Auth\SuperAdminRegisterController@register')->name('superadmin.register.submit');

    Route::get('/login', 'Auth\SuperAdminLoginController@showLoginForm')->name('superadmin.login');
    Route::post('/login', 'Auth\SuperAdminLoginController@login')->name('superadmin.login.submit'); 

    Route::post('/', 'CompanyController@store_company')->name('superadmin.company.submit');      

    Route::get('/', 'SuperAdminController@index')->name('superadmin.dashboard');
    Route::get('/logout', 'Auth\SuperAdminLoginController@logout')->name('superadmin.logout');    
});

Ядро. php

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'checksessionvar' => \App\Http\Middleware\CheckSessionVariable::class,
    ];
}

1 Ответ

0 голосов
/ 11 февраля 2020

Вы, вероятно, могли бы сократить многие выполняемые в настоящее время шаги и использовать Gate в контроллере. Описанный вами сценарий аналогичен примеру, приведенному в документации :

Gate::before(function ($user, $ability) {
    if ($user->isSuperAdmin()) {
        return true;
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...