Jak wyłączyć rejestrację nowych użytkowników w Laravel


130

Używam Laravel (v5).

Potrzebuję jednego użytkownika i już go zarejestrowałem. Teraz chcę wyłączyć rejestrację dla nowych użytkowników. Oczywiście do działania potrzebuję formularza logowania.

Jak mogę to zrobić?


Po prostu usuń metody związane z rejestrem z pliku Routes.php . Nie zastępuj metod pustymi - jest to okropne i hakerskie podejście, ponieważ musisz ponownie dodać ciała, jeśli zdecydujesz się ponownie włączyć tę funkcję w przyszłości.
Martin Bean

1
@MartinBean nie ma tras w routes.php. Aby włączyć funkcje uwierzytelniania, wystarczy dodać Route::auth();do pliku.
miken32

@ miken32 Mój komentarz pochodzi sprzed ponad pięciu miesięcy, zanim zalecono Route::auth()skrót.
Martin Bean

5
jeśli jesteś w laravel 5.5 lub nowszym Auth::routes(['register' => false]);w web.php
Manojkiran.

Odpowiedzi:


235

Laravel 5.7 wprowadził następującą funkcjonalność:

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

Obecnie możliwe opcje to:

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

W przypadku starszych wersji Laravela po prostu zastąp showRegistrationForm()i register()metody w

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

public function register()
{

}

5
Warto również zmienić funkcję create () na: zgłoszenie nowego wyjątku („Rejestracja niemożliwa”);
JinX

2
Można też dodać abort(404)nafunction register()
William Notowidagdo

3
Nie zalecałbym tego podejścia, ponieważ przeciążanie kodu w celu usunięcia funkcji nigdy nie jest dobrą rzeczą. Po prostu nie rejestruj tras związanych z rejestracją.
Martin Bean

4
W przypadku Laravel 5.5, umieść toAuth/RegisterController.php
kapoko

7
W Laravel 5.7 showRegistrationForm()funkcja znajduje się w vendorfolderze, z technicznego punktu widzenia nie zaleca się edytowania plików w folderze dostawcy. Zasadniczo polecam usunięcie rejestracji trasy z web.php. Możesz po prostu powiedzieć Auth::routes(['register' => false])w web.phppliku. Twoje zdrowie!
Ahamed Rasheed

55

Jeśli używasz Laravel 5.2 i zainstalowałeś funkcję związaną z uwierzytelnianiem, php artisan make:authtwój app/Http/routes.phpplik będzie zawierał wszystkie trasy związane z uwierzytelnianiem, po prostu wywołującRoute::auth() .

Metodę auth () można znaleźć w vendor/laravel/framework/src/Illuminate/Routing/Router.php. Więc jeśli chcesz zrobić to, co niektórzy sugerują tutaj i wyłączyć rejestrację, usuwając niechciane trasy (prawdopodobnie dobry pomysł), musisz skopiować trasy, które nadal chcesz z metody auth () i wstawić je app/Http/routes.php(zastępując wywołanie Route :: auth ()). Na przykład:

<?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');

Jeśli używasz niższej wersji niż 5.2, to prawdopodobnie jest inaczej, pamiętam, że rzeczy się trochę zmieniły od 5.0, w pewnym momencie artisan make:authzostał nawet usunięty IIRC.


Czy zamiast usuwać trasy rejestracji można je włączyć tylko dla określonego typu użytkowników?
Sefran2

@ Sefran2 Możesz to osiągnąć, kojarząc grupy z oprogramowaniem pośredniczącym. Zobacz laravel.com/docs/5.2/routing#route-groups
Rafał G.

Przede wszystkim próbowałem Route::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });, ale kiedy zalogowany użytkownik żąda /register, jest przekierowywany na/
Sefran2

