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

Mil*_*lad 98 php laravel

我正在尝试在Laravel 5中创建单用户管理面板(只有一个用户)并且我注册了该用户,所以现在我想禁用新用户的注册,当然登录表单必须工作但是没有来自的新注册表从今起.我怎样才能做到这一点?

我使用默认用户登录并在版本5中注册.

Lim*_*nte 170

只需覆盖showRegistrationForm()register()方法

  • AuthController 对于Laravel 5.0 - 5.4
  • Auth/RegisterController.php 对于Laravel 5.5
Auth::routes(['register' => false]);
Run Code Online (Sandbox Code Playgroud)

  • 在Laravel 5.7中,showRegistrationForm()函数位于vendor文件夹中,从技术上来说,不建议编辑vendor文件夹中的文件。基本上我建议从`web.php`中删除注册路由。您可以在web.php文件中简单地说出Auth :: routes(['register'=> false])。干杯! (7认同)
  • 将create()函数更改为:throw new Exception('Registration not possible')也许是明智之举; (5认同)
  • 对于Laravel 5.5,将其放在`Auth/RegisterController.php`中 (4认同)
  • 我不提倡这种方法,因为重载代码以删除功能从来都不是一件好事.只是不要注册与注册相关的路线. (3认同)
  • 或者你可以在`function register()`上添加`abort(404)` (2认同)

Raf*_* G. 53

如果您正在使用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');
Run Code Online (Sandbox Code Playgroud)

如果您使用的是低于5.2的版本,那么它可能会有所不同,我记得自5.0以来事情发生了很大的变化,artisan make:auth甚至在某些时候甚至被删除了IIRC.

  • 对于5.3,它们再次不同,但仍然可以在vendor/laravel/framework/src/Illuminate/Routing/Router.php中找到 (2认同)

小智 50

这可能是5.7中的新功能,但现在有一个auth方法的选项数组.简单地改变php artisan make:authphp artisan make:auth你的路线运行后,文件php artisan make:auth会禁止用户注册.


Yas*_*sin 33

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

你必须改变:

public function __construct()
    {
        $this->middleware('guest');
    }
Run Code Online (Sandbox Code Playgroud)

public function __construct()
    {
        $this->middleware('auth');
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 这将允许注册用户查看您不想要的注册页面 (3认同)
  • 使用中间件("auth")然后使用中间件("guest")绕过每个人的注册页面 (2认同)

小智 28

从Laravel 5.7开始,您可以传递一系列选项Auth::routes().然后可以使用以下命令禁用寄存器路由:

Auth::routes(['register' => false]);
Run Code Online (Sandbox Code Playgroud)

你可以从源代码中看到它是如何工作的:src/Illuminate/Routing/Router.php.


小智 26

版本5.3的方法1

在laravel 5.3中没有AuthController.要禁用注册路由,你应该改变这样的构造函数RegisterController:

你可以改变形式:

public function __construct()
{

    $this->middleware('guest');

}
Run Code Online (Sandbox Code Playgroud)

至:

use Illuminate\Support\Facades\Redirect;

public function __construct()
{

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

}
Run Code Online (Sandbox Code Playgroud)

注意:使用时Redirect 请不要忘记,以便 user Redirect; 用户访问https:// host_name /注册它重定向到"/".

版本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');
Run Code Online (Sandbox Code Playgroud)

谢谢!我希望它可以解决你的问题.


Vin*_*was 15

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

Auth::routes(['register' => false]);
Run Code Online (Sandbox Code Playgroud)

-曾在 Laravel 7 工作过


小智 11

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

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

Route::any('/auth/register','HomeController@index');
Run Code Online (Sandbox Code Playgroud)

这样,框架文件就不再存在,任何请求仍将被重定向到远离Frameworks寄存器模块.

  • 覆盖框架方法的类不在框架中(它们将在app文件夹中)并且将由git存储.覆盖方法并不意味着您在框架文件中更改它们. (4认同)

小智 11

该AuthController.php @limonte已经覆盖在app\HTTP\\控制器验证,而不是在供应商目录,所以Git不会忽略这种变化.

我添加了这个功能:

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

public function showRegistrationForm() {
    return redirect('/');
}
Run Code Online (Sandbox Code Playgroud)

它工作正常.


Isa*_*món 9

LAravel 5.6

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


kjd*_*n84 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');
Run Code Online (Sandbox Code Playgroud)

注意我已经注释掉了Auth::routes()两条注册路线.

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


Edv*_*erg 8

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

第一个选项

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

第二个选择

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


Jef*_*rey 7

以下方法效果很好:

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

然后设置条件以启用和禁用.env的注册.在视图/错误中复制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');
Run Code Online (Sandbox Code Playgroud)

这是之前一些答案的组合,特别是Rafal G.和Daniel Centore.


小智 6

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

Auth::routes(['verify' => true, 'register' => false]);
Run Code Online (Sandbox Code Playgroud)

如果您改变主意,便可以实现,我很容易做到


Dan*_*ore 5

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

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

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