Як відключити реєстрацію нових користувачів у Laravel


130

Я використовую Laravel (v5).

Мені потрібен один користувач, і я це вже зареєстрував. Тепер я хочу відключити реєстрацію для нових користувачів. Звичайно, мені потрібна форма для входу.

Як я можу це зробити?


Просто видаліть методи, пов’язані з реєстром, з файлу route.php . Не перекривайте методи з порожніми - це жахливий і невдалий підхід, оскільки тоді вам доведеться повторно додавати тіла, якщо ви вирішите знову активувати цю функцію в майбутньому.
Мартін Бін

1
@MartinBean маршрутів до routes.php. Щоб увімкнути функції аутентифікації, все, що ви робите, - це додати Route::auth();у файл.
miken32

@ miken32 Мій коментар надходив понад п’ять місяців тому, перш ніж Route::auth()пропагували ярлик.
Мартін Бін

5
якщо ви знаходитесь у laravel 5.5 та вище Auth::routes(['register' => false]);в web.php
Manojkiran.A

Відповіді:


236

Laravel 5.7 представив таку функціональність:

Auth::routes(['register' => false]);

Наразі можливі варіанти:

Auth::routes([
  'register' => false, // Registration Routes...
  'reset' => false, // Password Reset Routes...
  'verify' => false, // Email Verification Routes...
]);

Для старих версій Laravel просто переосмислення showRegistrationForm()та register()методи в

  • AuthController для Laravel 5.0 - 5.4
  • Auth/RegisterController.php для Laravel 5.5
public function showRegistrationForm()
{
    return redirect('login');
}

public function register()
{

}

5
Було б розумно також змінити функцію create () на: кинути новий виняток ("Реєстрація не можлива");
JinX

2
або ви можете додати abort(404)наfunction register()
William Notowidagdo

3
Я б не виступав за такий підхід, оскільки перевантаження коду для видалення функції ніколи не є хорошою справою. Просто не реєструйте маршрути, пов’язані з реєстрацією.
Мартін Бін

4
Для Laravel 5.5 поставте цеAuth/RegisterController.php
kapoko

7
У Laravel 5.7 showRegistrationForm()функція знаходиться в vendorпапці, технічно не рекомендується редагувати файли в папці постачальника. В основному, я рекомендую видалити маршрут реєстрації з web.php. Ви можете просто сказати Auth::routes(['register' => false])у web.phpфайлі. Ура!
Ганьба Рашид

55

Якщо ви використовуєте Laravel 5.2 і встановили функцію, пов’язану з аутентифікацією, php artisan make:authтоді ваш app/Http/routes.phpфайл буде включати всі маршрути, пов’язані з автором, просто зателефонувавши Route::auth().

Метод auth () можна знайти в vendor/laravel/framework/src/Illuminate/Routing/Router.php. Отже, якщо ви хочете зробити так, як деякі люди пропонують тут, і відключити реєстрацію, видаливши небажані маршрути (можливо, хороша ідея), тоді вам доведеться скопіювати потрібні маршрути з методу auth () і ввести їх app/Http/routes.php(замінивши дзвінок на Route :: auth ()). Так, наприклад:

<?php
// This is app/Http/routes.php

// Authentication Routes...
Route::get('login', 'Auth\AuthController@showLoginForm');
Route::post('login', 'Auth\AuthController@login');
Route::get('logout', 'Auth\AuthController@logout');

// Registration Routes... removed!

// Password Reset Routes...
Route::get('password/reset/{token?}', 'Auth\PasswordController@showResetForm');
Route::post('password/email', 'Auth\PasswordController@sendResetLinkEmail');
Route::post('password/reset', 'Auth\PasswordController@reset');

Якщо ви використовуєте нижчу версію, ніж 5.2, то це, мабуть, інакше, я пам'ятаю, що речі змінилися зовсім трохи з 5,0, в якийсь момент artisan make:authнавіть було видалено IIRC.


Чи можна замість видалення маршрутів реєстрації ввімкнути їх лише для певного типу користувачів?
Sefran2

@ Sefran2 Ви можете досягти цього, об'єднавши групи з середнім програмним забезпеченням. Перевірте laravel.com/docs/5.2/routing#route-groups
Rafał G.

Перш за все, я спробував Route::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });, але коли користувач, що зареєструвався, вимагає /registerперенаправлення на нього/
Sefran2

1
@ Sefran2 Це тому, що AuthController викликає (за допомогою інших класів та ознак, це трохи заплутано) середнього програмного забезпечення App\Http\Middleware\RedirectIfAuthenticated. І це посереднє програмне забезпечення перенаправляє вас, /якщо ви вже увійшли в систему. Що має сенс, навіщо ви хочете зареєструватися, якщо ви ввійшли? :-) Якщо ви хочете дозволити деякі маршрути лише деяким типам користувачів, вам потрібно створити власне проміжне програмне забезпечення замість['middleware' => 'auth']
Rafał G.

