我正在使用Laravel(v5)。
我需要一个用户,并且已经注册了。现在,我想为新用户禁用注册。当然,我需要登录表单才能工作。
我怎样才能做到这一点?
routes.php。要启用身份验证功能,您要做的就是添加Route::auth();到文件中。
Route::auth()倡导捷径之前。
Auth::routes(['register' => false]);中
我正在使用Laravel(v5)。
我需要一个用户,并且已经注册了。现在,我想为新用户禁用注册。当然,我需要登录表单才能工作。
我怎样才能做到这一点?
routes.php。要启用身份验证功能,您要做的就是添加Route::auth();到文件中。
Route::auth()倡导捷径之前。
Auth::routes(['register' => false]);中
Answers:
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()方法
AuthController 适用于Laravel 5.0-5.4Auth/RegisterController.php 对于Laravel 5.5public function showRegistrationForm()
{
return redirect('login');
}
public function register()
{
}
abort(404)上function register()
Auth/RegisterController.php
showRegistrationForm()功能位于vendor文件夹中,从技术上讲,建议不要在供应商文件夹中编辑文件。基本上,我建议从中删除注册路由web.php。您可以简单地Auth::routes(['register' => false])在web.php文件中说。干杯!
如果您使用的是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');
如果您使用的版本低于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']
这可能是5.7中的新增功能,但是auth方法现在有一个options数组。只需更改
Auth::routes();
至
Auth::routes(['register' => false]);
运行后在路由文件中添加php artisan make: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查看其工作原理。
在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时它会重定向到“ /”。
使用时php artisan make:auth会Auth::route();
自动添加。请在/routes/web.php中覆盖Route。您可以像这样更改它:*您需要对此行进行注释: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设置为忽略框架文件,这将导致结果仍然可以在您的生产环境中进行注册(例如,通过composer安装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('/');
}
它可以正常工作。
拉威尔5.6
Auth::routes([
'register' => false, // Registration Routes...
'reset' => false, // Password Reset Routes...
'verify' => false, // Email Verification Routes...
]);
从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()这两个注册路线。
重要:您还必须确保您删除的所有实例route('register')中的app.blade布局,或Laravel将抛出一个错误。
以下方法效果很好:
复制的所有路线/vendor/laravel/framework/src/Illuminate/Routing/Router.php并将其粘贴web.php并注释掉或删除Auth::routes()。
然后设置一个条件来启用和禁用从.env的注册。将503.blade.php文件复制到其中,views/errors并创建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。和丹尼尔·森托尔。
在laravel 5.6及更高版本上,您可以在web.php文件中进行编辑
Auth::routes(['verify' => true, 'register' => false]);
如果您改变主意,便可以实现,我很容易做到
我不得不使用:
public function getRegister()
{
return redirect('/');
}
使用Redirect :: to()给我一个错误:
Class 'App\Http\Controllers\Auth\Redirect' not found
您可以在方法Auth::routes()中的类\Illuminate\Routing\Router中找到所有通过注册的路由auth()
它看起来像这样:
/**
* 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中,您应showRegistrationForm()通过将以下代码包含在以下RegisterController.php文件中来覆盖默认值:app\Http\Controllers\Auth
/**
* 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);
\\\\\\\\\\\\\\\\\\\\\ JUST AN FYI //////////////////////////// ////
如果您需要使用多种身份验证,例如为用户,成员,学生,管理员等创建身份验证,那么我建议您签出此hesto / multi-auth这是一个了不起的软件包,可在L5应用中进行无限。
你可以阅读更多abouth的验证方法,并在其相关文件这样的书面记录。
在前面的评论中已经提到了这一点,但我想澄清一下,在Laravel ^ 5.7的web.php文件中,有多种方法可以访问身份验证路由。根据您的版本,可能看起来有些不同,但是它们可以达到相同的结果。
第一选择
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...
]);
在您的web.php中将Register route设置为false。
Auth::routes(['register' => false]);
为了避免按原样更改代码,只需创建一个中间件来检测请求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+,将以下方法粘贴到 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视图中评论注册链接。
加
use \Redirect;
在文件的顶部