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

Posted

技术标签:

【中文标题】如何在 Laravel 中禁用注册新用户【英文标题】:How to disable registration new users in Laravel 【发布时间】:2015-05-24 20:31:23 【问题描述】:

我正在使用 Laravel。我想禁用新用户的注册,但我需要登录才能工作。

如何禁用注册表单/路由/控制器?

【问题讨论】:

只需从 routes.php 文件中删除与注册相关的方法。 不要用空白的方法覆盖这些方法——这是一种可怕的骇人听闻的方法,因为如果您决定在未来重新启用该功能,则必须重新添加主体。 @MartinBean routes.php 中没有路由。要启用身份验证功能,您只需在文件中添加Route::auth(); @miken32 我的评论来自五个多月前,在Route::auth() 快捷方式被提倡之前。 如果你在 laravel 5.5 及以上版本 Auth::routes(['register' => false]); in web.php 【参考方案1】:

对于在 (Laravel v8.52.0) 中使用 fortify 的 laravel,您可以在 fortify 配置文件中禁用注册功能,例如

'features' => [
    //Features::registration(),
    //Features::resetPasswords(),
    // Features::emailVerification(),
    Features::updateProfileInformation(),
    Features::updatePasswords(),
    Features::twoFactorAuthentication([
        'confirmPassword' => true,
    ]),
]

【讨论】:

这实际上是 2 个月前这个问题留下的最后一个答案。【参考方案2】:

对于 Fortify 用户,更改 config/fortify.php

'features' => [
    // Features::registration(), // --------> comment out this
    Features::resetPasswords(),
    // Features::emailVerification(),
    Features::updateProfileInformation(),
    Features::updatePasswords(),
    Features::twoFactorAuthentication(),
],

【讨论】:

【参考方案3】:

如果您使用 Laravel 8 和 Laravel Breeze,这些身份验证路由都明确列在 routes/auth.php 中。注册路线是顶部的前两条。

只需注释掉你不想要的那些,Laravel 会处理其余的,例如。如果您注释掉forgot-password 的路线,则不会出现“忘记密码?”登录窗口中显示的链接。

【讨论】:

【参考方案4】:

设置注册路由为false 在你的 web.php 中。

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

【讨论】:

【参考方案5】:

这在 5.7 中可能是新的,但现在 auth 方法有一个选项数组。简单的改变

Auth::routes();

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

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

【讨论】:

谢谢你,我不知道它从哪个版本开始存在,但我认为这是禁用注册部分的正确路径! 在 5.7 中是 added。 在 Laravel 7 / 8 中禁用注册路由【参考方案6】:

这在之前的 cmets 中已经提到过,但我想澄清一下,有多种方法可以访问 Laravel ^5.7 中 web.php 文件中的 auth 路由。根据您的版本,它可能看起来有点不同,但它们会达到相同的结果。

第一个选项

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...
]);

【讨论】:

【参考方案7】:

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()



【讨论】:

将 create() 函数更改为: throw new Exception('Registration not possible'); 或者您可以在function register()上添加abort(404) 我不提倡这种方法,因为重载代码来删除功能从来都不是一件好事。只是不要注册与注册相关的路由。 对于 Laravel 5.5,请将其放入 Auth/RegisterController.php 在 Laravel 5.7 中 showRegistrationForm() 函数位于 vendor 文件夹中,从技术上讲,不建议编辑 vendor 文件夹中的文件。基本上我推荐的是从web.php 中删除注册路由。您可以在web.php 文件中简单地说Auth::routes(['register' => false])。干杯!【参考方案8】:

在 laravel 5.6 及以上版本你可以在 web.php 文件中编辑

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

如果你改变主意,你可以做到这一点,我认为这样很容易

【讨论】:

【参考方案9】:

以下方法效果很好:

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

然后设置一个条件来启用和禁用从 .env 注册。 在views/errors 中复制503.blade.php 文件并创建一个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');

这是一些先前答案的组合,尤其是 Rafal G. 和 Daniel Centore。

【讨论】:

【参考方案10】:

AuthController.php @limonte 已覆盖在 App\Http\Controllers\Auth 中,而不是在供应商目录中,因此 Git 不会忽略此更改。

我已经添加了这个功能:

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


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

它工作正常。

【讨论】:

【参考方案11】:

LAravel 5.6

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

【讨论】:

这应该合并到接受的答案中,但只是一个小的更正。此功能是在 Laravel 5.7 中引入的,而不是 Laravel 5.6【参考方案12】:

从 Laravel 5.7 开始,您可以将一组选项传递给 Auth::routes()。然后,您可以使用以下命令禁用注册路由:

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

您可以从源代码中了解其工作原理:src/Illuminate/Routing/Router.php。

【讨论】:

在我看来,这是正确的答案。很好发现!【参考方案13】:

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

/*
* Disabling registeration.
*
*/
public function register() 

    return redirect('/');


/*
* Disabling registeration.
*
*/
public function showRegistrationForm() 

    return redirect('/');

现在您在 RegistersUser trait 中覆盖这些方法,每当您改变主意时删除这些方法。您还可以在welcome.blade.phplogin.blade.php 视图中评论注册链接。