2
Для 5.3 вони знову відрізняються, але їх все ще можна знайти у vendor / laravel / Framework / src / Illuminate / Routing / Router.php
Matthieu

51

Це може бути новим у 5.7, але тепер існує метод параметрів для методу auth. Просто змінюється

Auth::routes();

до

Auth::routes(['register' => false]);

у вашому файлі маршрутів після запуску php artisan make:authвимкнеться реєстрація користувача.


1
Дякую за це, я не знаю, з якої версії вона існує, але я вважаю, що це правильний шлях для відключення реєстраційної частини!
Олів'є Роша

Він був доданий у 5.7.
Джуріс

34

Для Laravel 5.3 і 5.4 ось правильний спосіб зробити це:

Ви повинні змінити:

public function __construct()
    {
        $this->middleware('guest');
    }

до

public function __construct()
    {
        $this->middleware('auth');
    }

у додатку / Http / Контролер / Auth / RegisterController.php


1
хороша робота! Я думаю, що цей спосіб також захищає від POST-запиту на створення користувача через пошту?
Гедімін

3
це дозволить зареєстрованим користувачам бачити сторінку реєстрації, яку ви не хотіли
ахмед

2
Використовуйте проміжне програмне забезпечення ("auth"), а потім середнє програмне забезпечення ("гість"), щоб обійти сторінку реєстрації для всіх
user3425867

1
тоді автор-автор може зареєструвати нового користувача в цьому випадку.
Мухаммед Азам

Так, це єдиний правильний спосіб для чого-небудь нижче 5.7 .. як це не обрана відповідь
user3548161

31

Станом на Laravel 5.7 ви можете передавати масив варіантів Auth::routes(). Потім ви можете відключити регістри маршрутів за допомогою:

Auth::routes(['register' => false]);

Ви можете побачити, як це працює з вихідного коду: src / Illuminate / Routing / Router.php .


1
На мою думку, це правильна відповідь. Приємно знайдено!
Рік Куйльман

26

Метод 1 для версії 5.3

У laravel 5.3 немає AuthController. щоб відключити маршрут реєстрації, слід змінити такий конструктор RegisterController:

Ви можете змінити форму:

public function __construct()
{

    $this->middleware('guest');

}

до:

use Illuminate\Support\Facades\Redirect;

public function __construct()
{

    Redirect::to('/')->send();

}

Примітка. Для використання Redirect не забудьте: user Redirect; Так користувачеві доступ до https: // імені_Хоста / зареєструвати переспрямування на "/".

Метод 2 для версії 5.3

Коли ми використовуємо php artisan make:auth, додається Auth::route(); автоматично. Перезазначте маршрут у /routes/web.php. Ви можете змінити це так: * Вам потрібно прокоментувати цей рядок:Auth::routes();

    <?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of the routes that are handled
| by your application. Just tell Laravel the URIs it should respond
| to using a Closure or controller method. Build something great!
|
*/


// Auth::routes();
Route::get('/login', 'Auth\LoginController@showLoginForm' );
Route::post('/login', 'Auth\LoginController@login');
Route::post('/logout', 'Auth\LoginController@logout');

Route::get('/home', 'HomeController@index');

Дякую! Я сподіваюся, що це може вирішити ваші проблеми.


Я б додав назви маршрутів, як зазначено в vendor / laravel / Framework / src / Illuminate / Routing / Router.php Route :: get ('login', 'Auth \ LoginController @ showLoginForm') -> name ('login'); Route :: post ('вхід', 'Auth \ LoginController @ login'); Route :: post ('вихід', 'Auth \ LoginController @ logout') -> name ('logout');
Лучано Фантуцці

Клас перенаправлення пропустив перший метод, але зміна на $this->middleware('auth');- працює!
Гедімін

12

Переписування getRegister і postRegister є складним - якщо ви використовуєте git, існує велика можливість .gitignoreвстановити ігнорувати рамкові файли, що призведе до того, що реєстрація все ще буде можливою у виробничому середовищі (якщо laravel встановлений через композитора, наприклад, )

Інша можливість - використання route.php та додавання цього рядка:

Route::any('/auth/register','HomeController@index');

Таким чином рамкові файли залишаються в спокої, і будь-який запит все одно буде переадресований від модуля регістра Frameworks.


4
Класи, що перекривають методи фреймворку, не знаходяться в рамках (вони були б у папці додатків) і зберігалися б git. Перевизначення методів не означає, що ви змінюєте їх у файлах фреймворку.
datashaman

