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


-11

더하다

use \Redirect;

파일 맨 위에


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

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

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