Como desativar o registro de novos usuários no Laravel


130

Estou usando o Laravel (v5).

Preciso de um usuário e já o registrei. Agora eu quero desativar o registro para novos usuários. Claro, preciso do formulário de login para funcionar.

Como eu posso fazer isso?


Apenas remova os métodos relacionados ao registro do seu arquivo routes.php . Não substitua os métodos por métodos em branco - é uma abordagem horrível e invasiva, pois você precisará adicionar novamente os corpos se decidir reativar esse recurso no futuro.
Martin Bean

1
@MartinBean não há rotas routes.php. Para habilitar as funções de autenticação, tudo o que você faz é adicionar Route::auth();ao arquivo.
Miken32

@ miken32 Meu comentário foi de mais de cinco meses atrás, antes que o Route::auth()atalho fosse defendido.
Martin Bean

5
se você estiver em laravel 5.5 e acima Auth::routes(['register' => false]);no web.php
Manojkiran.A

Respostas:


234

O Laravel 5.7 introduziu a seguinte funcionalidade:

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

As opções atualmente possíveis aqui são:

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

Para versões mais antigas Laravel apenas substituir showRegistrationForm()e register()métodos

  • AuthController para o Laravel 5.0 - 5.4
  • Auth/RegisterController.php para o Laravel 5.5
public function showRegistrationForm()
{
    return redirect('login');
}

public function register()
{

}

5
Pode ser aconselhável alterar também a função create () para: lançar nova exceção ('Registro não possível');
o JinX 13/04

2
ou você pode adicionar abort(404)emfunction register()
William Notowidagdo

3
Eu não defenderia essa abordagem, pois sobrecarregar o código para remover um recurso nunca é uma coisa boa. Apenas não registre as rotas relacionadas ao registro.
Martin Bean

4
Para o Laravel 5.5, coloque isso emAuth/RegisterController.php
kapoko

7
No Laravel 5.7, a showRegistrationForm()função está na vendorpasta, tecnicamente não é recomendável editar arquivos na pasta do fornecedor. Basicamente, o que eu recomendo é remover a rota de registro web.php. Você pode simplesmente dizer Auth::routes(['register' => false])em web.phparquivo. Felicidades!
Ahamed Rasheed

55

Se você estiver usando o Laravel 5.2 e tiver instalado a funcionalidade relacionada à autenticação php artisan make:auth, seu app/Http/routes.phparquivo incluirá todas as rotas relacionadas à autenticação simplesmente chamando Route::auth().

O método auth () pode ser encontrado em vendor/laravel/framework/src/Illuminate/Routing/Router.php. Portanto, se você quiser fazer o que algumas pessoas sugerem aqui e desativar o registro removendo rotas indesejadas (provavelmente uma boa ideia), copie as rotas que ainda deseja do método auth () e coloque-as app/Http/routes.php(substituindo a chamada para Route :: auth ()). Então, por exemplo:

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

Se você estiver usando a versão inferior à 5.2, provavelmente é diferente, lembro que as coisas mudaram bastante desde o 5.0, em algum momento artisan make:authfoi até removido o IIRC.


Em vez de remover as rotas de registro, é possível habilitá-las apenas para um tipo específico de usuário?
Sefran2

@ Sefran2 Você pode conseguir isso associando grupos ao middleware. Confira laravel.com/docs/5.2/routing#route-groups
Rafał G.

Primeiro de tudo, eu tentei Route::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });, mas quando o usuário conectado solicita /registerque ele é redirecionado para/
Sefran2

1
@ Sefran2 Isso ocorre porque o AuthController chama (por outras classes e características, é um pouco complicado) o middleware App\Http\Middleware\RedirectIfAuthenticated. E esse middleware o redireciona para /se você já estiver logado. O que faz sentido, por que você deseja se registrar se estiver logado? :-) Se você quiser permitir que apenas algumas rotas para alguns tipos de usuários, você precisa criar o seu próprio middleware, em vez de['middleware' => 'auth']
Rafał G.

2
Para o 5.3, eles são diferentes mais uma vez, mas ainda podem ser encontrados em vendor / laravel / framework / src / Illuminate / Routing / Router.php
Matthieu

51

Isso pode ser novo na versão 5.7, mas agora existe uma matriz de opções para o método auth. Simplesmente mudando

Auth::routes();

para

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

no arquivo de rotas após a execução php artisan make:authdesabilitará o registro do usuário.


1
Obrigado por isso, não sei desde que versão existe, mas acho que é o caminho certo para desativar a parte do registro!
Olivier Rochaix 11/10/1918

Foi adicionado em 5.7.
Džuris

34

