Cara menonaktifkan pendaftaran pengguna baru di Laravel


130

Saya menggunakan Laravel (v5).

Saya perlu satu pengguna dan saya sudah mendaftarkannya. Sekarang saya ingin menonaktifkan pendaftaran untuk pengguna baru. Tentu saja, saya perlu formulir login untuk berfungsi.

Bagaimana saya bisa melakukan itu?


Hapus saja metode yang berhubungan dengan register dari file route.php Anda . Jangan menimpa metode dengan yang kosong — ini adalah pendekatan yang mengerikan dan hack-y karena Anda harus menambahkan kembali badan jika Anda memutuskan untuk mengaktifkan kembali fitur itu di masa depan.
Martin Bean

1
@MartinBean tidak ada rute di routes.php. Untuk mengaktifkan fungsi otentikasi, yang Anda lakukan hanyalah menambahkan Route::auth();ke file.
miken32

@ miken32 Komentar saya berasal dari lebih dari lima bulan yang lalu, sebelum jalan Route::auth()pintas disarankan.
Martin Bean

5
jika Anda berada di laravel 5.5 dan Auth::routes(['register' => false]);di atasnya di web.php
Manojkiran.

Jawaban:


234

Laravel 5.7 memperkenalkan fungsi berikut:

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

Opsi yang saat ini dimungkinkan di sini adalah:

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

Untuk versi Laravel yang lebih lama cukup timpa showRegistrationForm()dan register()metode dalam

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

public function register()
{

}

5
Mungkin bijaksana untuk juga mengubah fungsi create () untuk: membuang Pengecualian baru ('Registrasi tidak memungkinkan');
JinX

2
atau Anda dapat menambahkan abort(404)padafunction register()
William Notowidagdo

3
Saya tidak akan menganjurkan pendekatan ini, karena kode kelebihan untuk menghapus fitur tidak pernah merupakan hal yang baik. Hanya saja, jangan mendaftar rute terkait pendaftaran.
Martin Bean

4
Untuk Laravel 5.5, masukkan ini ke dalamAuth/RegisterController.php
kapoko

7
Dalam showRegistrationForm()fungsi Laravel 5.7 ada di vendorfolder, secara teknis tidak disarankan untuk mengedit file di folder vendor. Pada dasarnya yang saya rekomendasikan adalah menghapus rute register dari web.php. Anda cukup mengatakan Auth::routes(['register' => false])dalam web.phpfile. Bersulang!
Ahamed Rasheed

55

Jika Anda menggunakan Laravel 5.2 dan Anda menginstal fungsionalitas auth terkait dengan php artisan make:authmaka app/Http/routes.phpfile Anda akan mencakup semua rute auth terkait dengan hanya memanggil Route::auth().

Metode auth () dapat ditemukan di vendor/laravel/framework/src/Illuminate/Routing/Router.php. Jadi jika Anda ingin melakukan seperti yang disarankan beberapa orang di sini dan menonaktifkan pendaftaran dengan menghapus rute yang tidak diinginkan (mungkin ide yang bagus) maka Anda harus menyalin rute yang masih Anda inginkan dari metode auth () dan memasukkannya ke dalam app/Http/routes.php(mengganti panggilan ke Rute :: auth ()). Jadi misalnya:

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

Jika Anda menggunakan versi yang lebih rendah dari 5.2 maka itu mungkin berbeda, saya ingat hal-hal berubah sedikit sejak 5.0, di beberapa titik artisan make:authbahkan dihapus IIRC.


Alih-alih menghapus rute pendaftaran, apakah mungkin untuk mengaktifkannya hanya untuk jenis pengguna tertentu?
Sefran2

@ Sefran2 Anda dapat mencapai ini dengan mengaitkan grup dengan middleware. Lihat laravel.com/docs/5.2/routing#route-groups
Rafał G.

Pertama-tama, saya mencoba Route::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });, tetapi ketika pengguna yang login meminta /registerdia dialihkan ke/
Sefran2

