Cách vô hiệu hóa đăng ký người dùng mới trong Laravel


130

Tôi đang sử dụng Laravel (v5).

Tôi cần một người dùng và tôi đã đăng ký. Bây giờ tôi muốn vô hiệu hóa đăng ký cho người dùng mới. Tất nhiên, tôi cần mẫu đăng nhập để làm việc.

Làm thế nào tôi có thể làm điều đó?


Chỉ cần loại bỏ các phương thức liên quan đến đăng ký khỏi tập tin records.php của bạn . Đừng ghi đè các phương thức với các phương thức trống. Đây là một cách tiếp cận khủng khiếp và hack-y vì sau đó bạn phải thêm lại các phần thân nếu bạn quyết định kích hoạt lại tính năng đó trong tương lai.
Martin Bean

1
@MartinBean không có tuyến đường nào trong routes.php. Để kích hoạt các chức năng xác thực, tất cả những gì bạn làm là thêm Route::auth();vào tệp.
miken32

@ miken32 Nhận xét của tôi là từ hơn năm tháng trước, trước khi Route::auth()lối tắt được ủng hộ.
Martin Bean

5
nếu bạn đang ở laravel 5.5 trở lên Auth::routes(['register' => false]);trong web.php
Manojkiran.A 26/2/19

Câu trả lời:


234

Laravel 5.7 đã giới thiệu các chức năng sau:

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

Các tùy chọn hiện có thể có ở đây là:

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

Đối với các phiên bản cũ hơn, chỉ cần ghi đè showRegistrationForm()register()phương thức trong

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

public function register()
{

}

5
Cũng có thể là khôn ngoan khi thay đổi hàm tạo () thành: ném Ngoại lệ mới ('Không thể đăng ký');
JinX

2
hoặc bạn có thể thêm abort(404)vàofunction register()
William Notowidagdo

3
Tôi sẽ không ủng hộ cách tiếp cận này, vì quá tải mã để loại bỏ một tính năng không bao giờ là một điều tốt. Chỉ cần không đăng ký các tuyến liên quan đến đăng ký.
Martin Bean

4
Đối với Laravel 5.5, hãy đặt cái này vàoAuth/RegisterController.php
kapoko

7
Trong showRegistrationForm()chức năng Laravel 5.7 có trong vendorthư mục, về mặt kỹ thuật không nên chỉnh sửa các tệp trong thư mục nhà cung cấp. Về cơ bản những gì tôi đề nghị là loại bỏ tuyến đường đăng ký từ web.php. Bạn chỉ có thể nói Auth::routes(['register' => false])trong web.phptập tin. Chúc mừng!
Ahamed Rasheed

55

Nếu bạn đang sử dụng Laravel 5.2 và bạn đã cài đặt chức năng liên quan đến xác thực php artisan make:auththì app/Http/routes.phptệp của bạn sẽ bao gồm tất cả các tuyến liên quan đến xác thực bằng cách gọi đơn giản Route::auth().

Phương thức auth () có thể được tìm thấy trong vendor/laravel/framework/src/Illuminate/Routing/Router.php. Vì vậy, nếu bạn muốn làm như một số người đề xuất ở đây và vô hiệu hóa đăng ký bằng cách xóa các tuyến không mong muốn (có thể là ý tưởng hay) thì bạn phải sao chép các tuyến bạn vẫn muốn từ phương thức auth () và đặt chúng vào app/Http/routes.php(thay thế cuộc gọi đến Tuyến :: auth ()). Ví dụ:

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

Nếu bạn đang sử dụng phiên bản thấp hơn 5.2 thì có lẽ nó khác, tôi nhớ mọi thứ đã thay đổi khá nhiều kể từ 5.0, tại một số điểm artisan make:auththậm chí đã bị xóa IIRC.


Thay vì xóa các tuyến đăng ký, có thể chỉ bật chúng cho một loại người dùng cụ thể không?
Sefran2

@ Sefran2 Bạn có thể đạt được điều này bằng cách liên kết các nhóm với phần mềm trung gian. Kiểm tra laravel.com/docs/5.2/routing#route-groups
Rafał G.

Trước hết, tôi đã thử Route::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });, nhưng khi người dùng đăng nhập yêu cầu /register, anh ta được chuyển hướng đến/
Sefran2

1
@ Sefran2 Đó là vì AuthControll gọi (thông qua các lớp và đặc điểm khác, nó hơi phức tạp) phần mềm trung gian App\Http\Middleware\RedirectIfAuthenticated. Và phần mềm trung gian đó chuyển hướng bạn đến /nếu bạn đã đăng nhập. Điều này hợp lý, tại sao bạn muốn đăng ký nếu bạn đăng nhập? :-) Nếu bạn chỉ muốn cho phép một số tuyến đường đến một số loại người dùng, bạn sẽ cần tạo phần mềm trung gian của riêng mình thay vì['middleware' => 'auth']
Rafał G.

