mirror of
https://github.com/torrentpier/torrentpier
synced 2025-08-21 22:03:49 -07:00
feat(middleware): add authentication and admin middleware for role-based access control
- Introduced AuthMiddleware to handle user authentication via bearer tokens and API tokens, with a placeholder for token validation. - Added AdminMiddleware to enforce admin role checks, currently accepting user ID 1 as an admin. - Created BaseMiddleware as an abstract class for shared middleware functionality. - Implemented CorsMiddleware to manage CORS headers and preflight responses. These additions enhance the application's security and access control mechanisms, laying the groundwork for a robust middleware architecture.
This commit is contained in:
parent
58e02e0924
commit
9a1e17de8d
4 changed files with 203 additions and 0 deletions
52
app/Http/Middleware/AdminMiddleware.php
Normal file
52
app/Http/Middleware/AdminMiddleware.php
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\Response;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Admin Authorization Middleware
|
||||||
|
*
|
||||||
|
* Example middleware showing how to implement role-based authorization
|
||||||
|
* using Illuminate HTTP components
|
||||||
|
*/
|
||||||
|
class AdminMiddleware
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Handle an incoming request
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @param Closure $next
|
||||||
|
* @return Response|JsonResponse
|
||||||
|
*/
|
||||||
|
public function handle(Request $request, Closure $next): Response|JsonResponse
|
||||||
|
{
|
||||||
|
// Check if user is authenticated first
|
||||||
|
$userId = $request->attributes->get('authenticated_user_id');
|
||||||
|
|
||||||
|
if (!$userId) {
|
||||||
|
if ($request->expectsJson()) {
|
||||||
|
return new JsonResponse(['error' => 'Authentication required'], 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Response('Authentication required', 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Implement actual admin role check
|
||||||
|
// For now, accept user ID 1 as admin
|
||||||
|
if ($userId !== 1) {
|
||||||
|
if ($request->expectsJson()) {
|
||||||
|
return new JsonResponse(['error' => 'Admin access required'], 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Response('Admin access required', 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
}
|
55
app/Http/Middleware/AuthMiddleware.php
Normal file
55
app/Http/Middleware/AuthMiddleware.php
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\Response;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Authentication Middleware
|
||||||
|
*
|
||||||
|
* Example middleware showing how to implement authentication
|
||||||
|
* using Illuminate HTTP components
|
||||||
|
*/
|
||||||
|
class AuthMiddleware
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Handle an incoming request
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @param Closure $next
|
||||||
|
* @return Response|JsonResponse
|
||||||
|
*/
|
||||||
|
public function handle(Request $request, Closure $next): Response|JsonResponse
|
||||||
|
{
|
||||||
|
// Example authentication check
|
||||||
|
$token = $request->bearerToken() ?? $request->input('api_token');
|
||||||
|
|
||||||
|
if (!$token) {
|
||||||
|
if ($request->expectsJson()) {
|
||||||
|
return new JsonResponse(['error' => 'Authentication required'], 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Response('Authentication required', 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Implement actual token validation
|
||||||
|
// For now, accept any token that starts with 'valid_'
|
||||||
|
if (!str_starts_with($token, 'valid_')) {
|
||||||
|
if ($request->expectsJson()) {
|
||||||
|
return new JsonResponse(['error' => 'Invalid token'], 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Response('Invalid token', 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add user info to request for use in controllers
|
||||||
|
$request->attributes->set('authenticated_user_id', 1);
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
}
|
38
app/Http/Middleware/BaseMiddleware.php
Normal file
38
app/Http/Middleware/BaseMiddleware.php
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
|
||||||
|
abstract class BaseMiddleware
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Handle an incoming request.
|
||||||
|
*/
|
||||||
|
public function handle(Request $request, Closure $next): Response
|
||||||
|
{
|
||||||
|
$request = $this->before($request);
|
||||||
|
$response = $next($request);
|
||||||
|
return $this->after($request, $response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process request before passing to next middleware
|
||||||
|
*/
|
||||||
|
protected function before(Request $request): Request
|
||||||
|
{
|
||||||
|
return $request;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process response after middleware chain
|
||||||
|
*/
|
||||||
|
protected function after(Request $request, Response $response): Response
|
||||||
|
{
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
}
|
58
app/Http/Middleware/CorsMiddleware.php
Normal file
58
app/Http/Middleware/CorsMiddleware.php
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
|
||||||
|
class CorsMiddleware
|
||||||
|
{
|
||||||
|
private array $allowedOrigins;
|
||||||
|
private array $allowedHeaders;
|
||||||
|
private array $allowedMethods;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
array $allowedOrigins = ['*'],
|
||||||
|
array $allowedHeaders = ['Content-Type', 'Authorization', 'X-Requested-With'],
|
||||||
|
array $allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$this->allowedOrigins = $allowedOrigins;
|
||||||
|
$this->allowedHeaders = $allowedHeaders;
|
||||||
|
$this->allowedMethods = $allowedMethods;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handle(Request $request, Closure $next): Response
|
||||||
|
{
|
||||||
|
if ($request->getMethod() === 'OPTIONS') {
|
||||||
|
return $this->createPreflightResponse($request);
|
||||||
|
}
|
||||||
|
|
||||||
|
$response = $next($request);
|
||||||
|
return $this->addCorsHeaders($response, $request);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function createPreflightResponse(Request $request): Response
|
||||||
|
{
|
||||||
|
$response = new Response('', 200);
|
||||||
|
return $this->addCorsHeaders($response, $request);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function addCorsHeaders(Response $response, Request $request): Response
|
||||||
|
{
|
||||||
|
$origin = $request->headers->get('Origin', '');
|
||||||
|
|
||||||
|
if (in_array('*', $this->allowedOrigins) || in_array($origin, $this->allowedOrigins)) {
|
||||||
|
$response->headers->set('Access-Control-Allow-Origin', $origin ?: '*');
|
||||||
|
}
|
||||||
|
|
||||||
|
$response->headers->set('Access-Control-Allow-Methods', implode(', ', $this->allowedMethods));
|
||||||
|
$response->headers->set('Access-Control-Allow-Headers', implode(', ', $this->allowedHeaders));
|
||||||
|
$response->headers->set('Access-Control-Max-Age', '86400');
|
||||||
|
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue