Laravel'de yeni kullanıcıların kaydı nasıl devre dışı bırakılır


130

Laravel (v5) kullanıyorum.

Bir kullanıcıya ihtiyacım var ve bunu zaten kaydettim. Şimdi yeni kullanıcılar için kaydı devre dışı bırakmak istiyorum. Elbette, çalışmak için giriş formuna ihtiyacım var.

Bunu nasıl yapabilirim?


Kayıtla ilgili yöntemleri route.php dosyanızdan kaldırın . Do Gelecekte bu özelliği yeniden etkinleştirmek karar verirseniz boş olan yöntemleri geçersiz olanlar-bu korkunç ve kesmek-y yaklaşım daha sonra lazım olduğu bedenlerini yeniden ekleyin.
Martin Bean

1
@MartinBean içinde yol yok routes.php. Kimlik doğrulama işlevlerini etkinleştirmek için tek yapmanız gereken Route::auth();dosyaya eklemek .
miken32

@ miken32 Yorumum, Route::auth()kısayol savunulmadan önce, beş aydan uzun bir süre öncesine aitti .
Martin Bean

5
Auth::routes(['register' => false]);web.php
Manojkiran'da

Yanıtlar:


237

Laravel 5.7 aşağıdaki işlevselliği sunmuştur:

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

Şu anda mümkün olan seçenekler şunlardır:

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

Eski laravel versiyonları sadece geçersiz için showRegistrationForm()ve register()yöntemleri

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

public function register()
{

}

5
Create () işlevini şu şekilde değiştirmek akıllıca olabilir: yeni İstisna at ('Kayıt mümkün değil');
JinX

2
veya ekleyebilir abort(404)üzerindefunction register()
William Notowidagdo

3
Bir özelliği kaldırmak için kodun aşırı yüklenmesi asla iyi bir şey olmadığı için bu yaklaşımı savunmazdım. Sadece kayıtla ilgili rotaları kaydetmeyin.
Martin Bean

4
Laravel 5.5 için bunu yazınAuth/RegisterController.php
kapoko

7
Laravel 5.7 showRegistrationForm()işlevi vendorklasördedir, teknik olarak satıcı klasöründeki dosyaları düzenlemeniz önerilmez . Temel olarak önerdiğim şey, kayıt yolunu kaldırmaktır web.php. Sadece söyleyebiliriz Auth::routes(['register' => false])içinde web.phpdosyanın. Şerefe!
Ahamed Rasheed

55

Eğer laravel 5.2 kullanıyor ve birlikte auth ilgili işlevsellik kurduysanız php artisan make:authsonra app/Http/routes.phpbasitçe arayarak tüm auth-ilişkili yolları yer alacak dosyası Route::auth().

Auth () yöntemi bulunabilir vendor/laravel/framework/src/Illuminate/Routing/Router.php. Bu nedenle, bazı kişilerin burada önerdiği gibi yapmak ve istenmeyen yolları kaldırarak kaydı devre dışı bırakmak istiyorsanız (muhtemelen iyi bir fikir), o zaman hala istediğiniz rotaları auth () yönteminden kopyalamanız ve bunları yerleştirmeniz gerekir app/Http/routes.php(Route çağrısını değiştirerek) :: yetkilendirme ()). Yani örneğin:

<?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'den daha düşük bir sürüm kullanıyorsanız, muhtemelen farklıdır, artisan make:auth5.0'dan beri bazı şeylerin biraz değiştiğini , hatta bir noktada IIRC'nin kaldırıldığını hatırlıyorum .


Kayıt yollarını kaldırmak yerine, bunları yalnızca belirli bir kullanıcı türü için etkinleştirmek mümkün müdür?
Sefran2

@ Sefran2 Grupları ara yazılım ile ilişkilendirerek bunu başarabilirsiniz. Laravel.com/docs/5.2/routing#route-groups
Rafał

Her şeyden önce denedim Route::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });, ancak giriş yapan kullanıcı istediğinde /registeryönlendiriliyor/
Sefran2

