Laravel 5.4禁用注册路由

47

我正在尝试禁用在Laravel 5.4中运行的应用程序上的注册路由。

在我的路由文件中,我只有:

Auth::routes();

有没有办法禁用注册路由?


4
在当前的 Laravel 5.7.5 版本中,有一个选项可以实现这个功能。Auth::routes(['register' => false]); - Zohaib
请参见 https://github.com/laravel/framework/blob/5.7/src/Illuminate/Routing/Router.php#L1152 的代码。 - Zohaib
13个回答

95

代码:

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');
所以您可以用路由列表替换第一个,并注释掉您不想在应用程序中使用的任何路由。
针对 Laravel 5.7 进行编辑
在更新的版本中,您可以向 `Auth::routes()` 函数调用添加一个参数来禁用注册路由:
Auth::routes(['register' => false]);

添加了电子邮件验证路由:

Route::get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');
Route::get('email/verify/{id}', 'Auth\VerificationController@verify')->name('verification.verify');
Route::get('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');

顺便说一下,您也可以禁用密码重置电子邮件验证路由:

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

为什么要在每个身份验证路由中编写整个部分,当你可以简单地使用Auth :: routes(['register' => false]);呢?为什么? - Haritsinh Gohil
2
@Haritsinh。这个问题是关于 Laravel 版本 5.4 的。在 5.4 版本中,Auth::routes() 函数不接受任何参数,这只是在更近期的版本中引入的。 - dparoli
好的,你是正确的,我的朋友。Auth::routes()在Laravel 5.7之后支持参数,但是在Laravel版本小于5.7时,你也可以像这样做:Route::redirect('register', 'login', 301);,看起来比上面的简单,不是吗? - Haritsinh Gohil
1
@Haritsinh,我想指出这个问题已经被标记并明确要求使用Laravel 5.4。在版本5.4中,函数Route::redirect()不存在。 - dparoli
好的,@dparoli,这是我的错,我没有看到redirect也被添加到了laravel 5.5中,抱歉,谢谢你的澄清。 - Haritsinh Gohil

37

自Laravel 5.7以来,$options参数被引入到Auth::routes()方法中; 通过该参数,您可以传递一个数组以控制用户认证所需路由的生成(可从字符串字面量'register''reset''verify'中选择有效条目)。

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

1
另一个选项是添加电子邮件验证路由,这些路由默认情况下是禁用的。Auth::routes(['verify' => true]); - Grant
这应该是最佳实践的答案,如果您只想禁用注册路由而不想编辑其他默认的Auth路由。 - Solid
2
这应该被视为完美的答案,因为这是忽略注册路由并与Laravel 5.8一起使用的正确方法。 - Mehul Panchasara

23

你可以尝试这个。

Route::match(['get', 'post'], 'register', function(){
    return redirect('/');
});

Auth::routes()下面添加这些路由以覆盖默认的注册路由。任何对/register路径的请求都将重定向到baseUrl。


禁用“/login”页面。 - Jason
运行得非常好。简单解决方案!谢谢! - iaforek
非常简单的解决方案,高效地工作。 - M Uzair Qadeer
@Jason false。我使用Laravel 8和Laravel UI Auth Bootstrap进行了测试。 - Freddy Daniel

7

这看起来很简单!你只需要在app/Http/Controllers/Auth/RegisterController.php类中覆盖两个方法。请参见以下内容,它将防止表单被显示,并最重要的是阻止直接向您的应用程序发送注册POST请求。

/**
 * Show the application registration form.
 *
 * @return \Illuminate\Http\Response
 */
public function showRegistrationForm()
{
    return redirect('login');
}

/**
 * Handle a registration request for the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function register(Request $request)
{
    abort(404);
}

6
在web.php中,将 Auth::routes(); 替换为 Auth::routes(['register' => false]);,这样您就可以从默认的身份验证路由列表中删除注册路由。我已经在5.7版本中尝试过,效果很好。

当我这样做时,它也禁用了我的登录页面? - rubendn

3
在我的 Laravel 5.6 项目中,这个方法没有起作用:
Auth::routes(['register' => false]);

所以我必须使用以下方法:
Route::match(['get', 'post'], 'register', function () {
    return abort(403, 'Forbidden');
})->name('register');

3

尽管上述解决方案有效,但我认为在App\Http\Controllers\Auth\RegisterController中将middleware更改为'auth'将是最简单的解决方案之一。这将重定向所有访问注册路由的访问者到登录页面。像这样:

namespace App\Http\Controllers\Auth;
class RegisterController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

这将重定向用户到登录页面。如果用户输入正确的电子邮件/密码,他仍将被重定向到注册页面,这与OP的要求不符。 - Waqas

2
我猜您可以这样在您的web.php文件中完成它:
Route::redirect('register', 'login', 301);

2

我想您希望限制访客对某些页面的访问,并且只有管理员可以注册访客。您可以通过在kernel.php文件中添加自己的中间件来实现,如下所示:

protected $routeMiddleware = [
      'authenticated' => \App\Http\Middleware\AuthenticatedMiddleware::class
];

创建完中间件后,您需要使用它。打开web.php文件,找到您想要限制的路由,并将其添加到该路由中,如下所示:
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register')->middleware('authenticated');
Route::post('register', 'Auth\RegisterController@register')->middleware('authenticated');

这种方式限制了只有访客才能注册,但是管理员仍然可以访问该页面,以便在需要注册其他管理员时进行操作!

不要忘记使用以下详细列表替换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')->middleware('authenticated');
Route::post('register', 'Auth\RegisterController@register')->middleware('authenticated');

// 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() 函数位于 routes/web.php 文件中。 - geeves

0

只需覆盖您的 auth showRegistrationForm() 方法即可(将此代码放置在您的 Auth/RegisterController 中)

public function showRegistrationForm(){
    return redirect()->route('login');
}

我只是将我的注册路由重定向到登录路由。在这里,您不需要添加或删除任何其他代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接