1
@ Sefran2 Itu karena panggilan AuthController (melalui kelas dan sifat lain, ini sedikit berbelit-belit) middleware App\Http\Middleware\RedirectIfAuthenticated. Dan middleware itu mengarahkan Anda ke /jika Anda sudah masuk. Yang masuk akal, mengapa Anda ingin mendaftar jika Anda masuk? :-) Jika Anda hanya ingin membolehkan beberapa rute ke beberapa jenis pengguna, Anda harus membuat middleware sendiri, bukan['middleware' => 'auth']
Rafał G.

2
Untuk 5.3 mereka berbeda sekali lagi, tetapi masih dapat ditemukan di vendor / laravel / framework / src / Illuminate / Routing / Router.php
Matthieu

51

Ini mungkin baru di 5.7, tetapi sekarang ada array opsi untuk metode auth. Cukup berubah

Auth::routes();

untuk

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

dalam file rute Anda setelah berjalan php artisan make:authakan menonaktifkan pendaftaran pengguna.


1
Terima kasih untuk ini, saya tidak tahu sejak versi mana itu ada, tapi saya pikir itu adalah jalur yang tepat untuk menonaktifkan bagian pendaftaran!
Olivier Rochaix

Itu ditambahkan di 5.7.
Džuris

34

Untuk Laravel 5.3 dan 5.4, inilah cara yang tepat untuk melakukannya:

Anda harus berubah:

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

untuk

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

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


1
pekerjaan yang baik! Saya pikir cara ini juga melindungi dari permintaan POST untuk membuat pengguna melalui pos?
Gediminas

3
ini akan memungkinkan pengguna terdaftar untuk melihat halaman pendaftaran yang tidak Anda inginkan
ahmed

2
Gunakan middleware ("auth") lalu middleware ("guest") untuk memotong halaman pendaftaran untuk semua orang
user3425867

1
maka pengguna auth dapat mendaftarkan pengguna baru dalam kasus ini.
Muhammad Azam

Ya ini adalah satu-satunya cara yang tepat untuk apa pun di bawah 5.7 .. bagaimana ini bukan jawaban yang dipilih
user3548161


26

Metode 1 untuk versi 5.3

Di laravel 5.3 tidak memiliki AuthController. untuk menonaktifkan register route Anda harus mengubah dalam konstruktor RegisterControllerseperti ini:

Anda dapat mengubah formulir:

public function __construct()
{

    $this->middleware('guest');

}

untuk:

use Illuminate\Support\Facades\Redirect;

public function __construct()
{

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

}

Catatan: untuk digunakan Redirect jangan lupa untuk user Redirect; Jadi akses pengguna ke https: // host_name / register itu dialihkan ke "/".

Metode 2 untuk versi 5.3

Ketika kami menggunakannya php artisan make:authditambahkan Auth::route(); secara otomatis. Silakan Ganti Rute di /routes/web.php. Anda dapat mengubahnya seperti ini: * Anda perlu mengomentari baris ini: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');

Terima kasih! Saya harap ini bisa menyelesaikan masalah Anda.


Saya akan menambahkan nama rute seperti yang ditentukan di vendor / laravel / framework / src / Illuminate / Routing / Router.php Route :: get ('login', 'Auth \ LoginController @ showLoginForm') -> name ('login'); Rute :: pos ('login', 'Auth \ LoginController @ login'); Rute :: pos ('logout', 'Auth \ LoginController @ logout') -> nama ('logout');
Luciano Fantuzzi

Redirect class tidak terjawab pada metode pertama, tetapi berubah menjadi $this->middleware('auth');- works!
Gediminas

12

Menimpa getRegister dan postRegister itu rumit - jika Anda menggunakan git ada kemungkinan besar yang .gitignorediatur untuk mengabaikan file kerangka kerja yang akan mengarah pada hasil bahwa pendaftaran masih akan dimungkinkan di lingkungan produksi Anda (jika laravel diinstal melalui komposer misalnya )

