我正在尝试禁用在Laravel 5.4中运行的应用程序上的注册路由。
在我的路由文件中,我只有:
Auth::routes();
有没有办法禁用注册路由?
我正在尝试禁用在Laravel 5.4中运行的应用程序上的注册路由。
在我的路由文件中,我只有:
Auth::routes();
有没有办法禁用注册路由?
代码:
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(['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 GohilAuth::routes()
函数不接受任何参数,这只是在更近期的版本中引入的。 - dparoliAuth::routes()
在Laravel 5.7之后支持参数,但是在Laravel版本小于5.7时,你也可以像这样做:Route::redirect('register', 'login', 301);
,看起来比上面的简单,不是吗? - Haritsinh GohilRoute::redirect()
不存在。 - dparoliredirect
也被添加到了laravel 5.5
中,抱歉,谢谢你的澄清。 - Haritsinh Gohil自Laravel 5.7以来,$options
参数被引入到Auth::routes()
方法中; 通过该参数,您可以传递一个数组以控制用户认证所需路由的生成(可从字符串字面量'register'
、'reset'
或'verify'
中选择有效条目)。
Auth::routes(['register' => false]);
Auth::routes(['verify' => true]);
- Grant你可以尝试这个。
Route::match(['get', 'post'], 'register', function(){
return redirect('/');
});
在Auth::routes()
下面添加这些路由以覆盖默认的注册路由。任何对/register
路径的请求都将重定向到baseUrl。
这看起来很简单!你只需要在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);
}
Auth::routes();
替换为 Auth::routes(['register' => false]);
,这样您就可以从默认的身份验证路由列表中删除注册路由。我已经在5.7版本中尝试过,效果很好。Auth::routes(['register' => false]);
Route::match(['get', 'post'], 'register', function () {
return abort(403, 'Forbidden');
})->name('register');
尽管上述解决方案有效,但我认为在App\Http\Controllers\Auth\RegisterController
中将middleware
更改为'auth'
将是最简单的解决方案之一。这将重定向所有访问注册路由的访问者到登录页面。像这样:
namespace App\Http\Controllers\Auth;
class RegisterController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
Route::redirect('register', 'login', 301);
我想您希望限制访客对某些页面的访问,并且只有管理员可以注册访客。您可以通过在kernel.php文件中添加自己的中间件来实现,如下所示:
protected $routeMiddleware = [
'authenticated' => \App\Http\Middleware\AuthenticatedMiddleware::class
];
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 showRegistrationForm() 方法即可(将此代码放置在您的 Auth/RegisterController 中)
public function showRegistrationForm(){
return redirect()->route('login');
}
我只是将我的注册路由重定向到登录路由。在这里,您不需要添加或删除任何其他代码。
Auth::routes(['register' => false]);
- Zohaib