So deaktivieren Sie die Registrierung neuer Benutzer in Laravel

130

Ich benutze Laravel (v5).

Ich brauche einen Benutzer und habe das bereits registriert. Jetzt möchte ich die Registrierung für neue Benutzer deaktivieren. Natürlich brauche ich das Anmeldeformular, um zu funktionieren.

Wie kann ich das machen?

Milad Rahimi
quelle
Entfernen Sie einfach die registrierungsbezogenen Methoden aus Ihrer Datei route.php . Sie nicht die Methoden , mit leeren außer Kraft setzen diejenigen-es ist ein schreckliche und Hack-y - Ansatz , wie Sie dann zu haben erneut hinzufügen , den Körper , wenn Sie sich entscheiden , diese Funktion in Zukunft wieder zu aktivieren.
Martin Bean
1
@ MartinBean gibt es keine Routen in routes.php. Um die Authentifizierungsfunktionen zu aktivieren, müssen Sie lediglich Route::auth();der Datei hinzufügen .
miken32
@ miken32 Mein Kommentar stammt von vor über fünf Monaten, bevor die Route::auth()Verknüpfung befürwortet wurde.
Martin Bean
5
Wenn Sie in Laravel 5.5 und höher Auth::routes(['register' => false]);in web.php
Manojkiran.A

Antworten:

234

Laravel 5.7 führte die folgenden Funktionen ein:

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

Die derzeit möglichen Optionen hier sind:

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

Für ältere Laravel-Versionen überschreiben Sie einfach showRegistrationForm()und register()Methoden in

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

public function register()
{

}
Limon Monte
quelle
5
Es kann sinnvoll sein, auch die Funktion create () zu ändern, um: eine neue Ausnahme auszulösen ('Registrierung nicht möglich');
der JinX
2
oder Sie können hinzufügen , abort(404)auffunction register()
William Notowidagdo
3
Ich würde diesen Ansatz nicht befürworten, da das Überladen von Code zum Entfernen einer Funktion niemals eine gute Sache ist. Registrieren Sie nur nicht die registrierungsbezogenen Routen.
Martin Bean
4
Für Laravel 5.5 setzen Sie dies inAuth/RegisterController.php
Kapoko
7
In Laravel 5.7 befindet sich die showRegistrationForm()Funktion im vendorOrdner. Technisch wird nicht empfohlen , Dateien im Herstellerordner zu bearbeiten. Grundsätzlich empfehle ich, die Registerroute von zu entfernen web.php. Sie können einfach Auth::routes(['register' => false])in web.phpDatei sagen . Prost!
Ahamed Rasheed
55

Wenn Sie Laravel 5.2 verwenden und die Authentifizierungsfunktion mit installiert haben, enthält php artisan make:authIhre app/Http/routes.phpDatei alle Authentifizierungsrouten, indem Sie einfach aufrufen Route::auth().

Die auth () -Methode finden Sie in vendor/laravel/framework/src/Illuminate/Routing/Router.php. Wenn Sie also tun möchten, was einige Leute hier vorschlagen, und die Registrierung deaktivieren möchten, indem Sie unerwünschte Routen entfernen (wahrscheinlich eine gute Idee), müssen Sie die noch gewünschten Routen aus der auth () -Methode kopieren und eingeben ( app/Http/routes.phpden Aufruf von Route ersetzen) :: auth ()). Also zum Beispiel:

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

Wenn Sie eine niedrigere Version als 5.2 verwenden, ist dies wahrscheinlich anders. Ich erinnere mich, dass sich die Dinge seit 5.0 ziemlich verändert haben und irgendwann artisan make:authsogar IIRC entfernt wurde.

Rafał G.
quelle
Ist es möglich, die Registrierungsrouten nicht zu entfernen, sondern nur für einen bestimmten Benutzertyp zu aktivieren?
Sefran2
@ Sefran2 Sie können dies erreichen, indem Sie Gruppen mit Middleware verknüpfen. Überprüfen Sie laravel.com/docs/5.2/routing#route-groups
Rafał G.
Zuerst habe ich es versucht Route::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });, aber wenn der angemeldete Benutzer dies /register/
wünscht,
1
@ Sefran2 Das liegt daran, dass AuthController die Middleware aufruft (über andere Klassen und Merkmale ist es ein wenig verworren) App\Http\Middleware\RedirectIfAuthenticated. Und diese Middleware leitet Sie weiter, /wenn Sie bereits angemeldet sind. Was ist sinnvoll, warum sollten Sie sich registrieren, wenn Sie angemeldet sind? :-) Wenn Sie nur einige Routen zu bestimmten Benutzertypen zulassen möchten, müssen Sie stattdessen Ihre eigene Middleware erstellen['middleware' => 'auth']
Rafał G.
2
Für 5.3 sind sie wieder anders, können aber immer noch in Vendor / Laravel / Framework / Src / Illuminate / Routing / Router.php
Matthieu
51

