Auth Controller

AuthController is een abstracte klasse die toegangsbeheer biedt voor Finch-routes. Je maakt een subklasse, implementeert de abstracte methoden en geeft een instantie door aan de auth-optie van elke FinchRoute die je wilt beveiligen.

Abstracte methoden

Methode Signatuur Beschrijving
auth Future<bool> auth(Request rq, List<String> permissions) Geeft true terug om toe te laten, false om te weigeren. permissions komt van FinchRoute.permissions
reject Future<String> reject(Request rq, List<String> permissions) Het antwoord dat wordt verzonden wanneer auth weigert (doorsturen, foutpagina, JSON)

Volledig voorbeeld

import 'package:finch/finch_route.dart';

class AppAuthController extends AuthController {
  @override
  Future<bool> auth(Request rq, List<String> permissions) async {
    // Token lezen uit header of sessie
    var token = rq.headers['authorization']?.first ?? '';

    if (token.isEmpty) return false;

    // Token valideren tegen database of store
    var user = await UserModel().findByToken(token: token);
    if (user == null) return false;

    // Als er permissies zijn opgegeven, controleer ze
    if (permissions.isNotEmpty) {
      return permissions.every((p) => user.roles.contains(p));
    }
    return true;
  }

  @override
  Future<String> reject(Request rq, List<String> permissions) async {
    // Voor API-verzoeken
    if (rq.isJson) {
      return rq.renderData(
        data: {'error': 'Unauthorized'},
        statusCode: 401,
      );
    }
    // Voor browserverzoeken
    return rq.redirect(url: '/login');
  }
}

Koppelen aan routes

final authController = AppAuthController();

Future<List<FinchRoute>> getWebRoute(Request rq) async {
  return [
    // Één route beveiligen
    FinchRoute(
      key: 'admin.panel',
      path: 'admin/panel',
      auth: authController,
      permissions: ['admin'],
      index: adminController.panel,
    ),

    // Bovenliggende route en al haar kinderen beveiligen
    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,
        ),
      ],
    ),
  ];
}

Verzoekstroom

Binnenkomend verzoek
    → Als auth is ingesteld: AuthController.auth() wordt aangeroepen
        → false: AuthController.reject() wordt verstuurd
        → true: Controller-indexmethode wordt uitgevoerd

Authorization-header

De standaard Authorization-header wordt niet automatisch door Finch geparseerd. Lees hem handmatig uit rq.headers:

var authHeader = rq.headers['authorization']?.first ?? '';
// Doorgaans: 'Bearer <token>'
var token = authHeader.replaceFirst('Bearer ', '');