2
Đối với 5.3, chúng khác nhau một lần nữa, nhưng vẫn có thể được tìm thấy trong nhà cung cấp / laravel / framework / src / Illuminate / Routing / Router.php
Matthieu

51

Điều này có thể là mới trong 5.7, nhưng hiện tại có một mảng tùy chọn cho phương thức auth. Thay đổi đơn giản

Auth::routes();

đến

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

trong tập tin tuyến đường của bạn sau khi chạy php artisan make:authsẽ vô hiệu hóa đăng ký người dùng.


1
Cảm ơn vì điều này, tôi không biết nó tồn tại từ phiên bản nào, nhưng tôi nghĩ đó là con đường đúng để vô hiệu hóa phần đăng ký!
Olivier Rochaix

Nó đã được thêm vào 5.7.
Džuris

34

Đối với Laravel 5.3 và 5.4, đây là cách thích hợp để làm điều đó:

Bạn phải thay đổi:

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

đến

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

trong ứng dụng / http / Trình điều khiển / Auth / RegisterControll.php


1
công việc tốt! Tôi nghĩ cách này cũng bảo vệ khỏi yêu cầu POST để tạo người dùng qua bài viết?
Gediminas

3
điều này sẽ cho phép người dùng đã đăng ký xem trang đăng ký mà bạn không muốn
ahmed

2
Sử dụng phần mềm trung gian ("auth") rồi phần mềm trung gian ("khách") để bỏ qua trang đăng ký cho mọi người
user3425867

1
sau đó người dùng auth có thể đăng ký người dùng mới trong trường hợp này.
Muhammad Azam

Có, đây là cách thích hợp duy nhất cho mọi thứ dưới 5.7 .. làm thế nào đây không phải là câu trả lời được chọn
user3548161

31

Kể từ phiên bản Laravel 5.7, bạn có thể chuyển một loạt các tùy chọn sang Auth::routes(). Sau đó, bạn có thể vô hiệu hóa các tuyến đăng ký với:

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

Bạn có thể thấy cách thức hoạt động từ mã nguồn: src / Illuminate / Routing / Router.php .


1
Theo tôi, đây là câu trả lời đúng. Đẹp thấy!
Rick Kuilman

26

Phương pháp 1 cho phiên bản 5.3

Trong laravel 5.3 không có AuthControll. để vô hiệu hóa tuyến đường đăng ký, bạn nên thay đổi hàm tạo RegisterControllernhư thế này:

Bạn có thể thay đổi hình thức:

public function __construct()
{

    $this->middleware('guest');

}

đến:

use Illuminate\Support\Facades\Redirect;

public function __construct()
{

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

}

Lưu ý: để sử dụng Redirect đừng quên user Redirect; Vì vậy, người dùng truy cập vào https: // host_name / đăng ký nó chuyển hướng đến "/".

Phương pháp 2 cho phiên bản 5.3

Khi chúng tôi sử dụng, php artisan make:authnó được thêm Auth::route(); tự động. Vui lòng ghi đè Tuyến đường trong /routes/web.php. Bạn có thể thay đổi nó như thế này: * bạn cần bình luận dòng này: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');

Cảm ơn! Tôi hy vọng nó có thể giải quyết vấn đề của bạn.


Tôi sẽ thêm các tên tuyến như được chỉ định trong nhà cung cấp / laravel / framework / src / Illuminate / Routing / Router.php Route :: get ('login', 'Auth \ LoginContoder @ showLoginForm') -> name ('login'); Tuyến đường :: bài đăng ('đăng nhập', 'Auth \ LoginContoder @ login'); Tuyến đường :: bài đăng ('đăng xuất', 'Auth \ Đăng nhập Trình điều khiển @ đăng xuất') -> tên ('đăng xuất');
Luciano Fantuzzi

Lớp chuyển hướng bị bỏ lỡ trong phương thức đầu tiên, nhưng thay đổi thành $this->middleware('auth');- hoạt động!
Gediminas

12

Ghi đè getRegister và postRegister là khó khăn - nếu bạn đang sử dụng git, có khả năng cao .gitignorelà bỏ qua các tệp khung dẫn đến kết quả là đăng ký sẽ vẫn có thể trong môi trường sản xuất của bạn (ví dụ như laravel được cài đặt qua trình soạn thảo )

Một khả năng khác là sử dụng Rout.php và thêm dòng này:

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

Bằng cách này, các tệp khung được để riêng và mọi yêu cầu sẽ vẫn được chuyển hướng khỏi mô-đun đăng ký Khung.


