如何在 Laravel 禁用注册新用户

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

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

154136 次浏览

Laravel 5.7引入了以下功能:

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

目前可行的办法有:

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

对于较老的 Laravel 版本,只需在

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


public function register()
{


}

我不得不用:

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

使用 Redirect: : to ()时出现了一个错误:

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

use \Redirect;

在文件的顶部

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

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

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

这样框架文件就不会受到干扰,任何请求仍然会被重定向到框架注册模块之外。

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

我添加了以下功能:

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


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

而且运行正常。

如果您使用 Laravel 5.2,并且使用 php artisan make:auth安装了与身份验证相关的功能,那么通过简单地调用 Route::auth(),您的 app/Http/routes.php文件将包含所有与身份验证相关的路由。

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。

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

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

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

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

版本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(); 自然而然地。 请在/path/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');

谢谢! 我希望它能解决你的问题。

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

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

如果你需要使用多重身份验证,比如为用户、成员、学生、管理员等创建授权,那么我建议你检查一下这个 犹豫/多重认证,它是一个非常棒的 L5应用程序无限授权的软件包。

您可以在 这个文档中阅读更多关于 Auth 方法及其相关文件的内容。

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

你必须改变:

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

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

App/Http/Controller/Auth/RegisterController.php

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

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

下面的方法很有效:

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

这是以前的一些答案的结合,特别是拉法尔 G 和丹尼尔森托雷。

以下是我对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 将抛出一个错误。

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

在 Laravel 5.5

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

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

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


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

我可能是错的,虽然... 但它似乎比编辑路由更多的行和更少的垃圾比简单地重定向页面... 至少在这种情况下,想要锁定客人的注册。

我想这是个更好的解决办法。

中提到的下列方法重写

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

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

转到有名称空间的 app/http/controllers/RegisterController: Illuminate\Foundation\Auth\RegistersUser

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

有一个方法调用 showRegistrationForm修改 this: return view('auth.login');为 this: return redirect()->route('auth.login');并从刀片页路由调用寄存器中删除。它可能看起来是这样的:

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

我发现这是幼虫5.6最简单的解决方案!它会重定向任何试图登录 yoursite.com/register 的人

路线/web.php

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

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

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

对于 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视图中注释寄存器链接。

这在5.7中可能是新的,但是现在 auth 方法有了一个选项数组

Auth::routes();

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

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

从 Laravel 5.7开始,您可以向 Auth::routes()传递一个选项数组。然后可以使用以下方法禁用寄存器路由:

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

您可以从源代码 Src/Illumination/Routing/Router.php中看到这是如何工作的。

拉拉维尔5.6

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

在 Laravel 5.6及以上版本中,您可以在 Web.php文件中进行编辑

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

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

这在前面的评论中已经提到,但是我想澄清一下,在 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...
]);

设置 < strong > 注册路由 false 在你的 web.php 里。

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

如果您在 Laravel Breeze中使用 Laravel8,那么这些身份验证路由都在 routes/auth.php中显式列出。登记路线是最上面的前两条。

只需要注释掉那些你不想要的,Laravel 会处理剩下的,例如,如果你注释掉 forgot-password的路线,那么就不会有“忘记密码?”显示在登录窗口中的链接。

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

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

例如,对于 Laravel (Laravel v8.52.0)中的 fortify,您可以只禁用 fortify 配置文件中的注册特性

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