1
@ Sefran2 Dzieje się tak, ponieważ AuthController wywołuje (za pośrednictwem innych klas i cech, jest to trochę zawiłe) oprogramowanie pośredniczące App\Http\Middleware\RedirectIfAuthenticated. A to oprogramowanie pośredniczące przekierowuje Cię na stronę, /jeśli jesteś już zalogowany. Co ma sens, dlaczego miałbyś się rejestrować, skoro jesteś zalogowany? :-) Jeśli chcesz dopuścić tylko niektóre trasy do niektórych typów użytkowników, musisz zamiast tego stworzyć własne oprogramowanie pośredniczące['middleware' => 'auth']
Rafał G.

2
W przypadku wersji 5.3 znów są inne, ale nadal można je znaleźć w vendor / laravel / framework / src / Illuminate / Routing / Router.php
Matthieu

51

To może być nowość w 5.7, ale jest teraz tablica opcji dla metody auth. Po prostu się zmienia

Auth::routes();

do

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

w pliku tras po uruchomieniu php artisan make:authwyłączy rejestrację użytkownika.


1
Dzięki za to, nie wiem od której wersji istnieje, ale myślę, że to dobra ścieżka do wyłączenia części rejestracyjnej!
Olivier Rochaix

Został dodany w 5.7.
Džuris

34

W przypadku Laravel 5.3 i 5.4, oto właściwy sposób:

Musisz się zmienić:

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

do

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

w aplikacji / Http / Controller / Auth / RegisterController.php


1
dobra robota! Myślę, że w ten sposób również chroni przed żądaniem POST tworzenia użytkownika za pośrednictwem poczty?
Gediminas

3
Pozwoli to zarejestrowanym użytkownikom zobaczyć stronę rejestracji, której nie chcesz
ahmed

2
Użyj oprogramowania pośredniego („auth”), a następnie oprogramowania pośredniego („guest”), aby ominąć stronę rejestracji dla wszystkich
user3425867

1
w takim przypadku użytkownik autoryzacji może zarejestrować nowego użytkownika.
Muhammad Azam

Tak, to jedyny właściwy sposób na wszystko poniżej 5,7 ... dlaczego to nie jest wybrana odpowiedź
user3548161


26

Metoda 1 dla wersji 5.3

W laravel 5.3 nie ma AuthController. aby wyłączyć rejestrację trasy, należy zmienić w konstruktorze w RegisterControllerten sposób:

Możesz zmienić formę:

public function __construct()
{

    $this->middleware('guest');

}

do:

use Illuminate\Support\Facades\Redirect;

public function __construct()
{

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

}

Uwaga: aby użyć Redirect , nie zapomnij o user Redirect; dostępie użytkownika do https: // nazwa_hosta / register to przekierowanie do "/".

Metoda 2 dla wersji 5.3

Kiedy używamy php artisan make:auth, jest dodawany Auth::route(); automatycznie. Zastąp trasę w /routes/web.php. Możesz to zmienić tak: * musisz skomentować tę linię: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');

Dzięki! Mam nadzieję, że to rozwiąże Twoje problemy.


Dodałbym nazwy tras, takie jak określone w vendor / laravel / framework / src / Illuminate / Routing / Router.php Route :: get ('login', 'Auth \ LoginController @ showLoginForm') -> name ('login'); Route :: post ('login', 'Auth \ LoginController @ login'); Route :: post ('logout', 'Auth \ LoginController @ logout') -> name ('logout');
Luciano Fantuzzi

W pierwszej metodzie brakowało klasy przekierowania, ale zmiana na $this->middleware('auth');- działa!
Gediminas

12

Nadpisywanie getRegister i postRegister jest trudne - jeśli używasz git, istnieje duże prawdopodobieństwo, że .gitignore jest ustawione na ignorowanie plików frameworka, co doprowadzi do tego, że rejestracja będzie nadal możliwa w twoim środowisku produkcyjnym (jeśli laravel jest zainstalowany na przykład przez Composer) )

Inną możliwością jest użycie Routes.php i dodanie tej linii:

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