Dies ist möglicherweise neu in 5.7, aber die Auth-Methode verfügt jetzt über ein Optionsarray. Einfach ändern

Auth::routes();

zu

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

In Ihrer Routendatei wird nach dem Ausführen php artisan make:authdie Benutzerregistrierung deaktiviert.

theeternalsw0rd
quelle
1
Vielen Dank dafür, ich weiß nicht, seit welcher Version es existiert, aber ich denke, es ist der richtige Weg, um den Registrierungsteil zu deaktivieren!
Olivier Rochaix
Es wurde in 5.7 hinzugefügt .
Džuris
34

Für Laravel 5.3 und 5.4 ist hier der richtige Weg, dies zu tun:

Du musst dich ändern:

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

zu

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

in app / Http / Controller / Auth / RegisterController.php

Yassin
quelle
1
gut gemacht! Ich denke, dieser Weg schützt auch vor POST-Anfrage zum Erstellen eines Benutzers per Post?
Gediminas
3
Dadurch können registrierte Benutzer die Registrierungsseite sehen, die Sie nicht möchten
ahmed
2
Verwenden Sie Middleware ("auth") und Middleware ("guest"), um die Registrierungsseite für alle zu umgehen
user3425867
1
In diesem Fall kann ein Auth-Benutzer einen neuen Benutzer registrieren.
Muhammad Azam
Ja, dies ist der einzig richtige Weg für alles unter 5.7. Wie ist dies nicht die ausgewählte Antwort
user3548161
31

Ab Laravel 5.7 können Sie eine Reihe von Optionen an übergeben Auth::routes(). Sie können dann die Registerrouten deaktivieren mit:

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

Wie das funktioniert, können Sie dem Quellcode entnehmen : src / Illuminate / Routing / Router.php .

Christopher Geary
quelle
1
Meiner Meinung nach ist dies die richtige Antwort. Schön gefunden!
Rick Kuilman
26

Methode 1 für Version 5.3

In Laravel 5.3 gibt es keinen AuthController. Um die Registerroute zu deaktivieren, sollten Sie den Konstruktor folgendermaßen ändern RegisterController:

Sie können die Form ändern:

public function __construct()
{

    $this->middleware('guest');

}

zu:

use Illuminate\Support\Facades\Redirect;

public function __construct()
{

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

}

Hinweis: Redirect Zur Verwendung nicht vergessen, damit der user Redirect; Benutzerzugriff auf https: // Hostname / Register auf "/" umgeleitet wird.

Methode 2 für Version 5.3

Wenn wir es verwenden, wird php artisan make:authes Auth::route(); automatisch hinzugefügt . Bitte überschreiben Sie die Route in /routes/web.php. Sie können dies folgendermaßen ändern: * Sie müssen diese Zeile kommentieren: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');

Vielen Dank! Ich hoffe, es kann Ihre Probleme lösen.

Phanith Kung
quelle
Ich würde Routennamen hinzufügen, wie in vendor / laravel / framework / src / Illuminate / Routing / Router.php angegeben. Route :: get ('login', 'Auth \ LoginController @ showLoginForm') -> name ('login'); Route :: post ('login', 'Auth \ LoginController @ login'); Route :: post ('logout', 'Auth \ LoginController @ logout') -> name ('logout');
Luciano Fantuzzi
Redirect-Klasse bei der ersten Methode verpasst, aber Wechsel zu $this->middleware('auth');- funktioniert!
Gediminas
12

Das Überschreiben von getRegister und postRegister ist schwierig. Wenn Sie git verwenden, besteht eine hohe Wahrscheinlichkeit .gitignore, dass Framework-Dateien ignoriert werden. Dies führt dazu, dass die Registrierung in Ihrer Produktionsumgebung weiterhin möglich ist (wenn laravel beispielsweise über Composer installiert wird )

Eine andere Möglichkeit ist die Verwendung von route.php und das Hinzufügen dieser Zeile:

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

Auf diese Weise werden die Framework-Dateien in Ruhe gelassen und jede Anforderung wird weiterhin vom Frameworks-Registrierungsmodul umgeleitet.