11

AuthController.php@Limonte має переопределяется в App\Http\Controllers\Auth, а не в каталозі постачальника, тому Git не ігнорувати ці зміни.

Я додав такі функції:

public function register() {
    return redirect('/');
}

public function showRegistrationForm() {
    return redirect('/');
}

і воно працює правильно.


9

LAravel 5.6

Auth::routes([
    'register' => false, // Registration Routes...
    'reset' => false, // Password Reset Routes...
    'verify' => false, // Email Verification Routes...
]);

Це слід об'єднати у прийняту відповідь, але лише незначну корекцію. Ця функція була введена в Laravel 5.7, а не Laravel 5.6
WebSpanner

8

Ось моє рішення станом на 5.4:

//Auth::routes();
// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
//Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
//Route::post('register', 'Auth\RegisterController@register');

// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');

Зауважте, я прокоментував Auth::routes()і два маршрути реєстрації.

Важливо: ви також повинні переконатися, що ви видалили всі екземпляри route('register')вашого app.bladeмакета, інакше Laravel видасть помилку.


^ це. Якщо ці маршрути колись змінюються, просто скопіюйте їх та вставте з набору маршрутів Auth, розташованого на @ github.com/laravel/framework/blob/… та коментуйте маршрути реєстрації.
пбонд

7

Наступний метод чудово працює:

Скопіюйте всі маршрути з /vendor/laravel/framework/src/Illuminate/Routing/Router.phpі вставте їх у web.phpкоментар або видаліть Auth::routes().

Потім встановіть умовний, щоб увімкнути та вимкнути реєстрацію з .env. Скопіюйте 503.blade.phpфайл views/errorsі створіть 403 заборонено або все, що завгодно.

Додайте ALLOW_USER_REGISTRATION=до .env і керуйте реєстрацією користувача, встановивши його значення true та false.

Тепер ви повністю контролюєте маршрути, і файли постачальників залишаються недоторканими.

web.php

//Auth::routes();

// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
if (env('ALLOW_USER_REGISTRATION', true))
{
    Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
    Route::post('register', 'Auth\RegisterController@register');
}
else
{
    Route::match(['get','post'], 'register', function () {
        return view('errors.403');
    })->name('register');
}

// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');

Це поєднання деяких попередніх відповідей, зокрема Рафаля Г. та Даніеля Сентора.


6

На версії 5.6 і вище ви можете редагувати файл web.php

Auth::routes(['verify' => true, 'register' => false]);

і ти можеш зробити це правдою, якщо ти передумаєш, я це легко бачу


5

В routes.php, додайте наступний рядок:

if (!env('ALLOW_REGISTRATION', false)) {
    Route::any('/register', function() {
        abort(403);
    });
}

Тоді ви можете вибірково контролювати, чи дозволена реєстрація у вашому .envфайлі чи ні .


3

Мені довелося користуватися:

public function getRegister()
{
    return redirect('/');
}

Використання перенаправлення :: до () дало мені помилку:

Class 'App\Http\Controllers\Auth\Redirect' not found

Дякую, так, це нова функція версії, ви можете використовувати цю функцію або використовувати попередній клас, але попередній клас потребує \ перед ним, я маю на увазі \ Перенаправляти :: до ('призначення');
Мілад Рахімі

3

У Ларавелі 5.4

У методі ви можете знайти всі маршрути, які зареєстровані Auth::routes()в класі\Illuminate\Routing\Routerauth()

це виглядає приблизно так:

/**
 * Register the typical authentication routes for an application.
 *
 * @return void
 */
public function auth()
{
    // Authentication Routes...
    $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
    $this->post('login', 'Auth\LoginController@login');
    $this->post('logout', 'Auth\LoginController@logout')->name('logout');

    // Registration Routes...
    $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
    $this->post('register', 'Auth\RegisterController@register');

    // Password Reset Routes...
    $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
    $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
    $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
    $this->post('password/reset', 'Auth\ResetPasswordController@reset');
}

Просто скопіюйте потрібні / потрібні вам маршрути, і вам все добре!


2