【讨论】:

【参考方案14】:

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

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

【讨论】:

【参考方案15】:

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

routes/web.php

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

【讨论】:

【参考方案16】:

在 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> 

【讨论】:

【参考方案17】:

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:auth 时,它被添加了Auth::route(); 自动地。 请覆盖 /routes/web.php 中的路由。 你可以改变它是这样的: * 你需要评论这一行: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')-> 中指定的路由名称名称(“登录”); Route::post('login', 'Auth\LoginController@login'); Route::post('logout', 'Auth\LoginController@logout')->name('logout'); 第一种方法错过了重定向类,但更改为$this-&gt;middleware('auth'); - 有效!【参考方案18】:

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

覆盖以下方法,如下所述

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

【讨论】:

【参考方案19】:

在 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 页面)【参考方案20】:

在 Laravel 5.5 中

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

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

【讨论】:

【参考方案21】:

这是我从 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() 和两条注册路线注释掉。

重要提示:您还必须确保删除 app.blade 布局中的所有 route('register') 实例,否则 Laravel 会抛出错误。

【讨论】:

^ 这个。如果这些路由发生变化,只需从位于 @github.com/laravel/framework/blob/… 的 Auth 路由包中复制/粘贴它们并注释掉注册路由。【参考方案22】:

在 Laravel 5.4 中

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

看起来像这样:

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

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

【讨论】:

【参考方案23】:

对于 Laravel 5.3 和 5.4,以下是正确的做法:

你必须改变:

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

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

app/Http/Controller/Auth/RegisterController.php

【讨论】:

干得好!我认为这种方式还可以防止通过帖子创建用户的 POST 请求? 这会让注册用户看到你不想看到的注册页面 使用 middleware("auth") 然后 middleware("guest") 为大家绕过注册页面 那么在这种情况下授权用户可以注册一个新用户。 是的,这是 5.7 以下的唯一正确方法.. 这怎么不是选择的答案【参考方案24】:

在 laravel 5.3 中,您应该通过将以下代码包含到 app\Http\Controllers\Auth 中的 RegisterController.php 文件中来覆盖默认的 showRegistrationForm()

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

\\\\\\\\\\\\\\\\\\\\仅供参考//////////////////// ///////

如果您需要使用多重身份验证,例如为用户、成员、学生、管理员等创建身份验证,那么我建议您查看此 hesto/multi-auth,它是一个很棒的包,可在 L5 应用程序中实现无限身份验证。

您可以在this writeup 中阅读有关身份验证方法及其相关文件的更多信息。

【讨论】:

你还需要修补post路由,避免用户通过post请求注册。【参考方案25】:

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

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

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

【讨论】:

【参考方案26】:

为了不改动代码,只需要创建一个中间件来检测请求的url是否为url('register'),然后重定向到404或者做任何地方。

【讨论】:

非常长期的解决方案。一个简单的带有 abort 的函数覆盖绝对可以工作。【参考方案27】:

如果您使用的是 Laravel 5.2,并且您使用 php artisan make:auth 安装了与身份验证相关的功能,那么您的 app/Http/routes.php 文件将包含所有与身份验证相关的路由,只需调用 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 您可以通过将组与中间件相关联来实现此目的。查看laravel.com/docs/5.2/routing#route-groups 首先,我尝试了Route::group(['middleware' =&gt; 'auth'], function () Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); );,但是当登录的用户请求/register时,他被重定向到/ @Sefran2 这是因为 AuthController 调用(通过其他类和特征,这有点复杂)中间件 App\Http\Middleware\RedirectIfAuthenticated。如果您已经登录,该中间件会将您重定向到/。这是有道理的,如果您已登录,为什么还要注册? :-) 如果您只想允许某些类型的用户使用某些路由,则需要创建自己的中间件而不是 ['middleware' =&gt; 'auth'] 对于 5.3,它们再次不同,但仍然可以在 vendor/laravel/framework/src/Illuminate/Routing/Router.php 中找到【参考方案28】:

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

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

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

这样框架文件就会被单独保留,任何请求仍将被重定向到框架注册模块之外。

【讨论】:

覆盖框架方法的类不在框架中(它们将在 app 文件夹中),将由 git 存储。覆盖方法并不意味着您在框架文件中更改它们。【参考方案29】:

添加

use \Redirect;

在文件的顶部

【讨论】:

你的意思是使用 \Redirect; 这不是一个完整的答案。 在哪个文件的顶部?解决方案不完整且令人困惑。【参考方案30】:

我不得不使用:

public function getRegister()

    return redirect('/');

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

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

【讨论】:

谢谢,是的,这是新版本的功能,你可以使用这个功能或者使用前置类,但是前置类需要在它前面,我的意思是\Redirect::to('destination');

以上是关于如何在 Laravel 中禁用注册新用户的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel的二叉树中注册用户[关闭]

如何在 Firebase 3.x 中禁用注册

如何将用户重定向到以前的URL在Laravel中注册后

使用 laravel 注册新用户作为 API

如何在注册期间为用户分配角色? (委托)(Laravel 5.1)

Laravel 5 new auth:获取当前用户以及如何实现角色?