4
Các lớp ghi đè các phương thức khung không nằm trong khung (chúng sẽ nằm trong thư mục ứng dụng) và sẽ được lưu trữ bởi git. Các phương thức ghi đè không có nghĩa là bạn thay đổi chúng trong các tệp khung.
datashaman

11

Các AuthController.php@limonte có ghi đè là trong App\Http\Controllers\Auth, không phải trong thư mục nhà cung cấp, vì vậy Git không bỏ qua sự thay đổi này.

Tôi đã thêm chức năng này:

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

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

và nó hoạt động chính xác.


9

LAravel 5.6

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

Điều này nên được hợp nhất vào câu trả lời được chấp nhận, nhưng chỉ là một sự điều chỉnh nhỏ. Tính năng này được giới thiệu trong Laravel 5.7, không phải Laravel 5.6
WebSpanner

8

Đây là giải pháp của tôi vào ngày 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');

Lưu ý tôi đã nhận xét Auth::routes()và hai tuyến đăng ký.

Quan trọng: bạn cũng phải đảm bảo rằng bạn xóa tất cả các phiên bản route('register')trong app.bladebố cục của mình , nếu không, Laravel sẽ đưa ra lỗi.


^ này Trong trường hợp các tuyến đường này thay đổi, chỉ cần sao chép / dán chúng từ gói tuyến đường Auth có địa chỉ @ github.com/laravel/framework/blob/ mẹo và nhận xét các tuyến đăng ký.
pbond

7

Phương pháp sau đây hoạt động rất tốt:

Sao chép tất cả các tuyến đường từ /vendor/laravel/framework/src/Illuminate/Routing/Router.phpvà dán nó vào web.phpvà nhận xét hoặc xóa Auth::routes().

Sau đó thiết lập một điều kiện để kích hoạt và vô hiệu hóa đăng ký từ .env. Sao chép 503.blade.phptệp vào views/errorsvà tạo 403 bị cấm hoặc bất cứ điều gì bạn thích.

Thêm ALLOW_USER_REGISTRATION=vào .env và kiểm soát đăng ký người dùng bằng cách đặt giá trị của nó thành đúng hoặc sai.

Bây giờ bạn có toàn quyền kiểm soát các tuyến đường và các tập tin Nhà cung cấp vẫn còn nguyên.

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

Đây là sự kết hợp của một số câu trả lời trước đó đáng chú ý là Rafal G. và Daniel Centore.


6

Trên laravel 5.6 trở lên, bạn có thể chỉnh sửa trong tệp web.php

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

và bạn có thể biến nó thành sự thật nếu bạn đổi ý, tôi thấy nó dễ dàng theo cách này


5

Trong routes.php, chỉ cần thêm như sau:

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

Sau đó, bạn có thể kiểm soát có chọn lọc xem đăng ký có được phép hay không trong .envtệp của bạn .


3

Tôi đã phải sử dụng:

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

Sử dụng Redirect :: to () đã cho tôi một lỗi:

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

Cảm ơn bạn, vâng, đây là tính năng phiên bản mới, bạn có thể sử dụng chức năng này hoặc sử dụng lớp trước, nhưng lớp trước cần \ trước nó, tôi có nghĩa là \ Redirect :: to ('Destination');
Milad Rahimi

3

Trong Laravel 5.4

Bạn có thể tìm thấy tất cả các tuyến đường được đăng ký thông qua Auth::routes()trong lớp \Illuminate\Routing\Routertrong phương thứcauth()

nó trông như thế này:

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

Chỉ cần sao chép các tuyến đường mà bạn muốn / cần và bạn vẫn ổn!


2

Trong laravel 5.3, bạn nên ghi đè mặc định showRegistrationForm()bằng cách đưa mã bên dưới vào RegisterController.phptệp trongapp\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
    }

vì bạn không muốn cho phép đăng ký, tốt hơn hết là cứ ném 404 errorđể kẻ xâm nhập biết mình bị lạc. Và khi bạn đã sẵn sàng để đăng ký trong ứng dụng của mình, hãy bỏ qua //return view('auth.register');rồi bình luậnabort(404);

\\\\\\\\\\\\\\\\\\\\ CHỈ MỘT FYI ///////////////////////////// ////

Nếu bạn cần sử dụng nhiều xác thực như tạo auth cho người dùng, thành viên, sinh viên, quản trị viên, v.v. thì tôi khuyên bạn nên kiểm tra hesto / multi-auth này, đây là gói tuyệt vời cho auths không giới hạn trong ứng dụng L5.

Bạn có thể đọc thêm về phương pháp Auth và tệp liên quan của nó trong bài viết này .


