Laravel에서 신규 사용자 등록을 비활성화하는 방법


130

저는 Laravel (v5)을 사용하고 있습니다.

한 명의 사용자가 필요하며 이미 등록했습니다. 이제 새 사용자 등록을 비활성화하고 싶습니다. 물론 작동하려면 로그인 양식이 필요합니다.

어떻게 할 수 있습니까?


route.php 파일 에서 등록 관련 메소드를 제거하기 만하면 됩니다. 메서드를 공백으로 재정의 하지 마십시오 . 나중에 해당 기능을 다시 활성화하기로 결정한 경우 본문을 다시 추가해야하므로 끔찍하고 해킹적인 접근 방식입니다.
— Martin Bean

1
@MartinBean에 경로가 없습니다 routes.php. 인증 기능을 활성화하려면 Route::auth();파일에 추가 하기 만하면됩니다.
— miken32

@ miken32 내 의견은 Route::auth()바로 가기가 옹호 되기 전 5 개월 이상 전의 것 입니다.
— Martin Bean

5
web.php에서 laravel 5.5 Auth::routes(['register' => false]);이상인 경우
— Manojkiran.A

답변:


236

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 () 함수를 다음과 같이 변경하는 것이 좋습니다. throw new Exception ( 'Registration not possible');
— JinX

2
또는 당신은 추가 할 수 있습니다 abort(404)에function register()
— 윌리엄 Notowidagdo에게

3
기능을 제거하기 위해 코드를 오버로딩하는 것은 결코 좋은 일이 아니기 때문에이 접근 방식을 옹호하지 않습니다. 등록 관련 경로를 등록하지 마십시오.
— Martin Bean

4
Laravel 5.5의 경우 다음을 입력하십시오Auth/RegisterController.php
— kapoko

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:authIIRC가 제거되었습니다.


등록 경로를 제거하는 대신 특정 유형의 사용자에 대해서만 활성화 할 수 있습니까?
— Sefran2

@ 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의 경우 다시 한 번 다르지만 vendor / 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

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 요청으로부터 보호한다고 생각합니까?
— Gediminas

3
이렇게하면 등록 된 사용자가 원하지 않는 등록 페이지를 볼 수 있습니다.
— ahmed

2
미들웨어 ( "auth") 다음에 미들웨어 ( "guest")를 사용하여 모든 사람의 등록 페이지를
— 건너 뛰십시오

1
이 경우 인증 사용자는 새 사용자를 등록 할 수 있습니다.
— Muhammad Azam

예 이것은 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();

}

참고 : 사용 하려면 https : // host_name / register에 대한 사용자 액세스를 Redirect 잊지 마세요 . "/"로 리디렉션됩니다.user Redirect;

버전 5.3의 방법 2

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

감사! 나는 그것이 당신의 문제를 해결할 수 있기를 바랍니다.


vendor / laravel / framework / src / Illuminate / Routing / Router.php Route :: get ( 'login', 'Auth \ LoginController @ showLoginForm')-> name ( 'login');에 지정된 것과 같은 경로 이름을 추가합니다. 경로 :: post ( 'login', 'Auth \ LoginController @ login'); 경로 :: post ( 'logout', 'Auth \ LoginController @ logout')-> name ( 'logout');
— Luciano Fantuzzi

리디렉션 클래스가 첫 번째 방법에서 누락되었지만 $this->middleware('auth');-작동합니다!
— Gediminas

12

getRegister 및 postRegister를 덮어 쓰는 것은 까다 롭습니다. git을 사용하는 경우 .gitignore프레임 워크 파일을 무시하도록 설정되어 프로덕션 환경에서 등록이 여전히 가능하다는 결과를 초래할 가능성이 높습니다 (예를 들어 laravel이 composer를 통해 설치된 경우) )

또 다른 가능성은 routes.php를 사용하고 다음 줄을 추가하는 것입니다.

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

이렇게하면 프레임 워크 파일이 그대로 유지되고 모든 요청이 프레임 워크 등록 모듈에서 멀리 리디렉션됩니다.


4
프레임 워크 메서드를 재정의하는 클래스는 프레임 워크에 없으며 (앱 폴더에 있음) git에 의해 저장됩니다. 메서드를 재정의한다고해서 프레임 워크 파일에서 메서드를 변경하는 것은 아닙니다.
— datashaman

11

AuthController.php@limonte는에 오버라이드 (override)가 App\Http\Controllers\Auth망할 놈의이 변화를 무시하지 않도록 아닌 공급 업체 디렉토리.

이 기능을 추가했습니다.

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()하고 두 개의 등록 경로를 확인하십시오.

중요 : 레이아웃 route('register')에서 모든 인스턴스를 제거해야합니다 . 그렇지 않으면 app.bladeLaravel에서 오류가 발생합니다.


^ 이것. 이러한 경로가 변경되는 경우 @ github.com/laravel/framework/blob/… 에있는 인증 경로 번들에서 복사 / 붙여 넣기하고 등록 경로를 주석 처리하면됩니다.
— pbond

7

다음 방법은 훌륭하게 작동합니다.

모든 경로를 복사 /vendor/laravel/framework/src/Illuminate/Routing/Router.php하여에 붙여넣고 web.php주석 처리하거나 삭제하십시오 Auth::routes().

그런 다음 .env에서 등록을 활성화 및 비활성화하는 조건을 설정합니다. 503.blade.php파일을 복제하고 views/errors403 금지 또는 원하는 것을 만듭니다.

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

\\\\\\\\\\\\\\\\\\\\ 참고로 ////////////////////////// ////

사용자, 회원, 학생, 관리자 등에 대한 인증 생성과 같은 다중 인증을 사용해야하는 경우 L5 앱에서 무제한 인증 을위한 멋진 패키지 인 hesto / multi-auth 를 확인하는 것이 좋습니다 .

이 글 에서 인증 방법론 및 관련 파일에 대해 자세히 알아볼 수 있습니다 .


2
또한 post request를 통한 사용자 등록을 피하기 위해 post route를 패치해야합니다.
— 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...
]);

두 번째 옵션

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

1

web.php에서 Register route false 를 설정 하십시오.

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

0

코드를 그대로 변경하지 않으려면 요청 URL이 url ( 'register')인지 감지하는 미들웨어를 만든 다음 404로 리디렉션하거나 어디에서나 수행하십시오.


1
매우 장기적인 솔루션. 중단을 사용한 간단한 함수 재정의는 확실히 작동 할 수 있습니다.
— 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

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> 

0

나는 이것이 laravel 5.6에서 가장 쉬운 솔루션이라는 것을 알았습니다! yoursite.com/register로 이동하려는 모든 사람을 yoursite.com으로 리디렉션합니다.

route / 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.php및 login.blade.php보기 의 등록 링크에 주석을 달 수도 있습니다.


-11

더하다

use \Redirect;

파일 맨 위에


\ Redirect 사용을 의미합니다.
— Mike Miller

이것은 완전한 대답이 아닙니다.
— Martin Bean

어떤 파일의 상단에? 솔루션이 불완전하고 혼란 스럽습니다.
— The Dead Guy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.