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ć?

Milad Rahimi
źródło
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()
{

}
Limon Monte
źródło
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.

Rafał G.
źródło
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.

theeternalsw0rd
źródło
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

Yassin
źródło
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
31

Od Laravel 5.7 możesz przekazać szereg opcji do Auth::routes(). Następnie możesz wyłączyć rejestrowanie tras za pomocą:

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

Możesz zobaczyć, jak to działa z kodu źródłowego: src / Illuminate / Routing / Router.php .

Christopher Geary
źródło
1
Moim zdaniem jest to poprawna odpowiedź. Dobrze znalezione!
Rick Kuilman
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.

Phanith Kung
źródło
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.

JCoolinger
źródło
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.

Jesús Amieiro
źródło
9

LAravel 5.6

Auth::routes([
    'register' => false, // Registration Routes...
    'reset' => false, // Password Reset Routes...
    'verify' => false, // Email Verification Routes...
]);
Isaac Limón
źródło
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.

kjdion84
źródło
^ 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.

Jeffrey
źródło
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

Sajjad Aljileezi
źródło
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.

Daniel Centore
źródło
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
ghodder
źródło
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!

bambamboole
źródło
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.

The Dead Guy
źródło
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');
David Angel
źródło
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...
]);
Edvard Åkerberg
źródło
1

Ustaw Register route na false w swoim web.php.

Auth::routes(['register' => false]);
Connectify_user
źródło
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.

Motolola
źródło
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.

Chad Quilter
źródło
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);
}
Vaishnav Mhetre
źródło
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> 
macalu
źródło
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('/');
});
Ryan Dhungel
źródło
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

Akula
źródło
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.

Yamen Ashraf
źródło
-11

Dodaj

use \Redirect;

u góry pliku

sjas
źródło
Masz na myśli użycie \ Redirect;
Mike Miller
To nie jest pełna odpowiedź.
Martin Bean
na górze którego pliku? rozwiązanie jest niekompletne i zagmatwane.
The Dead Guy