ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

m
milo526

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

Laravel 5.0 - 5.4 的 AuthController

Laravel 5.5 的 Auth/RegisterController.php

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])。干杯!
m
miken32

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

Auth::routes();

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

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


谢谢你,我不知道它是从哪个版本开始存在的,但我认为这是禁用注册部分的正确途径!
在 5.7 中是 added
在 Laravel 7 / 8 中禁用注册路由
R
Rafał G.

如果您使用 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' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });,但是当登录的用户请求 /register 时,他被重定向到 /
@Sefran2 那是因为 AuthController 调用(通过其他类和特征,这有点令人费解)中间件 App\Http\Middleware\RedirectIfAuthenticated。如果您已经登录,该中间件会将您重定向到 /。这是有道理的,如果您已登录,为什么还要注册? :-) 如果您只想允许某些类型的用户使用某些路由,则需要创建自己的中间件而不是 ['middleware' => 'auth']
对于 5.3,它们再次不同,但仍然可以在 vendor/laravel/framework/src/Illuminate/Routing/Router.php 中找到
Y
Yassin

对于 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") 为每个人绕过注册页面
那么在这种情况下,auth 用户可以注册一个新用户。
是的,这是 5.7 以下的唯一正确方法 .. 这怎么不是选择的答案
C
Christopher Geary

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

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

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


在我看来,这是正确的答案。发现不错!
A
Abed Putra

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')->name('login'); Route::post('login', 'Auth\LoginController@login'); Route::post('logout', 'Auth\LoginController@logout')->name('logout');
第一种方法错过了重定向类,但更改为 $this->middleware('auth'); - 有效!
J
JCoolinger

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

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

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

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


覆盖框架方法的类不在框架中(它们将在 app 文件夹中)并且将由 git 存储。覆盖方法并不意味着您在框架文件中更改它们。
I
Isaac Limón

拉拉维尔 5.6

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

这应该合并到接受的答案中,但只是一个小的更正。此功能是在 Laravel 5.7 中引入的,而不是 Laravel 5.6
R
Randika Vishman

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

我添加了这个功能:

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

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

它工作正常。


V
Vinay Kaithwas

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

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

k
kjdion84

这是我从 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 路由包中复制/粘贴它们,然后注释掉注册路由。
R
Randika Vishman

以下方法效果很好:

复制 /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 来控制用户注册。

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

网页.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。


D
Daniel Centore

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

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

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


v
vimuth

在 laravel 5.6 及更高版本上,您可以在 web.php 文件中进行编辑

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

如果你改变主意,你可以让它成为现实,我认为这样很容易


E
Edvard Åkerberg

这在之前的评论中已经提到过,但我想澄清一下,有多种方法可以访问 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...
]);

g
ghodder

我不得不使用:

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

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

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

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

在 Laravel 5.4 中

您可以在方法 auth() 中找到类 \Illuminate\Routing\Router 中通过 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');
}

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


T
The Billionaire Guy

在 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 文章中阅读更多关于 Auth 方法及其相关文件的信息。


您还需要修补发布路线,以避免通过发布请求注册用户。
D
David Angel

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

c
codewithfeeling

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

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


M
Motolola

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


非常长期的解决方案。一个简单的带有 abort 的函数覆盖绝对可以工作。
C
Chad Quilter

在 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 页面)
V
Vaishnav Mhetre

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

覆盖以下方法,如下所述

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

m
macalu

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

R
Ryan Dhungel

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

路线/web.php

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

A
Alien

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

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


Y
Yamen Ashraf

对于 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 视图中评论注册链接。


h
hungtran273

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

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

k
karrar kazuya

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

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

这实际上是 2 个月前这个问题留下的最后一个答案。
s
sjas

添加

use \Redirect;

在文件的顶部


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