W ten sposób pliki frameworka są pozostawione same, a każde żądanie nadal będzie przekierowywane z modułu rejestru Frameworks.


4
Klasy, które zastępują metody struktury, nie znajdują się w strukturze (znajdowałyby się w folderze aplikacji) i byłyby przechowywane przez git. Zastępowanie metod nie oznacza zmiany ich w plikach struktury.
datashaman

11

AuthController.php@Limonte ma przesłonięte jest App\Http\Controllers\Auth, a nie w katalogu dostawcy, więc Git nie ignorować tej zmiany.

Dodałem te funkcje:

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

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

i działa poprawnie.


9

LAravel 5.6

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

Powinno to zostać włączone do zaakceptowanej odpowiedzi, ale tylko niewielka korekta. Ta funkcja została wprowadzona w Laravel 5.7, a nie Laravel 5.6
WebSpanner

8

Oto moje rozwiązanie z 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');

Zauważ, że zakomentowałem Auth::routes()i dwie drogi rejestracji.

Ważne: musisz również upewnić się, że usunąłeś wszystkie wystąpienia programu route('register')w swoim app.bladeukładzie, w przeciwnym razie Laravel wyświetli błąd.


^ to. Jeśli te trasy kiedykolwiek się zmienią, po prostu skopiuj / wklej je z pakietu tras uwierzytelniania znajdującego się @ github.com/laravel/framework/blob/ ... i zakomentuj trasy rejestracji.
pbond

7

Następująca metoda działa świetnie:

Skopiuj wszystkie trasy z /vendor/laravel/framework/src/Illuminate/Routing/Router.phpi wklej je web.phpi skomentuj lub usuń Auth::routes().

Następnie ustaw warunek, aby włączyć i wyłączyć rejestrację z .env. Zduplikuj 503.blade.phpplik w views/errorsi utwórz zabroniony kod 403 lub cokolwiek chcesz.

Dodaj ALLOW_USER_REGISTRATION=do .env i kontroluj rejestrację użytkownika, ustawiając jej wartość na true lub false.

Teraz masz pełną kontrolę nad trasami, a pliki dostawców pozostają nietknięte.

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');

Jest to połączenie kilku wcześniejszych odpowiedzi, w szczególności Rafała G. i Daniela Centore.


6

Na laravel 5.6 i nowszych możesz edytować w pliku web.php

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

i możesz to zrobić, jeśli zmienisz zdanie, widzę to w ten sposób łatwe


5

W routes.php, po prostu dodaj następujące informacje:

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

Następnie możesz wybiórczo kontrolować, czy rejestracja jest dozwolona, ​​czy nie .env.


3

Musiałem użyć:

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

Użycie Redirect :: to () spowodowało błąd:

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

Dziękuję, tak to jest funkcja nowej wersji, możesz użyć tej funkcji lub użyć poprzedniej klasy, ale poprzednia klasa wymaga \ przed nią, to znaczy \ Redirect :: to ('destination');
Milad Rahimi

3

W Laravel 5.4

Możesz znaleźć wszystkie trasy zarejestrowane Auth::routes()w klasie\Illuminate\Routing\Router w metodzieauth()

To wygląda tak:

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

Po prostu skopiuj trasy, które chcesz / potrzebujesz i wszystko jest w porządku!


2

W laravel 5.3 powinieneś nadpisać domyślne showRegistrationForm(), włączając poniższy kod do RegisterController.phppliku wapp\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
    }

ponieważ nie chcesz zezwalać na rejestrację, lepiej po prostu rzucić, 404 erroraby intruz wiedział, że się zgubił. A kiedy będziesz gotowy do rejestracji w aplikacji, odkomentuj //return view('auth.register');i skomentujabort(404);

\\\\\\\\\\\\\\\\\\\\ JUST AN FYI ///////////////////////////// ////