JCoolinger
quelle
4
Die Klassen, die die Framework-Methoden überschreiben, befinden sich nicht im Framework (sie befinden sich im App-Ordner) und werden von git gespeichert. Das Überschreiben von Methoden bedeutet nicht, dass Sie sie in den Framework-Dateien ändern.
Datashaman
11

Das AuthController.phpüberschriebene @limonte befindet sich in App\Http\Controllers\Authund nicht im Herstellerverzeichnis, sodass Git diese Änderung nicht ignoriert.

Ich habe diese Funktionen hinzugefügt:

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

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

und es funktioniert richtig.

Jesús Amieiro
quelle
9

LAravel 5.6

Auth::routes([
    'register' => false, // Registration Routes...
    'reset' => false, // Password Reset Routes...
    'verify' => false, // Email Verification Routes...
]);
Isaac Limón
quelle
Dies sollte in die akzeptierte Antwort eingefügt werden, aber nur eine geringfügige Korrektur. Diese Funktion wurde in Laravel 5.7 eingeführt, nicht in Laravel 5.6
WebSpanner
8

Hier ist meine Lösung ab 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');

Beachten Sie, dass ich Auth::routes()die beiden Registrierungsrouten auskommentiert habe.

Wichtig: Sie müssen auch sicherstellen, dass Sie alle Instanzen route('register')in Ihrem app.bladeLayout entfernen , da sonst Laravel einen Fehler auslöst.

kjdion84
quelle
^ das. Falls sich diese Routen jemals ändern, kopieren Sie sie einfach aus dem Auth-Routen-Bundle unter @ github.com/laravel/framework/blob/… und kommentieren Sie die Registrierungsrouten aus.
Pbond
7

Die folgende Methode funktioniert hervorragend:

Kopieren Sie alle Routen von /vendor/laravel/framework/src/Illuminate/Routing/Router.phpund fügen Sie sie ein web.phpund kommentieren oder löschen Sie sie Auth::routes().

Richten Sie dann eine Bedingung ein, um die Registrierung von .env zu aktivieren und zu deaktivieren. Dupliziere die 503.blade.phpDatei in views/errorsund erstelle eine 403 verbotene oder was auch immer du willst.

Fügen Sie ALLOW_USER_REGISTRATION=.env hinzu und steuern Sie die Benutzerregistrierung, indem Sie den Wert auf true oder false setzen.

Jetzt haben Sie die volle Kontrolle über Routen und Vendor-Dateien bleiben unberührt.

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

Dies ist eine Kombination einiger früherer Antworten, insbesondere von Rafal G. und Daniel Centore.

Jeffrey
quelle
6

Ab Laravel 5.6 können Sie die Datei web.php bearbeiten

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

und Sie können es wahr machen, wenn Sie Ihre Meinung ändern, ich sehe es einfach so

Sajjad Aljileezi
quelle
5

Fügen Sie routes.phpeinfach Folgendes hinzu:

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

Anschließend können Sie selektiv steuern, ob eine Registrierung in Ihrer .envDatei zulässig ist oder nicht .

Daniel Centore
quelle
3

Ich musste verwenden:

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

Die Verwendung von Redirect :: to () gab mir einen Fehler:

Class 'App\Http\Controllers\Auth\Redirect' not found
Ghodder
quelle
Vielen Dank, ja, dies ist eine neue Versionsfunktion. Sie können diese Funktion oder die vorhergehende Klasse verwenden, aber die vorhergehende Klasse benötigt \ davor, ich meine \ Redirect :: to ('Ziel');
Milad Rahimi
3

In Laravel 5.4

In der Methode finden Sie alle Routen, die Auth::routes()in der Klasse registriert sind\Illuminate\Routing\Routerauth()

es sieht aus wie das:

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

Kopieren Sie einfach die Routen, die Sie wollen / brauchen und es geht Ihnen gut!

Bambamboole
quelle
2

In Laravel 5.3 sollten Sie die Standardeinstellung überschreiben, showRegistrationForm()indem Sie den folgenden Code in die RegisterController.phpDatei in aufnehmenapp\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
    }

Da Sie die Registrierung nicht zulassen möchten, ist es besser, nur zu werfen, 404 errordamit der Eindringling weiß, dass er verloren ist. Und wenn Sie für die Registrierung in Ihrer App bereit sind, //return view('auth.register');kommentieren Sie diese aus und kommentieren Sie sieabort(404);

\\\\\\\\\\\\\\\\\\ NUR EIN FYI /////////////////////////////// ////

