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 ', '');