Autorização Admin
O acesso ao painel administrativo requer role ADMIN ou SUPER_ADMIN. Esta página documenta o sistema de autorização para administradores.
Roles do Sistema
| Role | Descrição | Permissões |
|---|---|---|
USER | Usuário comum | Jogar, depositar, sacar |
ADMIN | Administrador | Gerenciar usuários, caixas, itens, pagamentos |
SUPER_ADMIN | Super admin | Tudo + gerenciar outros admins |
Fluxo de Autorização Admin
Implementação
AdminGuard
typescript
// src/presentation/guards/admin.guard.ts
@Injectable()
export class AdminGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
const request = context.switchToHttp().getRequest();
const user = request.user;
if (!user) {
throw new UnauthorizedException('Authentication required');
}
const allowedRoles = ['ADMIN', 'SUPER_ADMIN'];
if (!allowedRoles.includes(user.role)) {
throw new ForbiddenException('Admin access required');
}
return true;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Uso nos Controllers
typescript
// src/presentation/controllers/admin.controller.ts
@Controller('admin')
@UseGuards(AuthGuard, AdminGuard) // Ambos os guards
@ApiTags('Admin')
export class AdminController {
@Get('dashboard/stats')
@ApiOperation({ summary: 'Get dashboard statistics' })
async getDashboardStats() {
return this.getDashboardStatsUseCase.execute();
}
@Post('users/:id/ban')
@ApiOperation({ summary: 'Ban a user' })
async banUser(
@Param('id') userId: string,
@Body() dto: BanUserDto,
@CurrentUser() admin: User,
) {
return this.banUserUseCase.execute(
BigInt(userId),
dto.reason,
admin.id,
);
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Decorador Combinado
typescript
// src/presentation/decorators/admin.decorator.ts
export function Admin() {
return applyDecorators(
UseGuards(AuthGuard, AdminGuard),
ApiBearerAuth(),
ApiResponse({ status: 401, description: 'Unauthorized' }),
ApiResponse({ status: 403, description: 'Forbidden - Admin only' }),
);
}
// Uso simplificado
@Controller('admin')
@Admin()
export class AdminController {
// ...
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Verificação no Frontend (Dashboard)
typescript
// next-shadcn-admin-dashboard/src/contexts/auth-context.tsx
export function AuthProvider({ children }: { children: React.ReactNode }) {
const [user, setUser] = useState<User | null>(null);
const [isLoading, setIsLoading] = useState(true);
const router = useRouter();
const pathname = usePathname();
useEffect(() => {
checkAuth();
}, []);
const checkAuth = async () => {
try {
const userData = await api.auth.getMe();
// Verifica se é admin
if (!['ADMIN', 'SUPER_ADMIN'].includes(userData.role)) {
router.push('/unauthorized');
return;
}
setUser(userData);
} catch (error) {
// Não autenticado - redirect para login
if (!isPublicPath(pathname)) {
router.push('/login');
}
} finally {
setIsLoading(false);
}
};
const isAdmin = user?.role === 'ADMIN' || user?.role === 'SUPER_ADMIN';
const isSuperAdmin = user?.role === 'SUPER_ADMIN';
return (
<AuthContext.Provider value={{ user, isLoading, isAdmin, isSuperAdmin }}>
{children}
</AuthContext.Provider>
);
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Permissões Granulares (SUPER_ADMIN)
Algumas ações são exclusivas do SUPER_ADMIN:
typescript
// Apenas SUPER_ADMIN pode:
// - Promover usuários para ADMIN
// - Remover outros admins
// - Acessar logs de auditoria de admins
// - Ajustar configurações do sistema
@Post('users/:id/promote')
@ApiOperation({ summary: 'Promote user to admin (SUPER_ADMIN only)' })
async promoteToAdmin(
@Param('id') userId: string,
@CurrentUser() admin: User,
) {
if (admin.role !== 'SUPER_ADMIN') {
throw new ForbiddenException('Only SUPER_ADMIN can promote users');
}
return this.promoteUserUseCase.execute(BigInt(userId));
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Auditoria de Ações Admin
Todas as ações de admin são logadas:
typescript
// Após cada ação admin
await this.auditService.log({
action: 'ADMIN_BAN_USER',
userId: admin.id,
entityType: 'User',
entityId: targetUserId,
metadata: {
reason: dto.reason,
adminRole: admin.role,
},
});1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Logs de Auditoria Admin
sql
-- Buscar ações de um admin específico
SELECT * FROM audit_logs
WHERE user_id = :adminId
AND action LIKE 'ADMIN_%'
ORDER BY created_at DESC;
-- Ações sensíveis (últimas 24h)
SELECT * FROM audit_logs
WHERE action IN ('ADMIN_BAN_USER', 'ADMIN_ADJUST_BALANCE', 'ADMIN_APPROVE_WITHDRAWAL')
AND created_at > NOW() - INTERVAL '24 hours'
ORDER BY created_at DESC;1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Página de Acesso Negado
typescript
// next-shadcn-admin-dashboard/src/app/(main)/unauthorized/page.tsx
export default function UnauthorizedPage() {
return (
<div className="flex flex-col items-center justify-center h-screen">
<h1 className="text-4xl font-bold text-red-500">403</h1>
<h2 className="text-2xl mt-4">Acesso Negado</h2>
<p className="text-gray-500 mt-2">
Você não tem permissão para acessar esta área.
</p>
<p className="text-gray-500">
Esta área é restrita a administradores.
</p>
<a href="/" className="mt-6 text-blue-500 hover:underline">
Voltar para o site
</a>
</div>
);
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Segurança Adicional
IP Whitelist para Admin (Opcional)
typescript
// Para ambientes de alta segurança
@Injectable()
export class AdminIpGuard implements CanActivate {
private readonly allowedIps = [
'10.0.0.0/8', // Rede interna
'192.168.1.100', // IP específico
];
canActivate(context: ExecutionContext): boolean {
const request = context.switchToHttp().getRequest();
const clientIp = request.ip;
if (!this.isIpAllowed(clientIp)) {
throw new ForbiddenException('IP not allowed for admin access');
}
return true;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Notificações de Login Admin
typescript
// Notifica quando admin faz login
async onAdminLogin(admin: User, ip: string) {
await this.notificationService.sendToSuperAdmins({
type: 'ADMIN_LOGIN',
title: 'Login de Administrador',
message: `${admin.username} (${admin.role}) fez login de ${ip}`,
});
}1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Arquivos Fonte
Principais Arquivos
src/presentation/guards/admin.guard.ts- Guard de adminsrc/presentation/controllers/admin.controller.ts- Controller adminnext-shadcn-admin-dashboard/src/contexts/auth-context.tsx- Auth do dashboardprisma/schema.prisma- Enum UserRole