У laravel 5.3 вам слід змінити за замовчуванням showRegistrationForm(), включивши код нижче у RegisterController.phpфайл уapp\Http\Controllers\Auth

    /**
     * Show the application registration form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showRegistrationForm()
    {
        //return view('auth.register');
         abort(404);  //this will throw a page not found exception
    }

оскільки ви не хочете дозволити реєстрацію, краще просто кинути, 404 errorщоб зловмисник знав, що він загублений. І коли ви будете готові до реєстрації у вашому додатку, //return view('auth.register');коментуйте цей коментарabort(404);

\\\\\\\\\\\\\\ " ////

Якщо вам потрібно використовувати декілька аутентифікацій, таких як створення auth для користувачів, членів, студентів, адміністратора тощо, то я раджу оформити цей hesto / multi-auth його дивовижний пакет для необмеженої кількості авторів у програмах L5.

Ви можете прочитати більше про методологію Auth та пов'язаний з нею файл у цій програмі .


2
Вам також потрібно зафіксувати маршрут пошти, щоб уникнути реєстрації користувача через поштовий запит.
Вайшнав Метре

2

В Laravel 5.5

Я намагався виконати ту саму проблему в Laravel 5.5. Замість використання Auth::routes()у файлі маршрутів web.php я включив лише маршрути входу / виходу:

Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

2

Про це згадувалося в попередніх коментарях, але я хотів би уточнити, що існує декілька способів доступу до маршрутів авторства у вашому файлі web.php у Laravel ^ 5.7. в залежності від вашої версії це може виглядати трохи інакше, але вони досягають однакового результату.

Перший варіант

Route::auth([
  'register' => false, // Registration Routes...
  'reset' => false, // Password Reset Routes...
  'verify' => false, // Email Verification Routes...
]);

Другий варіант

Auth::routes([
  'register' => false, // Registration Routes...
  'reset' => false, // Password Reset Routes...
  'verify' => false, // Email Verification Routes...
]);

1

Встановіть Зареєструвати помилковий маршрут у вашій веб.php.

Auth::routes(['register' => false]);

0

Щоб не надто змінити код таким, який він є, просто створіть проміжне програмне забезпечення, щоб визначити, чи є URL-адреса запиту URL ("зареєструватися"), а потім переспрямуйте на 404 або зробіть куди завгодно.


1
Дуже довгострокове рішення. Проста функція, що перекриває аборт, безумовно може спрацювати.
Вайшнав Метре

0

В Laravel 5.5

Робота над подібною проблемою та встановлення аргументу проміжного програмного забезпечення від гостя до "auth" здавалося більш елегантним рішенням.

Редагувати файл: app-> http-> Controllers-> Auth-> RegisterController.php

public function __construct()
{
     //replace this
     //$this->middleware('guest');

     //with this argument.
       $this->middleware('auth');
}

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


Мені буде цікаво дізнатися, чи може користувач зареєструватися кілька разів за допомогою цього методу. guestпроміжний шар відповідає перенаправлення вже зареєстрований користувач від сторінки , що тільки доступ гостя може (тобто /registerсторінка)
Кінглі

0

Я думаю, що це було б краще рішення.

Замініть такі методи, як зазначено нижче в

Додаток \ Http \ Контролер \ Auth \ RegisterController.php

use Illuminate\Http\Response;

.
.
.

public function showRegistrationForm()
{
    abort(Response::HTTP_NOT_FOUND);
}

public function register(Request $request)
{
    abort(Response::HTTP_NOT_FOUND);
}

0

У Laravel 5.5 дуже просто, якщо ви використовуєте систему маршрутів CRUD.

Перейдіть до app/http/controllers/RegisterController простору імен:Illuminate\Foundation\Auth\RegistersUser

Вам потрібно перейти до RegistersUser: Illuminate\Foundation\Auth\RegistersUser

Існує спосіб виклику showRegistrationFormзмінити це: return view('auth.login');для цього: return redirect()->route('auth.login');і видалити з вашої сторінки леза реєстр маршрутних викликів. Це може виглядати так:

 <li role="presentation">
     <a class="nav-link" href="{{ route('register') }}">Register</a>
 </li> 

0

Я знайшов це найпростішим рішенням у laravel 5.6! Він переспрямовує всіх, хто намагається перейти на сайт yourite.com/register на сайт yourite.com

маршрути / web.php

// redirect from register page to home page
Route::get('/register', function () {
    return redirect('/');
});

0

Все, що я зробив, було замінити реєстраційний код леза на код леза входу. Таким чином реєстр все ще йде на вхід.

resources/views/auth/register.blade.php замінюється на resources/views/auth/login.blade.php


0

Для Laravel 5.6+ вставте наведені нижче методи app\Http\Controller\Auth\RegisterController

/*
* Disabling registeration.
*
*/
public function register() 
{
    return redirect('/');
}

/*
* Disabling registeration.
*
*/
public function showRegistrationForm() 
{
    return redirect('/');
}

Тепер ви переосмислюєте ці методи в RegistersUserознаці кожного разу, коли передумаєте, видаліть ці методи. Ви також можете коментувати посилання на регістри welcome.blade.phpта login.blade.phpперегляди.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.