permission.middleware.ts 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { Context, Next } from 'hono';
  2. import { UserEntity as User } from '@d8d/user-module';
  3. type PermissionCheck = (user: User) => boolean | Promise<boolean>;
  4. export function checkPermission(requiredRoles: string[]): PermissionCheck {
  5. return (user: User) => {
  6. if (!user.roles) return false;
  7. return user.roles.some(role => requiredRoles.includes(role.name));
  8. };
  9. }
  10. export function permissionMiddleware(check: PermissionCheck) {
  11. return async (c: Context, next: Next) => {
  12. try {
  13. const user = c.get('user') as User | undefined;
  14. if (!user) {
  15. return c.json({ message: 'Unauthorized' }, 401);
  16. }
  17. const hasPermission = await check(user);
  18. if (!hasPermission) {
  19. return c.json({ message: 'Forbidden' }, 403);
  20. }
  21. await next();
  22. } catch (error) {
  23. console.error('Permission check error:', error);
  24. return c.json({ message: 'Internal server error' }, 500);
  25. }
  26. };
  27. }
  28. // 示例用法:
  29. // app.get('/admin',
  30. // authMiddleware,
  31. // permissionMiddleware(checkPermission(['admin'])),
  32. // (c) => {...}
  33. // )