1+ import 'package:ht_api/src/rbac/permission_service.dart' ;
2+ import 'package:ht_api/src/rbac/permissions.dart' ;
13import 'package:ht_api/src/services/auth_token_service.dart' ;
24import 'package:ht_api/src/services/verification_code_storage_service.dart' ;
35import 'package:ht_data_repository/ht_data_repository.dart' ;
@@ -21,12 +23,14 @@ class AuthService {
2123 required HtEmailRepository emailRepository,
2224 required HtDataRepository <UserAppSettings > userAppSettingsRepository,
2325 required HtDataRepository <UserContentPreferences >
24- userContentPreferencesRepository,
26+ userContentPreferencesRepository,
27+ required PermissionService permissionService,
2528 required Uuid uuidGenerator,
2629 required Logger log,
2730 }) : _userRepository = userRepository,
2831 _authTokenService = authTokenService,
2932 _verificationCodeStorageService = verificationCodeStorageService,
33+ _permissionService = permissionService,
3034 _emailRepository = emailRepository,
3135 _userAppSettingsRepository = userAppSettingsRepository,
3236 _userContentPreferencesRepository = userContentPreferencesRepository,
@@ -39,7 +43,8 @@ class AuthService {
3943 final HtEmailRepository _emailRepository;
4044 final HtDataRepository <UserAppSettings > _userAppSettingsRepository;
4145 final HtDataRepository <UserContentPreferences >
42- _userContentPreferencesRepository;
46+ _userContentPreferencesRepository;
47+ final PermissionService _permissionService;
4348 final Logger _log;
4449 final Uuid _uuid;
4550
@@ -77,13 +82,13 @@ class AuthService {
7782 );
7883 }
7984
80- final hasRequiredRole =
81- user.dashboardRole == DashboardUserRole .admin ||
82- user.dashboardRole == DashboardUserRole .publisher;
83- 84- if ( ! hasRequiredRole ) {
85+ // Use the PermissionService to check for the specific dashboard login permission.
86+ if ( ! _permissionService. hasPermission (
87+ user,
88+ Permissions .dashboardLogin,
89+ ) ) {
8590 _log.warning (
86- 'Dashboard login failed: User ${user .id } lacks required roles .' ,
91+ 'Dashboard login failed: User ${user .id } lacks required permission (${ Permissions . dashboardLogin }) .' ,
8792 );
8893 throw const ForbiddenException (
8994 'Your account does not have the required permissions to sign in.' ,
@@ -157,6 +162,24 @@ class AuthService {
157162 final existingUser = await _findUserByEmail (email);
158163 if (existingUser != null ) {
159164 user = existingUser;
165+ // If this is a dashboard login, re-verify the user's dashboard role.
166+ // This closes the loophole where a non-admin user could request a code
167+ // via the app flow and then use it to log into the dashboard.
168+ if (isDashboardLogin) {
169+ if (! _permissionService.hasPermission (
170+ user,
171+ Permissions .dashboardLogin,
172+ )) {
173+ _log.warning (
174+ 'Dashboard login failed: User ${user .id } lacks required permission '
175+ 'during code verification.' ,
176+ );
177+ throw const ForbiddenException (
178+ 'Your account does not have the required permissions to sign in.' ,
179+ );
180+ }
181+ _log.info ('Dashboard user ${user .id } re-verified successfully.' );
182+ }
160183 } else {
161184 // User not found.
162185 if (isDashboardLogin) {
0 commit comments