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