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?

Milad Rahimi
fonte
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()
{

}
Limon Monte
fonte
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.

Rafał G.
fonte
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.

theeternalsw0rd
fonte
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

Yassin
fonte
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
31

No Laravel 5.7, você pode passar uma variedade de opções para Auth::routes(). Você pode desativar as rotas de registro com:

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

Você pode ver como isso funciona no código-fonte: src / Illuminate / Routing / Router.php .

Christopher Geary
fonte
1
Na minha opinião, esta é a resposta correta. Nice encontrado!
Rick Kuilman 6/03/19
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.

Phanith Kung
fonte
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.

JCoolinger
fonte
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.

Jesús Amieiro
fonte
9

LAravel 5.6

Auth::routes([
    'register' => false, // Registration Routes...
    'reset' => false, // Password Reset Routes...
    'verify' => false, // Email Verification Routes...
]);
Isaac Limón
fonte
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.

kjdion84
fonte
^ 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.

Jeffrey
fonte
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

Sajjad Aljileezi
fonte
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.

Daniel Centore
fonte
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
ghodder
fonte
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!

bambamboole
fonte
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.

The Dead Guy
fonte
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');
David Angel
fonte
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...
]);
Edvard Åkerberg
fonte
1

Defina a rota Registrar falsa no seu web.php.

Auth::routes(['register' => false]);
Connectify_user
fonte
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.

Motolola
fonte
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.

Chad Quilter
fonte
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);
}
Vaishnav Mhetre
fonte
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> 
Macalu
fonte
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('/');
});
Ryan Dhungel
fonte
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

Akula
fonte
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 .

Yamen Ashraf
fonte
-11

adicionar

use \Redirect;

na parte superior do arquivo

sjas
fonte
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