Jeśli potrzebujesz wielu uwierzytelnień, takich jak tworzenie uwierzytelniania dla użytkowników, członków, studentów, administratora itp., Radzę sprawdzić ten hesto / multi-auth, to niesamowity pakiet do nieograniczonej liczby autoryzacji w aplikacjach L5.

Możesz przeczytać więcej o metodologii uwierzytelniania i związanym z nią pliku w tym artykule.


2
Musisz również poprawić trasę poczty, aby uniknąć rejestracji użytkownika za pośrednictwem żądania pocztowego.
Vaishnav Mhetre

2

W Laravel 5.5

Próbowałem rozwiązać ten sam problem w Laravel 5.5. Zamiast używać Auth::routes()w pliku tras web.php, dołączyłem tylko trasy logowania / wylogowania:

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

2

Wspomniano o tym we wcześniejszych komentarzach, ale chciałbym wyjaśnić, że istnieje wiele sposobów uzyskania dostępu do tras uwierzytelniania w pliku web.php w Laravel ^ 5.7. w zależności od wersji może wyglądać trochę inaczej, ale dają ten sam efekt.

Pierwsza opcja

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

Druga opcja

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


0

Aby nie zmieniać kodu tak, jak jest, po prostu utwórz oprogramowanie pośredniczące, które wykryje, czy adres URL żądania to url („rejestr”), a następnie przekieruj na 404 lub zrób gdziekolwiek.


1
Rozwiązanie bardzo długoterminowe. Prosta funkcja nadpisania abort z pewnością może zadziałać.
Vaishnav Mhetre

0

W Laravel 5.5

Praca nad podobnym problemem i ustawienie argumentu oprogramowania pośredniego z gościa na „auth” wydawało się bardziej eleganckim rozwiązaniem.

Edytuj plik: app-> http-> Controllers-> Auth-> RegisterController.php

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

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

Mogę się jednak mylić ... ale wydaje się to bardziej sprytne niż edytowanie tras z większą liczbą linii i mniejszą głupotą niż zwykłe przekierowanie strony ... przynajmniej w tym przypadku, chęć zablokowania rejestracji dla gości.


Byłbym ciekawy, czy użytkownik może zarejestrować się wiele razy przy użyciu tej metody. guestmiddleware jest odpowiedzialny przekierowanie już zalogowany użytkownik od strony, że tylko dostęp może gość (czyli /registerstrona)
Kingsley

0

Myślę, że byłoby to raczej lepsze rozwiązanie.

Zastąp następujące metody, jak opisano poniżej w

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

W Laravel 5.5 jest to bardzo proste, jeśli używasz systemu tras CRUD.

Idź do app/http/controllers/RegisterController przestrzeni nazw:Illuminate\Foundation\Auth\RegistersUser

Musisz udać się do RegistersUser: Illuminate\Foundation\Auth\RegistersUser

Istnieje wywołanie metody showRegistrationFormzmień to: return view('auth.login');w tym celu: return redirect()->route('auth.login');i usuń z ciebie rejestr wywołań trasy strony bloku. Może to wyglądać tak:

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

0

Okazało się, że jest to najłatwiejsze rozwiązanie w programie Laravel 5.6! Przekierowuje każdego, kto próbuje wejść na twojawitryna.com/register do twojawitryna.com

route / web.php

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

0

Wszystko, co zrobiłem, to zastąpienie kodu rejestru kasetowego kodem logowania. W ten sposób rejestr nadal przechodzi do logowania.

resources/views/auth/register.blade.php jest zastępowany przez resources/views/auth/login.blade.php


0

W przypadku Laravel 5.6+ wklej poniższe metody w app\Http\Controller\Auth\RegisterController

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

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

Teraz zastępujesz te metody w ramach RegistersUsercechy, gdy zmienisz zdanie, usuń te metody. Możesz także komentować linki rejestru welcome.blade.phpi login.blade.phpwidoki.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.