Para o Laravel 5.3 e 5.4, aqui está a maneira correta de fazer isso:

Você precisa mudar:

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

para

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

em app / Http / Controller / Auth / RegisterController.php


1
bom trabalho! Eu acho que desta forma também protege contra solicitação POST para criar usuário via post?
Gediminas

3
isso permitirá que os usuários registrados para ver a página de registro que você não iria querer
Ahmed

2
Use middleware ( "auth"), em seguida, middleware ( "convidado") para página de registo de bypass para todos
user3425867

1
então, um usuário de autenticação pode registrar um novo usuário nesse caso.
Muhammad Azam

Sim, esta é a única maneira adequada para algo abaixo de 5,7 .. como essa não é a resposta selecionada
user3548161


26

Método 1 para versão 5.3

No laravel 5.3, não há AuthController. Para desativar a rota de registro, você deve alterar o construtor da RegisterControllerseguinte forma:

Você pode alterar a forma:

public function __construct()
{

    $this->middleware('guest');

}

para:

use Illuminate\Support\Facades\Redirect;

public function __construct()
{

    Redirect::to('/')->send();

}

Nota: para uso Redirect , não esqueça de user Redirect; acessar o usuário para https: // host_name / register, ele é redirecionado para "/".

Método 2 para versão 5.3

Quando usamos php artisan make:auth, é adicionado Auth::route(); automaticamente. Substitua a rota em /routes/web.php. Você pode mudar assim: * você precisa comentar esta linha: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');

Obrigado! Espero que possa resolver seus problemas.


Eu adicionaria nomes de rota como especificado em 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') -> nome ('logout');
Luciano Fantuzzi

Classe de redirecionamento perdida no primeiro método, mas mudar para $this->middleware('auth');- funciona!
Gediminas

12

Substituir o getRegister e o postRegister é complicado - se você estiver usando o git, existe uma grande possibilidade .gitignorede ignorar arquivos de estrutura, o que levará ao resultado de que o registro ainda será possível no seu ambiente de produção (se o laravel estiver instalado via compositor, por exemplo )

Outra possibilidade é usar o routes.php e adicionar esta linha:

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

Dessa forma, os arquivos da estrutura são deixados em paz e qualquer solicitação ainda será redirecionada para fora do módulo de registro das estruturas.


4
As classes que substituem os métodos da estrutura não estão na estrutura (elas estariam na pasta do aplicativo) e seriam armazenadas pelo git. Substituir métodos não significa que você os altera nos arquivos da estrutura.
Datashaman

11

O AuthController.php@limonte substituído está dentro App\Http\Controllers\Auth, não no diretório do fornecedor, portanto o Git não ignora essa alteração.

Eu adicionei estas funções:

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

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

e funciona corretamente.


9

LAravel 5.6

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

Isso deve ser mesclado na resposta aceita, mas apenas uma correção menor. Este recurso foi introduzido em Laravel 5.7, não Laravel 5.6
WebSpanner

8

Heres minha solução a partir da versão 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');

Observe que comentei Auth::routes()e as duas rotas de registro.

Importante: você também deve remover todas as instâncias do route('register')seu app.bladelayout, ou o Laravel lançará um erro.


^ isso. Caso essas rotas mudem, simplesmente copie / cole-as no pacote de rotas Auth localizado em github.com/laravel/framework/blob/… e comente as rotas de registro.
pbond

7

O método a seguir funciona muito bem:

Copie todas as rotas /vendor/laravel/framework/src/Illuminate/Routing/Router.phpe cole-as web.phpe comente ou exclua Auth::routes().

Em seguida, configure um condicional para ativar e desativar o registro de .env. Duplique o 503.blade.phparquivo views/errorse crie um 403 proibido ou o que você quiser.

Adicione ALLOW_USER_REGISTRATION=a .env e controle o registro do usuário, definindo seu valor como verdadeiro ou falso.

Agora você tem controle total das rotas e os arquivos do fornecedor permanecem intocados.

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

Esta é uma combinação de algumas respostas anteriores, especialmente Rafal G. e Daniel Centore.


6

No laravel 5.6 e acima, você pode editar no arquivo web.php

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

e você pode torná-lo realidade, se mudar de idéia, acho fácil assim


5

Em routes.php, basta adicionar o seguinte:

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

Em seguida, você pode controlar seletivamente se o registro é permitido ou não no seu .envarquivo.


3

Eu tive que usar:

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

Usar Redirect :: to () me deu um erro:

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

Obrigado, sim, este é o novo recurso de versão, você pode usar esta função ou usar a classe anterior, mas a classe anterior precisa \ antes dela, quero dizer \ Redirect :: to ('destination');
Milad Rahimi

