Criar formulario de login com Laravel 11


Neste tutorial, será explicado como criar formulário de login com Laravel 11.

Primeiramente, será demonstrado como criar formulário no Laravel.

Em seguida, será explicado como implementar a funcionalidade de exibir e ocultar senhas.

Por fim, será mostrado como validar o usuário e a senha com PHP.

Download do código fonte desenvolvido na aula: Download

PlayList sobre Laravel 11: Acessar

Receber as aulas gratuitas do curso de Laravel: Acessar


Para começar, é utilizado como base o projeto da aula "Como criar paginação com Laravel 11".

Primeiro, criado a rota de login no arquivo 'routes/web.php'.

Route::get('/', [LoginController::class, 'index'])->name('login');

Criada a controller LoginController.

php artisan make:controller LoginController

Em seguida, na controller 'LoginController', criado o método 'index' para carregar a view com o formulário de login.

public function index()
{
    return view('login.index');
}

Criada a view com o formulário de login.

php artisan make:view login/index

Na mesma, é implementado o formulário, incluído o layout 'layouts.auth' e enviados os dados para a rota 'login.process'.

@extends('layouts.auth')

@section('content')
    <main class="form-signin w-100 m-auto text-center bg-light rounded">

        <img class="mb-4" src="{{ asset('images/logo-define-100x100_v1.png') }}" alt="" width="72" height="72">
        <h1 class="h3 mb-3 fw-normal">Área Restrita</h1>
        <x-alert />

        <form action="{{ route('login.process') }}" method="POST">
            @csrf
            @method('POST')

            <div class="form-floating mb-4">
                <input type="email" name="email" class="form-control" id="email"
                    placeholder="Digite o e-mail de usuário" value="{{ old('email') }}">
                <label for="email">Usuário</label>
            </div>

            <div class="mb-4">
                <div class="input-group">
                    <div class="form-floating">
                        <input type="password" name="password" class="form-control" id="password" placeholder="Password">
                        <label for="password">Senha</label>
                    </div>
                    <span class="input-group-text" role="button" onclick="togglePassword('password', this)"><i
                            class="bi bi-eye"></i></span>
                </div>
            </div>

            <button class="btn btn-primary w-100 py-2 mb-4" type="submit">Acessar</button>

            <a href="{{ route('login.create-user') }}" class="text-decoration-none">Cadastrar</a>
            
        </form>
    </main>
@endsection

Os dados do formulário serão enviados para a rota 'login.process', que foi criada no arquivo 'routes/web.php'.

Route::post('/login', [LoginController::class, 'loginProcess'])->name('login.process');

A rota chama o método 'loginProcess' da controller 'LoginController', que recebe os dados, realiza a validação com a classe 'LoginRequest' e valida o e-mail e a senha. Se os dados estiverem corretos, o usuário é redirecionado para a página que lista os usuários. Caso o e-mail ou a senha estejam incorretos, o usuário permanece na página de login e a mensagem de erro é exibida.

public function loginProcess(LoginRequest $request)
{
    // Validar o formulário
    $request->validated();

    // Validar o usuário e a senha com as informações do banco de dados
    $authenticated = Auth::attempt(['email' => $request->email, 'password' => $request->password]);

    // Verificar se o usuário foi autenticado
    if(!$authenticated){
        // Redirecionar o usuário para página anterior "login", enviar a mensagem de erro
        return back()->withInput()->with('error', 'E-mail ou senha inválido!');
    }

    // Obter o usuário autenticado
    $user = Auth::user();
    $user = User::find($user->id);

    // Redirecionar o usuário
    return redirect()->route('user.index');

}

É necessário criar a classe para validar os dados do formulário com o comando.

php artisan make:request LoginRequest

No arquivo 'app/Http/Request/LoginRequest', é implementada a validação.

class LoginRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }
    public function rules(): array
    {
        return [
            'email' => 'required|email',
            'password' => 'required',            
        ];
    }
    public function messages(): array
    {
        return[
            'email.required' => 'Campo e-mail é obrigatório!',
            'email.email' => 'Necessário enviar e-mail válido!',
            'password.required' => 'Campo senha é obrigatório!',
        ];
    }
}

Em seguida, é implementada a rota sair.

Route::get('/logout', [LoginController::class, 'destroy'])->name('login.destroy');

Implementado na controller 'LoginController' o método 'destroy', que desloga o usuário e o redireciona para a página de login.

public function destroy()
{
    // Deslogar o usuário
    Auth::logout();

    // Redirecionar o usuário, enviar a mensagem de sucesso
    return redirect()->route('login')->with('success', 'Deslogado com sucesso!');
}

Para indicar as rotas restritas, nas quais o usuário precisa estar logado para acessar, é utilizado o auth como middleware, envolvendo as rotas restritas no arquivo "routes/web.php".

Route::group(['middleware' => 'auth'], function () {
    Route::get('/index-user', [UserController::class, 'index'])->name('user.index');
    Route::get('/show-user/{user}', [UserController::class, 'show'])->name('user.show');
    Route::get('/create-user', [UserController::class, 'create'])->name('user.create');
    Route::post('/store-user', [UserController::class, 'store'])->name('user-store');
    Route::get('/edit-user/{user}', [UserController::class, 'edit'])->name('user.edit');
    Route::put('/update-user/{user}', [UserController::class, 'update'])->name('user-update');
    Route::delete('/destroy-user/{user}', [UserController::class, 'destroy'])->name('user.destroy');
});

Baixar o código-fonte completo do projeto.

Bom, era isso. Espero que o tutorial tenha sido útil!