Kemungkinan lain adalah menggunakan routes.php dan menambahkan baris ini:

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

Dengan cara ini file kerangka dibiarkan sendiri dan permintaan apa pun masih akan dialihkan dari modul register Kerangka.


4
Kelas-kelas yang mengesampingkan metode kerangka tidak ada dalam kerangka kerja (mereka akan berada di folder aplikasi) dan akan disimpan oleh git. Metode penggantian tidak berarti Anda mengubahnya dalam file kerangka kerja.
datashaman

11

The AuthController.php@limonte memiliki ditimpa dalam App\Http\Controllers\Auth, tidak di direktori penjual, sehingga Git tidak mengabaikan perubahan ini.

Saya telah menambahkan fungsi ini:

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

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

dan itu bekerja dengan benar.


9

LAravel 5.6

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

Ini harus digabungkan ke dalam jawaban yang diterima, tetapi hanya koreksi kecil. Fitur ini diperkenalkan di Laravel 5.7, bukan Laravel 5.6
WebSpanner

8

Inilah solusi saya pada 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');

Perhatikan saya sudah berkomentar Auth::routes()dan dua rute pendaftaran.

Penting: Anda juga harus memastikan Anda menghapus semua instance route('register')dalam app.bladetata letak Anda , atau Laravel akan melempar kesalahan.


^ ini. Jika rute ini pernah berubah, cukup salin / tempel dari bundel rute Auth yang berada di @ github.com/laravel/framework/blob/… dan berikan komentar pada rute pendaftaran.
pbond

7

Metode berikut berfungsi dengan baik:

Salin semua rute dari /vendor/laravel/framework/src/Illuminate/Routing/Router.phpdan tempel ke dalam web.phpdan komentari atau hapus Auth::routes().

Kemudian mengatur persyaratan untuk mengaktifkan dan menonaktifkan pendaftaran dari .env. Gandakan 503.blade.phpfile views/errorsdan buat 403 terlarang atau apa pun yang Anda suka.

Tambahkan ALLOW_USER_REGISTRATION=ke .env dan kendalikan pendaftaran pengguna dengan menetapkan nilainya ke true atau false.

Sekarang Anda memiliki kendali penuh atas rute dan file Vendor tetap tidak tersentuh.

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

Ini adalah kombinasi dari beberapa jawaban sebelumnya terutama Rafal G. dan Daniel Centore.


6

Pada laravel 5.6 dan di atasnya Anda dapat mengedit dalam file web.php

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

dan Anda dapat mewujudkannya jika Anda berubah pikiran, saya melihatnya mudah seperti ini


5

Di routes.php, tambahkan saja berikut ini:

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

Kemudian Anda dapat secara selektif mengontrol apakah pendaftaran diizinkan atau tidak dalam .envfile Anda .


3

Saya harus menggunakan:

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

Menggunakan Redirect :: to () memberi saya kesalahan:

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

Terima kasih, ya ini adalah fitur versi baru, Anda dapat menggunakan fungsi ini atau menggunakan kelas sebelumnya, tetapi kelas sebelumnya membutuhkan \ sebelum itu, maksud saya \ Redirect :: to ('destination');
Milad Rahimi

3

Dalam Laravel 5.4

Anda dapat menemukan semua rute yang terdaftar Auth::routes()di kelas \Illuminate\Routing\Routerdalam metode iniauth()

terlihat seperti ini:

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

Cukup salin rute yang Anda inginkan / butuhkan dan Anda baik-baik saja!


2

Di laravel 5.3, Anda harus mengganti default showRegistrationForm()dengan memasukkan kode di bawah ini ke dalam RegisterController.phpfileapp\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
    }

karena Anda tidak ingin mengizinkan pendaftaran, lebih baik membuang 404 errorbegitu saja sehingga si penyusup tahu dia tersesat. Dan ketika Anda siap untuk registrasi di aplikasi Anda, batalkan komentar //return view('auth.register');lalu komentarabort(404);

HANYA FYI /////////////////////////// ////

Jika Anda perlu menggunakan beberapa otentikasi seperti membuat auth untuk pengguna, anggota, siswa, admin, dll. Maka saya menyarankan Anda checkout ini hesto / multi-auth itu paket yang luar biasa untuk auths tak terbatas di aplikasi L5.

Anda dapat membaca lebih lanjut tentang metodologi Auth dan file yang terkait dalam penulisan ini .


2
Anda juga perlu menambal rute pos sehingga untuk menghindari pendaftaran pengguna melalui permintaan pos.
Vaishnav Mhetre

2

Dalam Laravel 5.5

Saya mencoba menyelesaikan masalah yang sama di Laravel 5.5. Alih-alih menggunakan Auth::routes()dalam file rute web.php, saya hanya menyertakan rute login / logout:

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

2

Ini telah disebutkan dalam komentar sebelumnya tetapi saya ingin mengklarifikasi bahwa ada beberapa cara untuk mengakses rute auth di file web.php Anda di Laravel ^ 5.7. tergantung pada versi Anda mungkin terlihat sedikit berbeda tetapi mereka mencapai hasil yang sama.

Pilihan pertama

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

Opsi kedua

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


0

Agar tidak terlalu mengubah kodenya, buat saja middleware untuk mendeteksi apakah url permintaan adalah url ('register'), lalu redirect ke 404 atau lakukan di mana saja.


1
Solusi jangka panjang. Fungsi sederhana yang ditimpa dengan abort pasti dapat bekerja.
Vaishnav Mhetre

0

Dalam Laravel 5.5

Bekerja pada masalah yang sama dan mengatur argumen middleware dari tamu ke 'auth' sepertinya solusi yang lebih elegan.

Edit File: app-> http-> Controllers-> Auth-> RegisterController.php

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

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

Saya bisa saja salah ... tetapi tampaknya lebih apik daripada mengedit perutean dengan lebih banyak baris dan lebih sedikit shity daripada hanya mengarahkan ulang halaman ... setidaknya dalam hal ini, ingin mengunci pendaftaran untuk tamu.


Saya ingin tahu apakah pengguna dapat mendaftar beberapa kali menggunakan metode ini. yang guestmiddleware adalah mengarahkan jawab yang sudah login pengguna dari halaman yang hanya tamu bisa akses (yaitu /registerhalaman)
Kingsley

0

Saya kira ini lebih baik menjadi solusi yang lebih baik.

Ganti metode berikut seperti yang disebutkan di dalam

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

Di Laravel 5.5 sangat sederhana, jika Anda menggunakan sistem rute CRUD.

Pergi ke app/http/controllers/RegisterController sana adalah namespace:Illuminate\Foundation\Auth\RegistersUser

Anda harus pergi ke RegistersUser: Illuminate\Foundation\Auth\RegistersUser

Ada metode panggilan showRegistrationFormubah ini: return view('auth.login');untuk ini: return redirect()->route('auth.login');dan hapus dari Anda register panggilan rute halaman blade. Mungkin terlihat seperti itu:

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

0

Saya menemukan ini menjadi solusi termudah di laravel 5.6! Ini mengalihkan siapa saja yang mencoba masuk ke situs Anda.com/register ke situs Anda.com

rute / web.php

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

0

Yang saya lakukan adalah mengganti kode blade register dengan kode blade login. Dengan begitu register tetap masuk untuk login.

resources/views/auth/register.blade.php diganti dengan resources/views/auth/login.blade.php


0

Untuk Laravel 5.6+, rekatkan metode di bawah ini di app\Http\Controller\Auth\RegisterController

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

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

Sekarang Anda RegistersUsermengganti metode-metode tersebut dalam sifat, setiap kali Anda berubah pikiran, hapus metode-metode ini. Anda juga dapat mengomentari tautan welcome.blade.phpdan login.blade.phptampilan daftar.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.