Middleware

Middleware wordt uitgevoerd vóórdat een verzoek de controller bereikt. Het kan het verzoek aanpassen, parameters toevoegen of het antwoord stoppen.

Een middleware aanmaken

import 'package:finch/finch_route.dart';

class AuthMiddleware extends Middleware {
  @override
  Future<MiddlewareResult> handle(FinchRequest rq) async {
    var token = rq.headers['authorization']?.first ?? '';

    if (token.isEmpty) {
      return MiddlewareResult.stop(
        rq.renderData(
          data: {'error': 'Authenticatie vereist'},
          statusCode: 401,
        ),
      );
    }

    var user = await UserService.verifyToken(token);
    if (user == null) {
      return MiddlewareResult.stop(
        rq.renderData(
          data: {'error': 'Ongeldig token'},
          statusCode: 401,
        ),
      );
    }

    // Gebruiker toevoegen aan verzoekparameters
    rq.addParam('currentUser', user);
    return MiddlewareResult.next();
  }
}

MiddlewareResult-retourwaarden

Waarde Gedrag
MiddlewareResult.next() Doorgaan naar volgende middleware/controller
MiddlewareResult.stop(response) Verwerking stoppen en antwoord teruggeven

Middleware koppelen aan een route

In de constructor

router.get(
  '/dashboard',
  DashboardController().index,
  middlewares: [AuthMiddleware()],
);

Vloeiend

router
    .get('/dashboard', DashboardController().index)
    .middleware(AuthMiddleware());

Middleware voor een bovenliggende route

router.group('/api', (r) {
  r.get('/users', UserController().index);
  r.post('/users', UserController().store);
}).middleware(ApiAuthMiddleware());

Toegang tot verzoek in controller

Future<String> index() async {
  var user = rq.getParam<User>('currentUser');
  // Gebruik user...
}