1
@ Sefran2 Bunun nedeni, AuthController'ın ara katman yazılımını çağırmasıdır (diğer sınıflar ve özellikler aracılığıyla, biraz kıvrımlıdır) App\Http\Middleware\RedirectIfAuthenticated. Ve bu ara yazılım /, zaten oturum açmışsanız sizi yönlendirir . Bu mantıklı, oturum açmışsanız neden kaydolmak isteyesiniz? :-) Yalnızca bazı kullanıcı türlerine giden bazı rotalara izin vermek istiyorsanız, bunun yerine kendi ara katman yazılımınızı oluşturmanız gerekir['middleware' => 'auth']
Rafał G.

2
5.3 için bir kez daha farklılar, ancak yine de vendor / laravel / framework / src / Illuminate / Routing / Router.php
Matthieu

51

Bu, 5.7'de yeni olabilir, ancak artık auth yönteminde bir seçenekler dizisi var. Sadece değişiyor

Auth::routes();

için

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

Rota dosyanızda çalıştırdıktan sonra php artisan make:authkullanıcı kaydını devre dışı bırakır.


1
Bunun için teşekkürler, hangi sürümden beri var bilmiyorum, ancak kayıt bölümünü devre dışı bırakmak için doğru yol olduğunu düşünüyorum!
Olivier Rochaix

Bu edildi ilave 5.7 içinde.
Džuris

34

Laravel 5.3 ve 5.4 için bunu yapmanın doğru yolu şudur:

Değişmelisin:

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

için

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

içinde app / Http / Kontrolör / Kimlik Doğrulama / RegisterController.php


1
iyi iş! Sanırım bu yol, posta yoluyla kullanıcı oluşturma POST isteğinden de korur.
Gediminas

3
bu, kayıtlı kullanıcıların istemediğiniz kayıt sayfasını görmelerine izin verecektir
ahmed

2
Herkes için kayıt sayfasını atlamak için ara yazılım ("yetkilendirme") ve ardından ara yazılım ("misafir") kullanın
user3425867

1
daha sonra bir kimlik doğrulama kullanıcısı bu durumda yeni bir kullanıcı kaydedebilir.
Muhammad Azam

Evet,
5.7'nin


26

Sürüm 5.3 için Yöntem 1

Laravel 5.3'te AuthController yoktur. kayıt yolunu devre dışı bırakmak için bunun yapıcısını değiştirmelisiniz RegisterController:

Formu değiştirebilirsiniz:

public function __construct()
{

    $this->middleware('guest');

}

için:

use Illuminate\Support\Facades\Redirect;

public function __construct()
{

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

}

Not: Kullanım için Redirect unutmayın user Redirect; Bu yüzden kullanıcı https: // host_name / register'a erişim , "/" öğesine yönlendirilir.

Sürüm 5.3 için Yöntem 2

Kullandığımızda otomatik olarak php artisan make:autheklenir Auth::route();. Lütfen /routes/web.php'deki Yönlendirmeyi Geçersiz Kılın. Bunu şu şekilde değiştirebilirsiniz: * bu satırı yorumlamanız gerekiyor: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');

Teşekkürler! Umarım sorunlarınızı çözebilir.


Vendor / laravel / framework / src / Illuminate / Routing / Router.php'de belirtildiği gibi rota adlarını eklerdim. Route :: get ('login', 'Auth \ LoginController @ showLoginForm') -> name ('login'); Route :: post ('giriş', 'Auth \ LoginController @ login'); Route :: post ('logout', 'Auth \ LoginController @ logout') -> name ('logout');
Luciano Fantuzzi

Yönlendirme sınıfı ilk yöntemde gözden kaçtı, ancak - olarak değiştirmek $this->middleware('auth');işe yarıyor!
Gediminas

12

GetRegister ve postRegister'ın üzerine yazmak zordur - git kullanıyorsanız .gitignore, üretim ortamınızda kaydın yine de mümkün olacağı sonucuna yol açacak çerçeve dosyalarını yok sayacak şekilde ayarlanmış yüksek bir olasılık vardır (eğer laravel örneğin composer aracılığıyla kurulursa) )

Diğer bir olasılık, route.php kullanmak ve bu satırı eklemek:

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

Bu şekilde çerçeve dosyaları yalnız bırakılır ve herhangi bir istek yine de Frameworks kayıt modülünden uzağa yönlendirilir.


