Squeak.ru - шаблоны программирования

Перенаправить пользователя на одну страницу, если его аккаунт не активирован

После регистрации статус пользователя по умолчанию установлен на 0, что означает неактивен. Затем администратору необходимо одобрить (активировать) свою учетную запись, после чего он сможет открывать все остальные маршруты. Как я могу добиться этого в Laravel? Сейчас я использую промежуточное ПО:

public function handle($request, Closure $next)
    {
        if (Auth::user()->userActive == 1) {
            return $next($request);
        } else {
            return redirect('userNotActive');
        }
    }

И я добавляю его в маршрут:

Route::get('home', 'HomeController@index')->middleware('active');
Route::get('search', 'SearchController@searchFilter')->middleware('active');
Route::get('user/{id}', 'UserController@show')->middleware('active');

Но, используя это, мне нужно добавить промежуточное ПО ко всем маршрутам вручную. Есть ли способ добиться этого после входа в систему, чтобы он автоматически действовал для всех маршрутов?

13.10.2017

  • Добавить условие в контроллер авторизации? 13.10.2017
  • почему бы не использовать Route::group ? 13.10.2017

Ответы:


1

я вряд ли предлагаю вам использовать Route::group как

Route::group( ['middleware' => 'active'], function(){
    Route::get('home', 'HomeController@index');
    Route::get('search', 'SearchController@searchFilter');
    Route::get('user/{id}', 'UserController@show');
});

поэтому все, что вам нужно сделать, это добавить всю страницу, которая должна проверять, активен ли пользователь в этой группе.

