如何在Laravel中禁用注册新用户


130

我正在使用Laravel(v5)。

我需要一个用户,并且已经注册了。现在,我想为新用户禁用注册。当然,我需要登录表单才能工作。

我怎样才能做到这一点?


只需从route.php文件中删除与寄存器相关的方法即可。不要用空白的方法覆盖这些方法-这是一种可怕且骇人听闻的方法,如果您以后决定重新启用该功能,则必须重新添加这些方法。
马丁·比恩

1
@MartinBean中没有路线routes.php。要启用身份验证功能,您要做的就是添加Route::auth();到文件中。
miken32 '16

@ miken32我的评论来自五个月前,Route::auth()倡导捷径之前。
马丁·比恩

5
如果您在web.php中的laravel 5.5及更高版本 Auth::routes(['register' => false]);
Manojkiran.A '19

Answers:


234

Laravel 5.7引入了以下功能:

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

当前可能的选项如下:

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

对于较旧的Laravel版本,只需重写showRegistrationForm()和中的register()方法

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

public function register()
{

}

5
也可以将create()函数更改为:抛出新的Exception('无法注册');
JinX

2
或者你可以添加abort(404)function register()
威廉Notowidagdo

3
我不会提倡这种方法,因为重载代码以删除功能从来都不是一件好事。只是不要注册与注册相关的路线。
马丁·比恩

4
对于Laravel 5.5,将其放入Auth/RegisterController.php
kapoko

7
在Laravel 5.7中,showRegistrationForm()功能位于vendor文件夹中,从技术上讲,建议不要在供应商文件夹中编辑文件。基本上,我建议从中删除注册路由web.php。您可以简单地Auth::routes(['register' => false])web.php文件中说。干杯!
Ahamed Rasheed

55

如果您使用的是Laravel 5.2,并且安装了与auth相关的功能,php artisan make:auth那么您的app/Http/routes.php文件将包含所有与auth相关的路由,只需调用即可Route::auth()

auth()方法可以在中找到vendor/laravel/framework/src/Illuminate/Routing/Router.php。因此,如果您要按照某些人的建议在这里进行操作,并通过删除不需要的路由来禁用注册(可能是个好主意),则必须从auth()方法复制您仍然想要的路由,然后将其放入app/Http/routes.php(替换对Route的调用) :: auth())。因此,例如:

<?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,则可能有所不同,我记得自5.0以来事情发生了很大变化,artisan make:auth甚至在某些时候甚至删除了IIRC。


除了删除注册路由之外,是否可以仅针对特定类型的用户启用它们?
Sefran2 '16

@ Sefran2您可以通过将组与中间件相关联来实现。退房laravel.com/docs/5.2/routing#route-groups
拉法尔G.

首先,我尝试过Route::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });,但是当登录的用户请求将/register他重定向到/
Sefran2

1
@ Sefran2这是因为AuthController调用了中间件(通过其他类和特征,这有点令人费解)App\Http\Middleware\RedirectIfAuthenticated/如果您已经登录,那么该中间件会将您重定向到。这很有意义,如果您登录了,为什么还要注册?:-)如果你想只允许某些航线某些类型的用户,你需要创建自己的中间件,而不是['middleware' => 'auth']
拉法尔G.

2
对于5.3,它们再次有所不同,但仍可以在vendor / laravel / framework / src / Illuminate / Routing / Router.php中找到
Matthieu

51

这可能是5.7中的新增功能,但是auth方法现在有一个options数组。只需更改

Auth::routes();

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

运行后在路由文件中添加php artisan make:auth将禁用用户注册。


1
谢谢,我不知道它存在哪个版本,但是我认为这是禁用注册部分的正确方法!
Olivier Rochaix '18

它是在5.7 中添加的。
Džuris

34

对于Laravel 5.3和5.4,这是执行此操作的正确方法:

您必须更改:

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

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

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


1
不错的工作!我认为这种方式还可以防止通过POST创建用户的POST请求吗?
Gediminas

3
这将使注册用户可以查看您不希望看到的注册页面
ahmed

2
使用middleware(“ auth”)然后使用middleware(“ guest”)绕过所有人的注册页面
user3425867

1
那么在这种情况下,身份验证用户可以注册新用户。
穆罕默德·阿扎姆

是的,这是低于5.7什么的唯一正确的方法..这怎么不是所选的答案
user3548161


26

5.3版的方法1

在laravel 5.3中没有AuthController。要禁用注册路由,您应该在构造函数中更改RegisterController如下:

您可以更改表格:

public function __construct()
{

    $this->middleware('guest');

}

至:

use Illuminate\Support\Facades\Redirect;

public function __construct()
{

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

}

注意:使用时Redirect 请不要忘记,以便 user Redirect; 用户访问https:// host_name / register时它会重定向到“ /”。

5.3版的方法2

使用时php artisan make:authAuth::route(); 自动添加。请在/routes/web.php中覆盖Route。您可以像这样更改它:*您需要对此行进行注释: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');

谢谢!我希望它可以解决您的问题。


我会添加如在vendor / laravel / framework / src / Illuminate / Routing / Router.php中指定的路由名称Route :: get('login','Auth \ LoginController @ showLoginForm')-> name('login'); 路线:: post('login','Auth \ LoginController @ login'); 路由:: post('logout','Auth \ LoginController @ logout')-> name('logout');
Luciano Fantuzzi

第一种方法错过了重定向类,但改为$this->middleware('auth');-可以!
Gediminas'3

12

覆盖getRegister和postRegister是很棘手的-如果您使用的是git,则很有可能 .gitignore设置为忽略框架文件,这将导致结果仍然可以在您的生产环境中进行注册(例如,通过composer安装laravel) )

