我正在使用 Laravel。我想禁用新用户的注册,但我需要登录才能工作。
如何禁用注册表单/路由/控制器?
routes.php
中没有路由。要启用身份验证功能,您只需将 Route::auth();
添加到文件中即可。
Route::auth()
快捷方式被提倡之前。
Auth::routes(['register' => false]);
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()
{
}
这在 5.7 中可能是新的,但现在 auth 方法有一个选项数组。简单地改变
Auth::routes();
至
Auth::routes(['register' => false]);
运行 php artisan make:auth
后在您的路线文件中将禁用用户注册。
如果您使用 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。
Route::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });
,但是当登录的用户请求 /register
时,他被重定向到 /
App\Http\Middleware\RedirectIfAuthenticated
。如果您已经登录,该中间件会将您重定向到 /
。这是有道理的,如果您已登录,为什么还要注册? :-) 如果您只想允许某些类型的用户使用某些路由,则需要创建自己的中间件而不是 ['middleware' => '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.7 开始,您可以将一组选项传递给 Auth::routes()
。然后,您可以使用以下命令禁用注册路由:
Auth::routes(['register' => false]);
您可以从源代码中了解其工作原理:src/Illuminate/Routing/Router.php。
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');
谢谢!我希望它能解决你的问题。
$this->middleware('auth');
- 有效!
覆盖 getRegister 和 postRegister 很棘手 - 如果您使用 git,很有可能将 .gitignore
设置为忽略框架文件,这将导致在您的生产环境中仍然可以注册的结果(如果 laravel 通过安装例如作曲家)
另一种可能性是使用 routes.php 并添加以下行:
Route::any('/auth/register','HomeController@index');
这样一来,框架文件将被单独保留,任何请求仍将被重定向到框架注册模块之外。
拉拉维尔 5.6
Auth::routes([
'register' => false, // Registration Routes...
'reset' => false, // Password Reset Routes...
'verify' => false, // Email Verification Routes...
]);
已覆盖的 AuthController.php
@limonte 在 App\Http\Controllers\Auth
中,而不是在供应商目录中,因此 Git 不会忽略此更改。
我添加了这个功能:
public function register() {
return redirect('/');
}
public function showRegistrationForm() {
return redirect('/');
}
它工作正常。
在您的 web.php 中将注册路由设置为 false。
Auth::routes(['register' => false]);
这是我从 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 会抛出错误。
以下方法效果很好:
复制 /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。
在 routes.php
中,只需添加以下内容:
if (!env('ALLOW_REGISTRATION', false)) {
Route::any('/register', function() {
abort(403);
});
}
然后您可以有选择地控制是否允许在您的 .env
文件中注册。
在 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...
]);
我不得不使用:
public function getRegister()
{
return redirect('/');
}
使用 Redirect::to() 给了我一个错误:
Class 'App\Http\Controllers\Auth\Redirect' not found
在 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');
}
只需复制您想要/需要的路线就可以了!
在 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 方法及其相关文件的信息。
在 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 8 与 Laravel Breeze 一起使用,则这些身份验证路由都明确列在 routes/auth.php
中。注册路线是顶部的前两条。
只需注释掉你不想要的,Laravel 会处理其余的,例如。如果您注释掉 forgot-password
的路线,则不会出现“忘记密码?”登录窗口中显示的链接。
为了不改变代码,只需创建一个中间件来检测请求 url 是否为 url('register'),然后重定向到 404 或做任何地方。
在 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
页面)
我想这会是一个更好的解决方案。
覆盖以下方法,如下所述
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);
}
在 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>
我发现这是 laravel 5.6 中最简单的解决方案!它将尝试访问 yoursite.com/register 的任何人重定向到 yoursite.com
路线/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
特征中覆盖这些方法,只要您改变主意,就删除这些方法。您还可以在 welcome.blade.php
和 login.blade.php
视图中评论注册链接。
对于 Fortify 用户,更改 config/fortify.php
'features' => [
// Features::registration(), // --------> comment out this
Features::resetPasswords(),
// Features::emailVerification(),
Features::updateProfileInformation(),
Features::updatePasswords(),
Features::twoFactorAuthentication(),
],
对于像(Laravel v8.52.0)中带有强化的laravel,您可以在强化配置文件中禁用注册功能,例如
'features' => [
//Features::registration(),
//Features::resetPasswords(),
// Features::emailVerification(),
Features::updateProfileInformation(),
Features::updatePasswords(),
Features::twoFactorAuthentication([
'confirmPassword' => true,
]),
]
添加
use \Redirect;
在文件的顶部
不定期副业成功案例分享
function register()
上添加abort(404)
Auth/RegisterController.php
showRegistrationForm()
函数位于vendor
文件夹中,从技术上讲,不建议编辑 vendor 文件夹中的文件。基本上我推荐的是从web.php
中删除注册路由。您可以在web.php
文件中简单地说Auth::routes(['register' => false])
。干杯!