Как отключить регистрацию новых пользователей в Laravel

130

Я использую Laravel (v5).

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

Как я могу это сделать?

Милад Рахими
источник
Просто удалите методы, связанные с регистром, из файла routes.php . Не заменяйте методы пустыми - это ужасный и хакерский подход, так как вам придется повторно добавить тела, если вы решите снова включить эту функцию в будущем.
Мартин Бин,
1
@MartinBean, в котором нет маршрутов routes.php. Чтобы включить функции аутентификации, все, что вам нужно сделать, это добавить Route::auth();в файл.
miken32
@ miken32 Мой комментарий был написан более пяти месяцев назад, до того, как было предложено Route::auth()сокращение.
Мартин Бин
5
если вы используете laravel 5.5 и выше, Auth::routes(['register' => false]);в web.php
Manojkiran.A

Ответы:

237

В 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 () на: throw new Exception («Регистрация невозможна»);
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
Рафал Г.
Прежде всего, я попробовал 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отключит регистрацию пользователя.

theeternalsw0rd
источник
1
Спасибо за это, я не знаю, с какой версии он существует, но я думаю, что это правильный путь для отключения части регистрации!
Olivier Rochaix
Он был добавлен в 5.7.
Džuris 05
34

Для Laravel 5.3 и 5.4 вот правильный способ сделать это:

Вам необходимо изменить:

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

в

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

в приложении / Http / Controller / Auth / RegisterController.php

Ясин
источник
1
хорошая работа! Я думаю, что этот способ также защищает от запроса POST для создания пользователя по почте?
Гедиминас
3
это позволит увидеть страницу регистрации , который вы не хотели бы зарегистрированных пользователей
Ahmed
2
Используйте промежуточное программное обеспечение («auth»), а затем промежуточное программное обеспечение («гость»), чтобы обойти страницу регистрации для всех
user3425867
1
то в этом случае пользователь auth может зарегистрировать нового пользователя.
Мухаммад Азам
Да, это единственный правильный способ для всего, что ниже 5,7 .. как это не выбранный ответ
user3548161
31

Начиная с Laravel 5.7 вы можете передавать массив параметров в Auth::routes(). Затем вы можете отключить регистрацию маршрутов с помощью:

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

Вы можете увидеть, как это работает, из исходного кода: src / Illuminate / Routing / Router.php .

Кристофер Гири
источник
1
На мой взгляд, это правильный ответ. Отлично нашел!
Rick
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: // host_name / register перенаправляет на "/".

Способ 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') -> имя ('выход из системы');
Лучано Фантуцци
Класс перенаправления пропущен в первом методе, но изменение на $this->middleware('auth');- работает!
Гедиминас
12

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

Другая возможность - использовать routes.php и добавить эту строку:

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

Таким образом, файлы фреймворка остаются в покое, и любой запрос все равно будет перенаправлен из модуля регистрации фреймворков.

JCoolinger
источник
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 выдаст ошибку.

kjdion84
источник
^ это. Если эти маршруты когда-либо изменятся, просто скопируйте / вставьте их из пакета Auth routes, расположенного по адресу @ github.com/laravel/framework/blob/…, и закомментируйте маршруты регистрации.
пбонд 04
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

В laravel 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('/');
}

Использование Redirect :: to () дало мне ошибку:

Class 'App\Http\Controllers\Auth\Redirect' not found
ghodder
источник
Спасибо, да, это функция новой версии, вы можете использовать эту функцию или использовать предыдущий класс, но предшествующий класс требует \ перед ним, я имею в виду \ Redirect :: to ('destination');
Милад Рахими
3

В Laravel 5.4

Вы можете найти все маршруты, которые зарегистрированы Auth::routes()в классе, \Illuminate\Routing\Routerв методеauth()

это выглядит так:

/**
 * 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');
}

Просто скопируйте маршруты, которые вам нужны / нужны, и все в порядке!

bambamboole
источник
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);

\\\\\\\\\\\\\\\\\\\\ ТОЛЬКО К СВЕДЕНИЮ /////////////////////////// ////

Если вам нужно использовать множественную аутентификацию, например, создать аутентификацию для пользователей, участников, студентов, администратора и т. Д., Я советую вам проверить этот hesto / multi-auth, это отличный пакет для неограниченной аутентификации в приложениях L5.

Вы можете узнать больше о методологии Auth и связанном с ней файле в этой статье.

Мертвый парень
источник
2
Вам также необходимо исправить почтовый маршрут, чтобы избежать регистрации пользователя через почтовый запрос.
Vaishnav Mhetre 09
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

Установите значение Register route false в вашем web.php.

Auth::routes(['register' => false]);
Connectify_user
источник
0

Чтобы не слишком менять код как есть, просто создайте промежуточное программное обеспечение, чтобы определить, является ли URL-адрес запроса URL-адресом ('register'), а затем перенаправить на 404 или сделать что угодно.

Motolola
источник
1
Очень долгосрочное решение. Простое переопределение функции с прерыванием определенно может сработать.
Vaishnav Mhetre 09
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

Думаю, это было бы лучшим решением.

Переопределите следующие методы, как указано ниже в

App \ Http \ Controller \ 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> 
macalu
источник
0

Я обнаружил, что это самое простое решение в laravel 5.6! Он перенаправляет всех, кто пытается перейти на yoursite.com/register, на yoursite.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

Akula
источник
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просмотры.

Ямен Ашраф
источник
-11

Добавить

use \Redirect;

вверху файла

sjas
источник
Вы имеете в виду использование \ Redirect;
Майк Миллер
Это не полный ответ.
Мартин Бин,
вверху какого файла? решение неполное и запутанное.
Мертвый парень