首页 文章

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

提问于
浏览
76

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

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

24 回答

  • 5

    use \Redirect;
    

    在文件的顶部

  • 15

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

    • AuthController for Laravel 5.0 - 5.4
      对于Laravel 5.5来说
    • Auth/RegisterController.php
    public function showRegistrationForm()
    {
        return redirect('login');
    }
    
    public function register()
    {
    
    }
    
  • 8

    如果您正在使用Laravel 5.2,并且您使用 php artisan make:auth 安装了与auth相关的功能,那么您的 app/Http/routes.php 文件将通过简单地调用 Route::auth() 来包含所有与auth相关的路由 .

    auth()方法可以在 vendor/laravel/framework/src/Illuminate/Routing/Router.php 中找到 . 因此,如果您想按照某些人的建议去做并通过删除不需要的路线来禁用注册(可能是个好主意),那么您必须从auth()方法复制您仍然需要的路由并将它们放入 app/Http/routes.php (将呼叫替换为路线:: 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.0以来事情发生了很大变化,在某些时候 artisan make:auth 甚至被删除了IIRC .

  • 130

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

    你必须改变:

    public function __construct()
        {
            $this->middleware('guest');
        }
    

    public function __construct()
        {
            $this->middleware('auth');
        }
    

    app/Http/Controller/Auth/RegisterController.php

  • 0

    方法1 for 5.3版

    在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它的重定向到"/" .

    方法2 for 5.3版

    当我们使用 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');
    

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

  • 3

    这可能是5.7中的新功能,但现在有一个auth方法的选项数组 . 运行 php artisan make:auth 后,只需在路径文件中将 Auth::routes(); 更改为 Auth::routes(['register' => false]); 即可禁用用户注册 .

  • 1

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

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

    Route::any('/auth/register','HomeController@index');
    

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

  • 2

    AuthController.php @limonte的覆盖位于App \ Http \ Controllers \ Auth中,而不是在供应商目录中,因此Git不会忽略此更改 .

    我添加了这个功能:

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

    它工作正常 .

  • 4

    继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() 和两条注册路线 .

    Important: 您还必须确保在 app.blade 布局中删除 route('register') 的所有实例,否则Laravel将抛出错误 .

  • 2

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

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

    您可以从源代码中看到它的工作原理:src/Illuminate/Routing/Router.php .

  • 27

    The following method works great:

    复制/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');
    

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

  • 9

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

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

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

  • 1

    在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');
    }
    

    只需复制您想要/需要的路线,你就可以了!

  • 9

    In Laravel 5.5

    我试图在Laravel 5.5中完成同样的问题 . 而不是使用 Auth::routes() 在web.php路由文件中,我只包含登录/注销路由:

    Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
    Route::post('login', 'Auth\LoginController@login');
    Route::post('logout', 'Auth\LoginController@logout')->name('logout');
    
  • 0

    我不得不使用:

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

    使用Redirect :: to()给了我一个错误:

    Class 'App\Http\Controllers\Auth\Redirect' not found
    
  • 26

    在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);

    这只是一个虚假的/////////////////////////// ////

    如果您需要为用户,成员,学生,管理员等使用多次身份验证,例如create auth,那么我建议您查看这个hesto/multi-auth这是一个非常棒的程序包,可以在L5应用程序中使用无限制的身份验证 .

    您可以在this writeup中阅读有关Auth方法及其相关文件的更多信息 .

  • 1

    In 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');
    }
    

    虽然我可能是错的...但是它比使用更多线条编辑路由更简单,而不仅仅是简单地重定向页面......至少在这种情况下,想要锁定访客的注册 .

  • 1

    我想这可能是一个更好的解决方案 .

    覆盖以下方法,如下所述

    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);
    }
    
  • 1

    我发现这是laravel 5.6中最简单的解决方案!它会将尝试访问yoursite.com/register的任何人重定向到yoursite.com

    routes/web.php

    // redirect from register page to home page
    Route::get('/register', function () {
        return redirect('/');
    });
    
  • 7

    我所做的只是用登录刀片代码替换寄存器刀片代码 . 这样注册仍然会登录 .

    resources/views/auth/register.blade.php 替换为 resources/views/auth/login.blade.php

  • 9

    对于Laravel 5.6,将以下方法粘贴到 app\Http\Controller\Auth\RegisterController

    /*
    * Disabling registeration.
    *
    */
    public function register() 
    {
        return redirect('/');
    }
    
    /*
    * Disabling registeration.
    *
    */
    public function showRegistrationForm() 
    {
        return redirect('/');
    }
    

    现在你在 RegistersUser trait中覆盖这些方法,每当你改变主意时移除这些方法 . 您还可以在 welcome.blade.phplogin.blade.php 视图中注释注册链接 .

  • -8

    LAravel 5.6

    Auth::routes([
        'register' => false, // Registration Routes...
        'reset' => false, // Password Reset Routes...
        'verify' => false, // Email Verification Routes...
    ]);
    
  • 1

    为了不按原样更改代码,只需创建一个中间件来检测请求url是否为url('register'),然后重定向到404或在任何地方执行 .

  • 50

    在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>
    

相关问题