Laravelで新規ユーザーの登録を無効にする方法


130

私はLaravel(v5)を使用しています。

1人のユーザーが必要ですが、すでに登録しています。ここで、新しいユーザーの登録を無効にします。もちろん、ログインフォームが機能する必要があります。

どうやってやるの?


登録関連のメソッドをroutes.phpファイルから削除するだけです。メソッドを空白のメソッドでオーバーライドしないでください。将来的にその機能を再度有効にする場合にボディを再度追加する必要があるため、これは恐ろしくハックなアプローチです。
Martin Bean

1
@MartinBeanにはルートがありませんroutes.php。認証機能を有効にするRoute::auth();には、ファイルに追加するだけです。
miken32 2016年

@ miken32私のコメントは、Route::auth()ショートカットが提唱される前の5か月以上前のものです。
Martin Bean

5
あなたがweb.phpでlaravel 5.5以上 Auth::routes(['register' => false]);にいる場合
Manojkiran.A

回答:


234

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.4
  • Auth/RegisterController.php Laravel 5.5の場合
public function showRegistrationForm()
{
    return redirect('login');
}

public function register()
{

}

5
create()関数を次のように変更することも賢明かもしれません。
JinX 2016

2
またはあなたが追加することができますabort(404)function register()
ウィリアムNotowidagdo

3
コードをオーバーロードして機能を削除することは決して良いことではないので、私はこのアプローチを推奨しません。登録関連のルートは登録しないでください。
Martin Bean

4
Laravel 5.5の場合、これをAuth/RegisterController.php
挿入

7
Laravel 5.7では、showRegistrationForm()関数はvendorフォルダー内にあり、技術的にはベンダーフォルダー内のファイルを編集することはお勧めません。基本的に私がお勧めするのは、からルートを削除することですweb.php。あなたは、単に言うことができるAuth::routes(['register' => false])web.phpファイル。乾杯!
Ahamed Rasheed

55

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も削除されました。


登録ルートを削除する代わりに、特定のタイプのユーザーに対してのみそれらを有効にすることは可能ですか?
Sefran2 2016年

@ Sefran2これは、グループをミドルウェアに関連付けることで実現できます。チェックアウトlaravel.com/docs/5.2/routing#route-groupsを
ラファウG.

まず、私はを試しましRoute::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });たが、ログインしたユーザーがリクエストする/registerとリダイレクトされます/
Sefran2

1
@ Sefran2これは、AuthControllerがミドルウェアを(他のクラスや特性を介して、少し複雑に)呼び出しているためですApp\Http\Middleware\RedirectIfAuthenticated。そして、そのミドルウェア/は、すでにログインしている場合にリダイレクトします。これは理にかなっていますが、ログインしている場合に登録する理由は何ですか?:-)あなたはユーザーだけのいくつかの種類にはいくつかのルートを許可したい場合は、あなたがあなた自身のミドルウェアを作成する代わりにする必要があります['middleware' => 'auth']
ラファウG.

2
5.3では、これらは再び異なりますが、ベンダー/laravel/framework/src/Illuminate/Routing/Router.php
Matthieu

51

これは5.7で新しく追加された可能性がありますが、authメソッドにオプション配列が追加されました。単に変える

Auth::routes();

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

実行後のルートファイルで、php artisan make:authユーザー登録が無効になります。


1
おかげで、どのバージョンが存在するのかわかりませんが、登録部分を無効にするための正しい道だと思います!
Olivier Rochaix 2018年

5.7 で追加されました。
Džuris

34

Laravel 5.3および5.4の場合、適切な方法は次のとおりです。

変更する必要があります:

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

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

アプリ/ HTTP /コントローラ/認証/ RegisterController.php


1
良くやった!この方法は、投稿を介してユーザーを作成するためのPOSTリクエストからも保護すると思いますか?
ゲディミナス2017年

3
これにより、登録済みのユーザーはあなたが望まない登録ページを見ることができます
ahmed

2
ミドルウェア( "auth")を使用してからミドルウェア( "ゲスト")を使用して、すべてのユーザーの登録ページをバイパスします
user3425867

1
この場合、認証ユーザーは新しいユーザーを登録できます。
ムハンマドアザム

はい、これは5.7未満の場合の唯一の適切な方法です。これは選択された回答ではないのです
user3548161


26

バージョン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();

}

注:使用する場合Redirectuser Redirect;https:// host_name / registerへのユーザーアクセスを忘れないでください 。「/」にリダイレクトされます。

バージョン5.3の方法2

使用するphp artisan make:authAuth::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');

ありがとう!それがあなたの問題を解決できることを願っています。


vendor / laravel / framework / src / Illuminate / Routing / Router.php Route :: get( 'login'、 'Auth \ LoginController @ showLoginForm')-> name( 'login');で指定されているようなルート名を追加します。Route :: post( 'login'、 'Auth \ LoginController @ login'); Route :: post( 'logout'、 'Auth \ LoginController @ logout')-> name( 'logout');
Luciano Fantuzzi 16

最初のメソッドで失敗したリダイレクトクラスですが、次のように変更されます$this->middleware('auth');-機能します!
ゲディミナス2017年

12

getRegisterとpostRegisterの上書きはトリッキーです-gitを使用している場合、.gitignoreフレームワークファイルを無視するように設定されている可能性が高いため、本番環境で登録が可能であるという結果につながります(たとえば、laravelがcomposerを介してインストールされている場合) )

もう1つの可能性は、routes.phpを使用して次の行を追加することです。

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