3

No Laravel 5.4

Você pode encontrar todas as rotas registradas Auth::routes()na classe \Illuminate\Routing\Routerno métodoauth()

Se parece com isso:

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

Basta copiar as rotas que você deseja / precisa e você está bem!


2

No laravel 5.3, você deve substituir o padrão showRegistrationForm()incluindo o código abaixo no RegisterController.phparquivo emapp\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
    }

como você não deseja permitir o registro, é melhor jogar apenas 404 errorpara que o invasor saiba que está perdido. E quando estiver pronto para o registro em seu aplicativo, remova o //return view('auth.register');comentário e comenteabort(404);

\\\\\\\\\\\\\\\\\\\\ APENAS UMA FYI /////////////////////////// ////

Se você precisar usar autenticação múltipla, como criar autenticação para usuários, membros, estudantes, administrador, etc., aconselho que você faça o checkout deste hesto / multi-auth, um pacote incrível para autenticação ilimitada em aplicativos L5.

Você pode ler mais sobre a metodologia Auth e seu arquivo associado neste artigo.


2
Você também precisa corrigir a rota de postagem para evitar o registro do usuário através da solicitação de postagem.
Vaishnav Mhetre

2

No Laravel 5.5

Eu estava tentando realizar o mesmo problema no Laravel 5.5. Em vez de usar Auth::routes()no arquivo de rotas web.php, incluí apenas as rotas de logon / logout:

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

2

Isso foi mencionado em comentários anteriores, mas gostaria de esclarecer que existem várias maneiras de acessar as rotas de autenticação no seu arquivo web.php no Laravel ^ 5.7. dependendo da sua versão, pode parecer um pouco diferente, mas eles alcançam o mesmo resultado.

Primeira opção

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

Segunda opçao

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

1

Defina a rota Registrar falsa no seu web.php.

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

0

Para não mudar muito o código, basta criar um middleware para detectar se o URL da solicitação é url ('register'), depois redirecione para 404 ou faça o que for.


1
Solução de longo prazo. Uma simples substituição de função com abortar pode definitivamente funcionar.
Vaishnav Mhetre

0

No Laravel 5.5

Trabalhar em um problema semelhante e definir o argumento do middleware de convidado para 'auth' parecia uma solução mais elegante.

Editar arquivo: app-> http-> Controladores-> Auth-> RegisterController.php

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

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

No entanto, posso estar errado ... mas parece mais liso do que editar o roteamento com mais linhas e menos timidez do que simplesmente redirecionar a página ... pelo menos nesse caso, querendo bloquear o registro dos convidados.


Eu ficaria curioso para saber se um usuário pode se registrar várias vezes usando esse método. o guestmiddleware é redirecionamento responsável um já sessão iniciada fora de uma página que apenas um acesso hóspedes podem (ou seja, uma /registerpágina)
Kingsley

0

Acho que essa seria uma solução melhor.

Substitua os seguintes métodos, conforme mencionado abaixo em

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

No Laravel 5.5, é muito simples se você estiver usando o sistema de rotas CRUD.

Vá para app/http/controllers/RegisterController há espaço para nome:Illuminate\Foundation\Auth\RegistersUser

Você precisa ir para o RegistersUser: Illuminate\Foundation\Auth\RegistersUser

Existe a chamada de método showRegistrationFormchange this: return view('auth.login');for this: return redirect()->route('auth.login');e remova do seu registro de chamadas de rota de página blade. Pode ser assim:

 <li role="presentation">
     <a class="nav-link" href="{{ route('register') }}">Register</a>
 </li> 

0

Achei que essa era a solução mais fácil no laravel 5.6! Ele redireciona qualquer pessoa que tenta ir para yoursite.com/register para yoursite.com

rotas / web.php

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

0

Tudo o que fiz foi substituir o código do blade de registro pelo código do blade de login. Dessa forma, o registro ainda vai para o login.

resources/views/auth/register.blade.php é substituído por resources/views/auth/login.blade.php


0

Para o Laravel 5.6+, cole os métodos abaixo em app\Http\Controller\Auth\RegisterController

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

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

Agora você está substituindo esses métodos na RegistersUsercaracterística, sempre que mudar de idéia, remova esses métodos. Você também pode comentar os links welcome.blade.phpe login.blade.phpvisualizações do registro .


-11

adicionar

use \Redirect;

na parte superior do arquivo


Você quer dizer use \ Redirect;
Mike Miller

Esta não é uma resposta completa.
Martin Bean

na parte superior de qual arquivo? a solução é incompleta e confusa.
The Dead Guy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.