另一种可能性是使用routes.php并添加以下行:

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

这样,框架文件就不存在了,任何请求仍将重定向到框架注册模块之外。


4
覆盖框架方法的类不在框架中(它们将在app文件夹中),并由git存储。覆盖方法并不意味着您可以在框架文件中进行更改。
datashaman

11

AuthController.php@limonte重写了是App\Http\Controllers\Auth不是在供应商目录,所以Git不会忽略这种变化。

我添加了以下功能:

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

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

它可以正常工作。


9

拉威尔5.6

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

这应该合并到已接受的答案中,但仅需稍作更正。此功能是在Laravel 5.7中引入的,而不是Laravel 5.6中引入的
WebSpanner

8

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

注意,我已经注释掉了Auth::routes()这两个注册路线。

重要:您还必须确保您删除的所有实例route('register')中的app.blade布局,或Laravel将抛出一个错误。


^这个。如果这些路由发生更改,只需从位于@ github.com / laravel / framework / blob /…的Auth路由包中复制/粘贴它们,然后注释掉注册路由。
pbond

7

以下方法效果很好:

复制的所有路线/vendor/laravel/framework/src/Illuminate/Routing/Router.php并将其粘贴web.php并注释掉或删除Auth::routes()

然后设置一个条件来启用和禁用从.env的注册。将503.blade.php文件复制到其中,views/errors并创建403禁止的文件或您喜欢的任何文件。

添加ALLOW_USER_REGISTRATION=到.env并通过将其值设置为true或false来控制用户注册。

现在,您可以完全控制路由,并且供应商文件保持不变。

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

这是以前的一些答案的结合,尤其是拉法尔·G。和丹尼尔·森托尔。



5

在中routes.php,只需添加以下内容:

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

然后,您可以有选择地控制文件中是否允许注册.env


3

我不得不使用:

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

使用Redirect :: to()给我一个错误:

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

谢谢,是的,这是新版本的功能,您可以使用此功能或使用先前的类,但是先前的类需要\之前,我的意思是\ Redirect :: to('destination');
Milad Rahimi 2015年

3

在Laravel 5.4中

您可以在方法Auth::routes()中的类\Illuminate\Routing\Router中找到所有通过注册的路由auth()

它看起来像这样:

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

只要复制您想要/需要的路线,就可以了!


2

在laravel 5.3中,您应showRegistrationForm()通过将以下代码包含在以下RegisterController.php文件中来覆盖默认值: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
    }

因为您不想允许注册,所以最好404 error丢掉,这样入侵者就知道他迷路了。当您准备好在应用程序中进行注册时,请取消注释,//return view('auth.register');然后评论abort(404);

\\\\\\\\\\\\\\\\\\\\\ JUST AN FYI //////////////////////////// ////

如果您需要使用多种身份验证,例如为用户,成员,学生,管理员等创建身份验证,那么我建议您签出此hesto / multi-auth这是一个了不起的软件包,可在L5应用中进行无限。

你可以阅读更多abouth的验证方法,并在其相关文件这样的书面记录。


2
您还需要修补发布路线,以免通过发布请求注册用户。
Vaishnav Mhetre,

2

在Laravel 5.5中

我试图在Laravel 5.5中解决相同的问题。而不是Auth::routes()在web.php路由文件中使用,我只包括了登录/注销路由:

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

2

在前面的评论中已经提到了这一点,但我想澄清一下,在Laravel ^ 5.7的web.php文件中,有多种方法可以访问身份验证路由。根据您的版本,可能看起来有些不同,但是它们可以达到相同的结果。

第一选择

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

第二选择

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

1

在您的web.php中将Register route设置为false

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

0

为了避免按原样更改代码,只需创建一个中间件来检测请求url是否为url('register'),然后重定向至404或执行任何操作。


1
长期解决方案。具有中止的简单函数替代肯定可以工作。
Vaishnav Mhetre,

0

在Laravel 5.5中

处理类似问题并将中间件参数从guest设置为'auth'似乎是一种更优雅的解决方案。

编辑文件:app-> http-> Controllers-> Auth-> RegisterController.php

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

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

虽然我可能是错的...但是比起仅通过重定向页面来编辑更多行和更少草率的路由来说,它似乎更狡猾……至少在这种情况下,想要锁定访客的注册。


我很想知道用户是否可以使用此方法多次注册。该guest中间件负责转向,只有一个客户可以访问(即一个已经登录的用户远离网页/register页面)
金斯利

0

我想这将是一个更好的解决方案。

覆盖下面提到的以下方法

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

在Laravel 5.5中,如果您使用的是CRUD路由系统,则非常简单。

转到app/http/controllers/RegisterController 那里的命名空间:Illuminate\Foundation\Auth\RegistersUser

您需要转到RegistersUser: Illuminate\Foundation\Auth\RegistersUser

方法调用showRegistrationForm更改return view('auth.login');为:为此:return redirect()->route('auth.login');并从刀片页面路由调用寄存器中删除。可能看起来像这样:

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

0

我发现这是laravel 5.6中最简单的解决方案!它将任何尝试访问yoursite.com/register的人重定向到yoursite.com

路线/web.php

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

0

我所做的就是用登录刀片代码替换注册刀片服务器代码。这样注册仍然可以登录。

resources/views/auth/register.blade.php 被替换为 resources/views/auth/login.blade.php


0

对于Laravel 5.6+,将以下方法粘贴到 app\Http\Controller\Auth\RegisterController

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

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

现在,您在RegistersUser特质中覆盖了这些方法,只要您改变主意就删除这些方法。您也可以在welcome.blade.phplogin.blade.php视图中评论注册链接。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.