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.
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ść:
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.
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.
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:
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.
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.
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()
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
*/publicfunction 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.
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.
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.
publicfunction __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)
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:
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 pageRoute::get('/register',function(){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.
routes.php
. Aby włączyć funkcje uwierzytelniania, wystarczy dodaćRoute::auth();
do pliku.Route::auth()
skrót.Auth::routes(['register' => false]);
w web.phpOdpowiedzi:
Laravel 5.7 wprowadził następującą funkcjonalność:
Obecnie możliwe opcje to:
W przypadku starszych wersji Laravela po prostu zastąp
showRegistrationForm()
iregister()
metody wAuthController
dla Laravel 5.0 - 5.4Auth/RegisterController.php
dla Laravel 5.5źródło
abort(404)
nafunction register()
Auth/RegisterController.php
showRegistrationForm()
funkcja znajduje się wvendor
folderze, z technicznego punktu widzenia nie zaleca się edytowania plików w folderze dostawcy. Zasadniczo polecam usunięcie rejestracji trasy zweb.php
. Możesz po prostu powiedziećAuth::routes(['register' => false])
wweb.php
pliku. Twoje zdrowie!Jeśli używasz Laravel 5.2 i zainstalowałeś funkcję związaną z uwierzytelnianiem,
php artisan make:auth
twójapp/Http/routes.php
plik 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ć jeapp/Http/routes.php
(zastępując wywołanie Route :: auth ()). Na przykład: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:auth
został nawet usunięty IIRC.źródło
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/
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']
To może być nowość w 5.7, ale jest teraz tablica opcji dla metody auth. Po prostu się zmienia
do
w pliku tras po uruchomieniu
php artisan make:auth
wyłączy rejestrację użytkownika.źródło
W przypadku Laravel 5.3 i 5.4, oto właściwy sposób:
Musisz się zmienić:
do
w aplikacji / Http / Controller / Auth / RegisterController.php
źródło
Od Laravel 5.7 możesz przekazać szereg opcji do
Auth::routes()
. Następnie możesz wyłączyć rejestrowanie tras za pomocą:Możesz zobaczyć, jak to działa z kodu źródłowego: src / Illuminate / Routing / Router.php .
źródło
Metoda 1 dla wersji 5.3
W laravel 5.3 nie ma AuthController. aby wyłączyć rejestrację trasy, należy zmienić w konstruktorze w
RegisterController
ten sposób:Możesz zmienić formę:
do:
Uwaga: aby użyć
Redirect
, nie zapomnij ouser 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 dodawanyAuth::route();
automatycznie. Zastąp trasę w /routes/web.php. Możesz to zmienić tak: * musisz skomentować tę linię:Auth::routes();
Dzięki! Mam nadzieję, że to rozwiąże Twoje problemy.
źródło
$this->middleware('auth');
- działa!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:
W ten sposób pliki frameworka są pozostawione same, a każde żądanie nadal będzie przekierowywane z modułu rejestru Frameworks.
źródło
AuthController.php
@Limonte ma przesłonięte jestApp\Http\Controllers\Auth
, a nie w katalogu dostawcy, więc Git nie ignorować tej zmiany.Dodałem te funkcje:
i działa poprawnie.
źródło
LAravel 5.6
źródło
Oto moje rozwiązanie z 5.4:
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 swoimapp.blade
układzie, w przeciwnym razie Laravel wyświetli błąd.źródło
Następująca metoda działa świetnie:
Skopiuj wszystkie trasy z
/vendor/laravel/framework/src/Illuminate/Routing/Router.php
i wklej jeweb.php
i skomentuj lub usuńAuth::routes()
.Następnie ustaw warunek, aby włączyć i wyłączyć rejestrację z .env. Zduplikuj
503.blade.php
plik wviews/errors
i 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
Jest to połączenie kilku wcześniejszych odpowiedzi, w szczególności Rafała G. i Daniela Centore.
źródło
Na laravel 5.6 i nowszych możesz edytować w pliku web.php
i możesz to zrobić, jeśli zmienisz zdanie, widzę to w ten sposób łatwe
źródło
W
routes.php
, po prostu dodaj następujące informacje:Następnie możesz wybiórczo kontrolować, czy rejestracja jest dozwolona, czy nie
.env
.źródło
Musiałem użyć:
Użycie Redirect :: to () spowodowało błąd:
źródło
W Laravel 5.4
Możesz znaleźć wszystkie trasy zarejestrowane
Auth::routes()
w klasie\Illuminate\Routing\Router
w metodzieauth()
To wygląda tak:
Po prostu skopiuj trasy, które chcesz / potrzebujesz i wszystko jest w porządku!
źródło
W laravel 5.3 powinieneś nadpisać domyślne
showRegistrationForm()
, włączając poniższy kod doRegisterController.php
pliku wapp\Http\Controllers\Auth
ponieważ nie chcesz zezwalać na rejestrację, lepiej po prostu rzucić,
404 error
aby 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.
źródło
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:źródło
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
Druga opcja
źródło
źródło
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.
źródło
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
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.
źródło
guest
middleware jest odpowiedzialny przekierowanie już zalogowany użytkownik od strony, że tylko dostęp może gość (czyli/register
strona)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
źródło
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
showRegistrationForm
zmień 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:źródło
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
źródło
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 przezresources/views/auth/login.blade.php
źródło
W przypadku Laravel 5.6+ wklej poniższe metody w
app\Http\Controller\Auth\RegisterController
Teraz zastępujesz te metody w ramach
RegistersUser
cechy, gdy zmienisz zdanie, usuń te metody. Możesz także komentować linki rejestruwelcome.blade.php
ilogin.blade.php
widoki.źródło
Dodaj
u góry pliku
źródło