このようにして、フレームワークファイルはそのままにされ、リクエストはフレームワーク登録モジュールからリダイレクトされます。


4
フレームワークメソッドをオーバーライドするクラスはフレームワーク内になく(appフォルダーにあります)、gitによって保存されます。メソッドをオーバーライドしても、フレームワークファイルでメソッドを変更する必要はありません。
datashaman 2016年

11

AuthController.php@limonteはオーバーライドされている中でApp\Http\Controllers\AuthGitがこの変更を無視しないように、ではないベンダーのディレクトリに、。

私はこの機能を追加しました:

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

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

そしてそれは正しく動作します。


9

LAravel 5.6

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

これは受け入れられた回答にマージする必要がありますが、ほんの小さな修正です。この機能はLaravel 5.6ではなくLaravel 5.7で導入されました
WebSpanner

8

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()と、2つの登録ルートに注意してください。

重要:レイアウトroute('register')内ののすべてのインスタンスを削除する必要もありますそうしないapp.bladeと、Laravelがエラーをスローします。


^これ。これらのルートが変更される場合は、@ github.com / laravel / framework / blob / …にあるAuthルートバンドルからそれらをコピーして貼り付け、登録ルートをコメント化してください。
pbond 2017

7

次の方法はうまくいきます:

からすべてのルートをコピーして/vendor/laravel/framework/src/Illuminate/Routing/Router.php貼り付けweb.php、コメント化または削除しAuth::routes()ます。

次に、.envからの登録を有効および無効にする条件を設定します。で503.blade.phpファイルを複製しviews/errors、403 forbiddenまたは好きなものを作成します。

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の組み合わせです。


6

laravel 5.6以降では、web.phpファイルで編集できます

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

気が変わったらそれを本当にすることができます


5

routes.php、以下を追加するだけです。

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

次に、.envファイルへの登録を許可するかどうかを選択的に制御できます。


3

私は使用しなければなりませんでした:

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

Redirect :: to()を使用するとエラーが発生しました:

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

ありがとう、これは新しいバージョンの機能です。この関数を使用するか、前のクラスを使用できますが、前のクラスはその前に\が必要です。つまり、\ Redirect :: to( 'destination');
Milad Rahimi、2015年

3

Laravel 5.4では

メソッドで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');
}

あなたが欲しい/必要なルートをコピーするだけで大​​丈夫です!


2

laravel 5.3では、showRegistrationForm()以下のコードRegisterController.phpapp\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ので、侵入者が彼が失われたことを知るように投げるだけの方が良いです。そして、あなたは自分のアプリでregistraationの準備ができている、コメントを外し//return view('auth.register');た後のコメントabort(404);

\\\\\\\\\\\\\\\\\\\\ JUST AN FYI /////////////////////////// ////

ユーザー、メンバー、学生、管理者などの認証の作成など、複数の認証を使用する必要がある場合は、このヘスト/マルチ認証をチェックアウトして、L5アプリで無制限の認証を行うための素晴らしいパッケージをお勧めします。

Authの方法論とその関連ファイルの詳細については、この記事をご覧ください。


2
また、投稿リクエストによるユーザーの登録を回避するために、投稿ルートにパッチを適用する必要もあります。
Vaishnav Mhetre

2

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

2

これは以前のコメントで言及されていますが、Laravel ^ 5.7のweb.phpファイルで認証ルートにアクセスする方法が複数あることを明確にしたいと思います。バージョンによっては少し異なって見えるかもしれませんが、同じ結果が得られます。

最初のオプション

Route::auth([
  'register' => false, // Registration Routes...
  'reset' => false, // Password Reset Routes...
  'verify' => false, // Email Verification Routes...
]);

2番目のオプション

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


0

コードをそのまま変更しないようにするには、ミドルウェアを作成して、リクエストのURLがurl( 'register')かどうかを検出し、404にリダイレクトするか、どこでも実行します。


1
非常に長期的なソリューション。abortを使用した単純な関数オーバーライドは確実に機能します。
Vaishnav Mhetre

0

Laravel 5.5の場合

同様の問題に取り組み、ゲストからのミドルウェア引数を「auth」に設定することは、よりエレガントなソリューションのように見えました。

ファイルの編集:app-> http-> Controllers-> Auth-> RegisterController.php

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

     //with this argument.
       $this->middleware('auth');
}

私は間違っているかもしれません...しかし、単にページをリダイレクトするよりも、行数を増やして恥ずかしさを減らしてルーティングを編集するよりも洗練されているようです...少なくともこの場合、ゲストの登録をロックダウンしたいと考えています。


ユーザーがこの方法を使用して複数回登録できるかどうか知りたいと思います。guestミドルウェアは、すでにわずかゲストが(すなわちアクセスできるページからログインしているユーザーに責任リダイレクトしている/registerページ)
キングスレー

0

これはむしろ良い解決策になると思います。

以下で説明されているように、以下のメソッドをオーバーライドします

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

0

CRUDルートシステムを使用している場合、Laravel 5.5は非常にシンプルです。

行く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> 

0

これがlaravel 5.6で最も簡単な解決策であることがわかりました。yoursite.com/registerにアクセスしようとするすべてのユーザーをyoursite.comにリダイレクトします

routes / web.php

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

0

私が行ったのは、レジスタブレードコードをログインブレードコードに置き換えることだけでした。そうすれば、登録はまだログインに行きます。

resources/views/auth/register.blade.php に置き換えられます resources/views/auth/login.blade.php


0

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.phplogin.blade.phpビューで登録リンクにコメントすることもできます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.