4
Çerçeve yöntemlerini geçersiz kılan sınıflar çerçevede değildir (uygulama klasöründe olurlar) ve git tarafından depolanır. Yöntemleri geçersiz kılmak, onları çerçeve dosyalarında değiştirdiğiniz anlamına gelmez.
datashaman

11

AuthController.php@Limonte içindedir geçersiz kılınan sahiptir App\Http\Controllers\AuthGit bu değişikliği yoksaymaz yüzden değil satıcı dizininde.

Bu işlevleri ekledim:

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

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

ve doğru çalışıyor.


9

LAravel 5.6

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

Bu, kabul edilen cevapla birleştirilmelidir, ancak sadece küçük bir düzeltme. Bu özellik Laravel 5.6'da değil Laravel 5.7'de tanıtıldı
WebSpanner

8

İşte 5.4 itibariyle benim çözümüm:

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

Dikkat et yorum yaptım Auth::routes()ve iki kayıt yolu.

Önemli: Ayrıca emin tüm örneklerini kaldırmak yapmalısınız route('register')senin içinde app.bladedüzeni veya laravel bir hata verir.


^ bu. Bu rotaların değişmesi durumunda, bunları @ github.com/laravel/framework/blob/… adresinde bulunan Auth rotaları paketinden kopyalayıp yapıştırın ve kayıt rotalarını yorumlayın.
pbond

7

Aşağıdaki yöntem harika çalışıyor:

Tüm rotaları /vendor/laravel/framework/src/Illuminate/Routing/Router.phpkopyalayın ve içine yapıştırın web.phpve yorum yapın veya silin Auth::routes().

Daha sonra .env'den kaydı etkinleştirmek ve devre dışı bırakmak için bir koşul oluşturun. 503.blade.phpDosyayı içinde çoğaltın ve views/errorsyasak 403 veya ne isterseniz oluşturun.

ALLOW_USER_REGISTRATION=.Env'ye ekleyin ve değerini doğru veya yanlış olarak ayarlayarak kullanıcı kaydını kontrol edin.

Artık rotalar üzerinde tam kontrole sahipsiniz ve Satıcı dosyalarına dokunulmadan kalıyor.

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

Bu, Rafal G. ve Daniel Centore başta olmak üzere önceki bazı cevapların bir kombinasyonudur.


6

Laravel 5.6 ve üzeri sürümlerde web.php dosyasında düzenleme yapabilirsiniz

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

ve fikrini değiştirirsen bunu doğru yapabilirsin, bu şekilde kolay görüyorum


5

İçinde routes.php, şunları eklemeniz yeterlidir:

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

Ardından .envdosyanızda kayda izin verilip verilmediğini seçerek kontrol edebilirsiniz .


3

Kullanmalıydım:

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

Redirect :: to () kullanmak bana bir hata verdi:

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

Teşekkürler, evet bu yeni sürüm özelliği, bu işlevi kullanabilir veya önceki sınıfı kullanabilirsiniz, ancak önündeki sınıf gereksinimleri \ ondan önce, yani \ Redirect :: to ('destination');
Milad Rahimi

3

Laravel 5.4'te

Auth::routes()Sınıfta kayıtlı olan tüm rotaları \Illuminate\Routing\Routeryöntemde bulabilirsiniz.auth()

şuna benziyor:

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

Sadece istediğiniz / ihtiyacınız olan rotaları kopyalayın ve iyisiniz!


2

Laravel 5.3'te, showRegistrationForm()aşağıdaki kodu RegisterController.phpdosyaya ekleyerek varsayılanı geçersiz kılmalısınız .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
    }

kayda izin vermek istemediğiniz için 404 error, davetsiz misafirin kaybolduğunu bilmesi için fırlatmak daha iyidir . Ve uygulamanıza kaydolmaya hazır olduğunuzda, //return view('auth.register');yorumu kaldırın ve yorum yapınabort(404);

\\\\\\\\\\\\\\\\\ SADECE BİR BİLGİ /////////////////////////// ////

Kullanıcılar, üyeler, öğrenciler, yönetici vb. İçin kimlik doğrulaması oluşturma gibi birden fazla kimlik doğrulaması kullanmanız gerekiyorsa, bu hesto / çoklu kimlik doğrulamasını L5 uygulamalarında sınırsız yetkilendirme için harika bir paket olarak kontrol etmenizi öneririm.

