Auth Controller

AuthController یک کلاس انتزاعی است که کنترل دسترسی را برای مسیرهای فینچ فراهم می‌کند. یک کلاس فرزند می‌سازید، متدهای انتزاعی را پیاده‌سازی می‌کنید، و نمونه آن را به گزینه auth هر FinchRoute که می‌خواهید محافظت کنید، ارسال می‌کنید.

متدهای انتزاعی

متد امضا توضیح
auth Future<bool> auth(Request rq, List<String> permissions) true برمی‌گرداند تا اجازه دهد، false برمی‌گرداند تا رد کند. permissions از FinchRoute.permissions می‌آید
reject Future<String> reject(Request rq, List<String> permissions) پاسخی که هنگام رد توسط auth ارسال می‌شود (هدایت مجدد، صفحه خطا، JSON)

مثال کامل

import 'package:finch/finch_route.dart';

class AppAuthController extends AuthController {
  @override
  Future<bool> auth(Request rq, List<String> permissions) async {
    // خواندن token از header یا session
    var token = rq.headers['authorization']?.first ?? '';

    if (token.isEmpty) return false;

    // اعتبارسنجی token در برابر دیتابیس یا store
    var user = await UserModel().findByToken(token: token);
    if (user == null) return false;

    // اگر permissions مشخص شده‌اند، آن‌ها را بررسی کن
    if (permissions.isNotEmpty) {
      return permissions.every((p) => user.roles.contains(p));
    }
    return true;
  }

  @override
  Future<String> reject(Request rq, List<String> permissions) async {
    // برای درخواست‌های API
    if (rq.isJson) {
      return rq.renderData(
        data: {'error': 'Unauthorized'},
        statusCode: 401,
      );
    }
    // برای درخواست‌های مرورگر
    return rq.redirect(url: '/login');
  }
}

ضمیمه کردن به مسیرها

final authController = AppAuthController();

Future<List<FinchRoute>> getWebRoute(Request rq) async {
  return [
    // محافظت از یک مسیر واحد
    FinchRoute(
      key: 'admin.panel',
      path: 'admin/panel',
      auth: authController,
      permissions: ['admin'],
      index: adminController.panel,
    ),

    // محافظت از یک مسیر والد و تمام فرزندان آن
    FinchRoute(
      key: 'dashboard',
      path: 'dashboard',
      auth: authController,
      children: [
        FinchRoute(
          key: 'dashboard.home',
          path: '',
          index: dashboardController.home,
        ),
        FinchRoute(
          key: 'dashboard.settings',
          path: 'settings',
          index: dashboardController.settings,
        ),
      ],
    ),
  ];
}

جریان درخواست

درخواست ورودی
    → اگر auth تنظیم شده: AuthController.auth() فراخوانی می‌شود
        → false: AuthController.reject() ارسال می‌شود
        → true: اجرای متد index controller

هدر Authorization

هدر استاندارد Authorization به صورت خودکار توسط فینچ parse نمی‌شود. آن را دستی از rq.headers بخوانید:

var authHeader = rq.headers['authorization']?.first ?? '';
// معمولاً: 'Bearer <token>'
var token = authHeader.replaceFirst('Bearer ', '');