2
Bạn cũng cần vá đường dẫn bài để tránh đăng ký người dùng thông qua yêu cầu bài.
Vaishnav Mhetre

2

Trong Laravel 5.5

Tôi đã cố gắng thực hiện cùng một vấn đề trong Laravel 5.5. Thay vì sử dụng Auth::routes()trong tệp tuyến web.php, tôi chỉ bao gồm các tuyến đăng nhập / đăng xuất:

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

2

Điều này đã được đề cập trong các bình luận trước đó nhưng tôi muốn làm rõ rằng có nhiều cách để truy cập các tuyến xác thực trong tệp web.php của bạn trong Laravel ^ 5.7. tùy thuộc vào phiên bản của bạn, nó có thể trông hơi khác một chút nhưng chúng đạt được kết quả tương tự.

Lựa chọn đầu tiên

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

Sự lựa chọn thứ hai

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

1

Đặt Đăng ký tuyến sai trong web.php của bạn.

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

0

Để không thay đổi mã như hiện tại, chỉ cần tạo một phần mềm trung gian để phát hiện xem url yêu cầu có phải là url ('đăng ký') hay không, sau đó chuyển hướng đến 404 hoặc thực hiện bất cứ nơi nào.


1
Giải pháp rất dài. Một chức năng ghi đè đơn giản với hủy bỏ chắc chắn có thể làm việc.
Vaishnav Mhetre

0

Trong Laravel 5.5

Làm việc trên một vấn đề tương tự và đặt đối số phần mềm trung gian từ khách sang 'auth' có vẻ như là một giải pháp thanh lịch hơn.

Chỉnh sửa tập tin: app-> http-> Bộ điều khiển-> Auth-> RegisterControll.php

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

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

Mặc dù tôi có thể sai ... nhưng có vẻ lắt léo hơn là chỉnh sửa định tuyến với nhiều dòng hơn và ít xấu hổ hơn là chỉ chuyển hướng trang ... ít nhất là trong trường hợp này, muốn khóa đăng ký cho khách.


Tôi tò mò muốn biết liệu người dùng có thể đăng ký nhiều lần bằng phương pháp này hay không. các guestmiddleware là chuyển hướng chịu trách nhiệm một đã đăng nhập người dùng đi từ một trang đó chỉ là khách mời có thể truy cập (ví dụ một /registertrang)
Kingsley

0

Tôi đoán đây sẽ là một giải pháp tốt hơn.

Ghi đè các phương thức sau như được đề cập trong

Ứng dụng \ http \ Trình điều khiển \ Auth \ RegisterControll.php

use Illuminate\Http\Response;

.
.
.

public function showRegistrationForm()
{
    abort(Response::HTTP_NOT_FOUND);
}

public function register(Request $request)
{
    abort(Response::HTTP_NOT_FOUND);
}

0

Trong Laravel 5.5 rất đơn giản, nếu bạn đang sử dụng hệ thống tuyến CRUD.

Đi đến app/http/controllers/RegisterController đó là không gian tên:Illuminate\Foundation\Auth\RegistersUser

Bạn cần phải đi đến Đăng ký người dùng: Illuminate\Foundation\Auth\RegistersUser

Có phương thức showRegistrationFormthay đổi cuộc gọi này: return view('auth.login');đối với điều này: return redirect()->route('auth.login');và xóa khỏi sổ đăng ký cuộc gọi trang của bạn. Nó có thể trông như thế:

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

0

Tôi thấy đây là giải pháp dễ nhất trong laravel 5.6! Nó chuyển hướng bất cứ ai cố gắng truy cập yoursite.com/register đến yoursite.com

tuyến / web.php

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

0

Tất cả tôi đã làm là thay thế mã lưỡi đăng ký bằng mã lưỡi đăng nhập. Bằng cách đó, đăng ký vẫn đi đăng nhập.

resources/views/auth/register.blade.php được thay thế bằng resources/views/auth/login.blade.php


0

Đối với Laravel 5.6+, dán các phương thức bên dưới vào app\Http\Controller\Auth\RegisterController

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

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

Bây giờ bạn đang ghi đè các phương thức đó RegistersUser, bất cứ khi nào bạn thay đổi ý định, hãy xóa các phương thức này. Bạn cũng có thể bình luận các liên kết đăng ký trong welcome.blade.phplogin.blade.phplượt xem.


-11

thêm vào

use \Redirect;

ở đầu tập tin


Bạn có nghĩa là sử dụng \ Redirect;
Mike Miller

Đây không phải là một câu trả lời đầy đủ.
Martin Bean

ở đầu tập tin nào? giải pháp không đầy đủ và khó hiểu.
Người chết
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.