Wenn Sie mehrere Authentifizierungen wie das Erstellen einer Authentifizierung für Benutzer, Mitglieder, Studenten, Administratoren usw. verwenden müssen, empfehle ich Ihnen, diese Hesto / Multi-Authentifizierung zu testen. Es ist ein fantastisches Paket für unbegrenzte Authentifizierungen in L5-Apps.

Weitere Informationen zur Auth-Methode und der zugehörigen Datei finden Sie in dieser Beschreibung.

Der Tote
quelle
2
Sie müssen auch die Post-Route patchen, um die Registrierung des Benutzers durch Post-Anfrage zu vermeiden.
Vaishnav Mhetre
2

In Laravel 5.5

Ich habe versucht, das gleiche Problem in Laravel 5.5 zu lösen. Anstatt Auth::routes()in der web.php-Routendatei zu verwenden, habe ich nur die Login- / Logout-Routen eingefügt:

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

Dies wurde in früheren Kommentaren erwähnt, aber ich möchte klarstellen, dass es in Laravel ^ 5.7 mehrere Möglichkeiten gibt, auf die Authentifizierungsrouten in Ihrer web.php-Datei zuzugreifen. Abhängig von Ihrer Version sieht es vielleicht etwas anders aus, aber sie erzielen das gleiche Ergebnis.

Erste Wahl

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

Zweite Option

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

Setzen Sie in Ihrer web.php die Option Route registrieren auf false .

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

Um den Code nicht zu ändern, erstellen Sie einfach eine Middleware, um festzustellen, ob die Anforderungs-URL eine URL ist ('register'), und leiten Sie sie dann zu 404 weiter oder tun Sie es, wo immer Sie möchten.

Motolola
quelle
1
Sehr langfristige Lösung. Eine einfache Funktionsüberschreibung mit Abbruch kann definitiv funktionieren.
Vaishnav Mhetre
0

In Laravel 5.5

Die Arbeit an einem ähnlichen Problem und das Setzen des Middleware-Arguments vom Gast auf "auth" schien eine elegantere Lösung zu sein.

Datei bearbeiten: app-> http-> Controller-> Auth-> RegisterController.php

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

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

Ich könnte mich zwar irren ... aber es scheint schlauer zu sein, als das Routing mit mehr Zeilen und weniger Shity zu bearbeiten, als einfach die Seite umzuleiten ... zumindest in diesem Fall, um die Registrierung für Gäste zu sperren.

Chad Quilter
quelle
Ich wäre gespannt, ob sich ein Benutzer mit dieser Methode mehrmals registrieren kann. Die guestMiddleware ist dafür verantwortlich, einen bereits angemeldeten Benutzer von einer Seite wegzuleiten, auf die nur ein Gast zugreifen kann (dh von einer /registerSeite)
Kingsley
0

Ich denke, das wäre eher eine bessere Lösung.

Überschreiben Sie die folgenden Methoden wie unten beschrieben

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
quelle
0

In Laravel 5.5 ist es sehr einfach, wenn Sie das CRUD-Routensystem verwenden.

Gehe app/http/controllers/RegisterController dorthin gibt es einen Namespace:Illuminate\Foundation\Auth\RegistersUser

Sie müssen zum RegistersUser gehen: Illuminate\Foundation\Auth\RegistersUser

Es gibt den Methodenaufruf, der dies showRegistrationFormändert: return view('auth.login');dafür: return redirect()->route('auth.login');und von Ihrem Blade-Page-Routenaufrufregister entfernen. Es kann so aussehen:

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

Ich fand dies die einfachste Lösung in Laravel 5.6! Jeder, der versucht, auf Ihre Website zu gehen, wird auf Ihre Website weitergeleitet

routen / web.php

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

Ich habe lediglich den Register Blade-Code durch den Login Blade-Code ersetzt. Auf diese Weise geht die Registrierung immer noch zum Login.

resources/views/auth/register.blade.php wird ersetzt durch resources/views/auth/login.blade.php

Akula
quelle
0

Fügen Sie für Laravel 5.6+ die folgenden Methoden ein app\Http\Controller\Auth\RegisterController

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

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

Jetzt überschreiben Sie diese Methoden im RegistersUserMerkmal, wenn Sie Ihre Meinung ändern, entfernen Sie diese Methoden. Sie können auch die Registerlinks in welcome.blade.phpund login.blade.phpAnsichten kommentieren .

Yamen Ashraf
quelle
-11

hinzufügen

use \Redirect;

am Anfang der Datei

sjas
quelle
Du meinst use \ Redirect;
Mike Miller
Dies ist keine vollständige Antwort.
Martin Bean
oben in welcher Datei? Die Lösung ist unvollständig und verwirrend.
Der Tote