13.10.2017
  • Но используя это, я получаю сообщение об ошибке Trying to get property of non-object для Auth::user()->userActive == 1, так как пользователь не вошел в систему... 13.10.2017
  • Все маршруты требуют аутентификации 13.10.2017
  • тогда почему вы получаете такую ​​​​ошибку.. Попытка получить свойство необъекта означает.. у аутентифицированного пользователя нет поля userActive.. и все.. 13.10.2017
  • Как я могу исключить маршрут входа? 13.10.2017
  • поместите его за пределы Route::group с активным промежуточным ПО 13.10.2017

  • 2

    Это возможно. Просто перезапишите метод входа в систему laravel по умолчанию в контроллере входа. Вот рабочий код одного из моих проектов laravel. Нет необходимости в промежуточном программном обеспечении

    class LoginController {
    
        public function login(Request $request)
            {
                $this->validateLogin($request);
                // If the class is using the ThrottlesLogins trait, we can automatically throttle
                // the login attempts for this application. We'll key this by the username and
                // the IP address of the client making these requests into this application.
                if ($this->hasTooManyLoginAttempts($request)) {
                    $this->fireLockoutEvent($request);
    
                    return $this->sendLockoutResponse($request);
                }
                $credentials =['email'=>$request->email, 'password'=>$request->password];
                if($this->guard()->attempt($credentials,$request->has('remember'))){
                    if(auth()->user()->active !=1){ //Account has not being activated!
                        $this->logout($request);
                        return back()
                            ->withInput()
                            ->withErrors(['email'=>'Your account is inactive. Click on the activation link sent to your account  to activate it']);
    
                    }
                    return $this->sendLoginResponse($request);
                }
                // If the login attempt was unsuccessful we will increment the number of attempts
                // to login and redirect the user back to the login form. Of course, when this
                // user surpasses their maximum number of attempts they will get locked out.
    
    
                    $this->incrementLoginAttempts($request);
    
                return $this->sendFailedLoginResponse($request);
            }
    
    }
    
    13.10.2017
  • Это не работает для меня, потому что я хочу, чтобы этот пользователь вошел в систему и остался на лезвии userNotActive, если он не активирован. Если он попытается вручную вставить маршрут в URL, например, localhost:8080/library, его нужно снова перенаправить на userNotActive. 13.10.2017

  • 3

    Есть много способов сделать это. Вы можете создавать промежуточное ПО и группировать маршруты по промежуточному ПО, вы можете добавлять роли и разрешать их по ролям, вы можете проверять ввод, все зависит от того, как вы хотите организовать или спроектировать проект. Обычно я создаю промежуточное ПО в зависимости от своих потребностей, наряду с запросами форм.

    Я бы, вероятно, реализовал ответ @Samuel James для метода входа, а для всех других конечных точек использовал запрос формы ниже. Запрос формы будет примерно таким:

    Создать формузапрос

    php artisan make:request LoginAccess
    

    и с этим файлом LoginAccess у меня будет набор правил и авторизация (думая, что модель пользователя такая же, как вы используете для аутентификации)

    public function authorize(Request $request) {
     if (Auth::user()->userActive == 1) {
            return true;
     } 
     return false;
    }
    
    public function forbiddenResponse() {
      return redirect('userNotActive');
      //return response()->view('errors.403');
    }
    
    public function rules()
    {
      return [
        //whatever rules you require, example here
        'email'      => 'required|email|unique:users,email,',
        'password'   => 'required|min:6|password|confirmed',
      ];
    }
    

    и внутри вашего контроллера вы можете использовать LoginAccess для проверки любого метода, который вам потребуется.

    public function SomeMethodThatNeedsUserLoggedInAndValidated(LoginAccess $request)
    {
    }
    
    13.10.2017

    4

    В вашем методе регистрации добавьте эту строку, чтобы войти в систему напрямую:

    if (Auth::attempt(['email' => $email, 'password' => $password])) {
            // might need to add this too:
            Auth::user()->userActive = 1;
    
            // Authentication passed... user is logged in and active
            // @TODO : return redirect to your login start page or whatever you want to handle after login
    }
    

    Ваше промежуточное ПО необходимо изменить на: (как предложил пользователь SO @Demonyowh). Это просто лучшая практика и более простая в использовании.

    Route::group( ['middleware' => 'active'], function(){
        Route::get('home', 'HomeController@index');
        Route::get('search', 'SearchController@searchFilter');
        Route::get('user/{id}', 'UserController@show');
    });
    

    Теперь, когда вы входите в свой пользователь в методе регистрации, пользователю также будет разрешен доступ ко всем маршрутам внутри промежуточного программного обеспечения active

    13.10.2017

    5

    Я новичок в Laravel, и это также предназначено для новичков. Старожилы не стесняются говорить мне, почему это плохая практика, поскольку я действительно пока не знаю ничего лучшего.

    По состоянию на 24 августа 2019 года — с использованием Laravel 5.8 — это моя личная реализация.

    Сделаны предположения:

    1. Вы начали использовать Artisan Make:Auth
    2. Вы добавили «активный» в качестве логического значения (tinyInt) в свою таблицу пользователей и обновили соответствующие модели и т. д.
    3. Вы пытаетесь помешать пользователям получить доступ к вашему приложению, когда: 'active' = 0.

    Если это так, вы можете оставить свой LoginController в покое.

    Вместо этого откройте «Illuminate/Auth/Middleware/Authenticate.php» и замените метод handle() на:

    public function handle($request, Closure $next, ...$guards)
        {
            if(!$request->user()->active){
                // you can change 'login' to whatever you need
                return redirect('login')->with($this->auth->logout());
            }
    
            $this->authenticate($request, $guards);
            return $next($request);
        }
    

    Примечание. Auth::logout() здесь не работает, но он уже загружен через конструктор в верхней части файла.

    public function __construct(Auth $auth)
        {
            $this->auth = $auth;
        }
    

    Таким образом, вы можете просто использовать $this->auth->logout(); вместо.

    Подумайте об этом. Вы можете очень легко поменять «активный» практически на любой критерий и таким же образом обновить это промежуточное программное обеспечение.

    Надеюсь это поможет!

    24.08.2019
  • Дайте развернутый ответ здесь. Поставить просто ссылку недостаточно. 25.08.2019
  • @mentallurg Хорошо, добавил детали ответа, просто не хотел дублировать без необходимости. 25.08.2019
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...