Sen Auth metodolojisi ve onun ilişkili dosyanın abouth daha fazla bilgi bulabilirsiniz bu writeup.


2
Ayrıca, gönderi isteği yoluyla kullanıcının kaydını önlemek için gönderi yolunu yamalamanız gerekir.
Vaishnav Mhetre

2

Laravel 5.5'te

Laravel 5.5'te de aynı sorunu çözmeye çalışıyordum. Auth::routes()Web.php rotaları dosyasında kullanmak yerine, sadece login / logout rotalarını ekledim:

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

2

Bundan daha önceki yorumlarda bahsedilmişti ancak Laravel ^ 5.7'deki web.php dosyanızdaki auth yollarına erişmenin birden fazla yolu olduğunu açıklığa kavuşturmak isterim. sürümünüze bağlı olarak biraz farklı görünebilir ancak aynı sonucu elde ederler.

İlk seçenek

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

İkinci seçenek

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

1

Web.php'nizde Yolu kaydet'i yanlış olarak ayarlayın .

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

0

Kodu olduğu gibi değiştirmemek için, istek url'sinin url ('kayıt') olup olmadığını tespit etmek için bir ara yazılım oluşturun, ardından 404'e yönlendirin veya istediğiniz yerde yapın.


1
Çok uzun vadeli çözüm. İptal ile basit bir işlev geçersiz kılma kesinlikle işe yarayabilir.
Vaishnav Mhetre

0

Laravel 5.5'te

Benzer bir sorun üzerinde çalışmak ve ara yazılım argümanını misafirden 'auth' olarak ayarlamak daha zarif bir çözüm gibi görünüyordu.

Dosyayı Düzenle: app-> http-> Controllers-> Auth-> RegisterController.php

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

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

Yine de yanılıyor olabilirim ... ama bu, yönlendirmeyi daha fazla satır ve daha az düzensizlikle düzenlemekten, sayfayı yeniden yönlendirmekten daha düzgün görünüyor ... en azından bu durumda, misafirlerin kaydını kilitlemek istemek.


Bir kullanıcının bu yöntemi kullanarak birden çok kez kayıt olup olamayacağını merak ediyorum. guestkatman zaten bu sadece misafir kutu erişim (yani bir sayfa uzağa giriş yapan kullanıcılar bir sorumlu yönlendirme olduğunu /registersayfası)
Kingsley

0

Sanırım bu daha iyi bir çözüm olur.

Aşağıdaki yöntemleri aşağıda belirtildiği gibi geçersiz kılın

App \ Http \ Kontrolör \ Kimlik Doğrulama \ 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'te CRUD rota sistemi kullanıyorsanız çok basittir.

app/http/controllers/RegisterController Oraya git ad alanı var:Illuminate\Foundation\Auth\RegistersUser

RegistersUser'a gitmeniz gerekiyor: Illuminate\Foundation\Auth\RegistersUser

Bunu showRegistrationFormdeğiştirmek için bir yöntem çağrısı vardır : bunun return view('auth.login');için: return redirect()->route('auth.login');ve blade sayfası rota çağrı kaydını sizden kaldırın. Şöyle görünebilir:

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

0

Bunu laravel 5.6'daki en kolay çözüm olarak buldum! Yoursite.com/register adresine gitmeye çalışan herkesi yoursite.com adresine yönlendirir.

rotalar / web.php

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

0

Tek yaptığım kayıt bıçak kodunu oturum açma bıçak koduyla değiştirmekti. Bu şekilde kayıt yine girişe gider.

resources/views/auth/register.blade.php ile değiştirilir resources/views/auth/login.blade.php


0

Laravel 5.6+ için aşağıdaki yöntemleri buraya yapıştırın app\Http\Controller\Auth\RegisterController

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

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

Şimdi bu yöntemleri özel olarak geçersiz RegistersUserkılıyorsunuz, fikrinizi değiştirdiğinizde bu yöntemleri kaldırın. Ayrıca kayıt bağlantılarına welcome.blade.phpve login.blade.phpgörünümlerine yorum yazabilirsiniz .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.