Laravel provides built-in authentication and session services via the Auth and Session facades. These handle cookie-based authentication, verify user credentials, store authentication data in sessions, and issue session cookies automatically.
This config defines Laravel's authentication settings. The default guard (web) uses session-based authentication, and the user provider relies on Eloquent with the User model.
config/auth.php
        
                'defaults' => [ 
                'guard' => 'web', 
                 'passwords' => 'users', 
                ],
            
        
                'guards' => [ 
                'web' => [ 
                'driver' => 'session', 
                 'provider' => 'users', 
                ],
            
        
                'providers' => [ 
                'users' => [ 
                'driver' => 'eloquent', 
                 'model' => App\Models\User::class, 
                ],
            
        This sets up the database connection for Laravel using MySQL. The migrate command applies database migrations to create the necessary tables.
                DB_CONNECTION=mysql 
                DB_HOST=127.0.0.1 
                DB_PORT=3306 
                DB_DATABASE=onlineShop
                DB_USERNAME=laravel
                DB_PASSWORD=laravel
            
        
                php artisan migrate
            
        It creates tables in the database (users)
This is a simple Laravel registration form with CSRF protection. It includes fields for name, email, password, and password confirmation, displaying validation error messages if input is invalid.
                <h1>Register</h1>
                <form action="/register" methode="post"
                >
                
                    @csrf
                    <label>Name</label>
                    <input type="text" name="name"
                    value="{{old('name')}}" />
                    @error('name')
                    {{$message}}
                    @enderror
                    <br/>
                    <label>Email</label>
                    <input type="text" name="email" value="{{old('email')}}"
                    />
                    @error('email')
                    {{$message}}
                    @enderror
                    <br/>
                    <label>Password</label>
                    <input type="password" name="password" />
                    @error('password')
                    {{$message}}
                    @enderror
                    <br/>
                    <label>Repeat password</label>
                    <input type="password" name="password_confirmation" />
                    @error('password_confirmation')
                    {{$message}}
                    @enderror
                    <br/>
                    <input type="submit" value="register" />
                
                </form>
            
        
                public function register(Request $request)
                {
                
                    $validate = $request->validate(
                    
                        [
                        
                            'name' => 'required|max:255',
                            'email' => 'required|email|unique:users,email',
                             'password' => 'required|min:8|confirmed',
                        
                        ]
                    
                    );
                
                
                    $user= User::create([
                    
                        'name' => $request->input('name'),
                        'email'=> $request->input('email'),
                         'password' => Hash::make($request->input('password'))
                    
                    ]);
                    
                    return redirect('/');
                
                
                }
            
        This controller method validates the registration form, creates a new user with a hashed password, and then redirects to the homepage.
To use Laravel's authentication services, import the Auth facade. The attempt method handles login authentication. If successful, regenerate the session to prevent session fixation.
                use Illuminate\Support\Facades\Auth;
            
        
                public function login(Request $request)
                {
                
                    $credentials = $request -> only('email', 'password');
                    if (Auth::attempt( $credentials))
                    
                        {
                        
                            $request -> session()->regenerate();
                            return view('welcome')
                        
                        }
                    
                    
                    return back()->withErrors(['email' => 'Incorrect email or password!']);
                
                
                }
            
        
                <h1>Login</h1>
                @error('error')
                {{$message}}
                @enderror
                <br/>
                <form action="/login" methode="post"
                >
                
                    @csrf
                    <label>Email</label>
                    <input type="text" name="email" /> <br/>
                    <label>Password</label>
                    <input type="password" name="password" /> <br/>
                    <input type="submit" value="Login"
                
                </form>
            
        This is a Laravel login form with CSRF protection. It includes fields for email and password and displays error messages if authentication fails.
Use the logout method from the Auth facade to log users out by removing authentication data from the session. Additionally, invalidate the session, regenerate the CSRF token, and redirect the user to the root.
                public function logout(Request $request)
                {
                
                    Auth::logout();
                    $request -> session()->invalidate();
                    $request -> session()->regenerateToken();
                    return redirect('/');
                
                
                }
            
        After a user registers and logs in, you can access the authenticated user using the user method of the Auth facade while handling a request.
                // Retrieve the currently authenticated user...
                $user = Auth::user();
                // Retrieve the currently authenticated user's ID...
<
                $id = Auth::id();
            
        To check if a user is authenticated, use the check method on the Auth facade. It returns true if the user is logged in.
                if( Auth::check()) {
                //User is logged in
                }
            
        
                Route::get('/flights',function(){ 
                Only logged-in users can access this route.
                })->middleware('auth');
            
        If the auth middleware detects an unauthenticated user, it redirects them to the login route.
app/Http/Middleware/Authenticate.php
        
                protected function redirectTo(Request $request): string 
                {
                 return route('login');
                }
            
        
                protected $fillable = [ 
                
                    'name' ,
                    'email',
                     'password',
                     'role',
                
                ];
            
        Gates are closures that check if a user is authorized for an action. They are defined in the boot method of AppServiceProvider using the Gate facade and receive a user instance as the first argument.
app/Providers/AuthServiceProvider.php
        
                public function boot(): void
                {
                
                    Gate::define('isAdmin', function ($user) {
                     return $user->role == 'ADMIN';
                    });
                    Gate::define('isUser', function ($user) {
                      return $user->role == 'USER';
                    });
                
                }
            
        To authorize an action with gates, use the allows or denies methods from the Gate facade. Laravel automatically passes the authenticated user, so you don’t need to include it manually. These methods are typically used in controllers before executing restricted actions.
                public function index(Request $request)
                {
                
                    if (Gate::allows('isAdmin))
                     return view('welcome');
                    else
                      return redirect('/);
                
                }
            
        
            Laravel provides middleware to authorize actions before the request reaches routes or controllers. The
            Illuminate\Auth\Middleware\Authorize middleware can be attached to a route using the can
            middleware alias,
            which is automatically registered by Laravel.
        
                Route::get('/welcome', [userController::class, 'index'])->middleware('can:isAdmin');
            
        Show or hide elements in the view based on the user's role
                @can('isAdmin')
                Admin
                @else
                everyone
                @endcan
                @canany(['isAdmin','isUser'])
                everyone
                @endcanany