fix: corrige acesso ao role nos metadados do usuário

- Remove verificação opcional (?.) ao acessar role nos metadados
- Ajusta ordem de declaração da variável userRole no LoginForm
- Atualiza logs para melhor debug do fluxo de autenticação
- Garante acesso direto ao role em user_metadata
This commit is contained in:
Lucas Santana 2024-12-20 13:17:53 -03:00
parent 4b431358e0
commit 441b55535e
3 changed files with 67 additions and 49 deletions

View File

@ -37,18 +37,25 @@ export function LoginForm({ userType, onLogin, onRegisterClick }: LoginFormProps
setLoading(true);
try {
console.log('Tentando login com:', { email, userType });
const { data, error } = await supabase.auth.signInWithPassword({
email: email,
password: password
});
console.log('Resposta do Supabase:', { data, error });
if (error) throw error;
if (!data.user) {
throw new Error('Usuário não encontrado');
}
const userRole = data.user.user_metadata?.role;
const userRole = data.user.user_metadata.role;
console.log('Metadados do usuário:', data.user.user_metadata);
console.log('Role esperado:', userType);
console.log('Role atual:', userRole);
if (userRole !== userType) {
throw new Error(`Este não é um login de ${userTypeLabels[userType]}`);

View File

@ -1,5 +1,5 @@
import React from 'react';
import { Navigate } from 'react-router-dom';
import { Navigate, useLocation } from 'react-router-dom';
import { useAuth } from '../../hooks/useAuth';
interface ProtectedRouteProps {
@ -9,27 +9,38 @@ interface ProtectedRouteProps {
export function ProtectedRoute({ children, allowedRoles = [] }: ProtectedRouteProps) {
const { user, loading, userRole } = useAuth();
const location = useLocation();
if (loading) {
return <div>Carregando...</div>;
}
// Se não houver usuário, redireciona para login
if (!user) {
return <Navigate to="/login/student" />;
return <Navigate to="/login/school" state={{ from: location }} replace />;
}
if (allowedRoles.length > 0 && !allowedRoles.includes(userRole || '')) {
// Redirecionar para a página inicial apropriada baseado no papel do usuário
switch (userRole) {
case 'student':
return <Navigate to="/aluno" />;
case 'teacher':
return <Navigate to="/professor" />;
case 'school':
return <Navigate to="/dashboard" />;
default:
return <Navigate to="/" />;
// Se não houver roles requeridas, permite acesso
if (allowedRoles.length === 0) {
return <>{children}</>;
}
// Se o usuário não tiver o role necessário
if (!allowedRoles.includes(userRole || '')) {
console.log('Role atual:', userRole);
console.log('Roles permitidas:', allowedRoles);
// Redireciona para a página apropriada
if (userRole === 'school') {
return <Navigate to="/dashboard" replace />;
} else if (userRole === 'teacher') {
return <Navigate to="/professor" replace />;
} else if (userRole === 'student') {
return <Navigate to="/aluno" replace />;
}
// Se não tiver role definido, volta para home
return <Navigate to="/" replace />;
}
return <>{children}</>;

View File

@ -20,29 +20,45 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
React.useEffect(() => {
const fetchSession = async () => {
const { data: { session } } = await supabase.auth.getSession();
setUser(session?.user ?? null);
setUserRole(session?.user?.user_metadata?.role ?? null);
setLoading(false);
console.log('Sessão atual:', session);
if (session?.user) {
const role = session.user.user_metadata?.role;
handleRedirect(role);
setUser(session.user);
const role = session.user.user_metadata.role;
console.log('Role na sessão:', role);
setUserRole(role);
if (role === 'school') {
navigate('/dashboard');
}
}
setLoading(false);
};
fetchSession();
const { data: { subscription } } = supabase.auth.onAuthStateChange(async (event, session) => {
setUser(session?.user ?? null);
setUserRole(session?.user?.user_metadata?.role ?? null);
setLoading(false);
console.log('Evento de auth:', event);
console.log('Sessão no evento:', session);
if (event === 'SIGNED_IN' && session?.user) {
const role = session.user.user_metadata?.role;
handleRedirect(role);
} else if (event === 'SIGNED_OUT') {
if (session?.user) {
setUser(session.user);
const role = session.user.user_metadata.role;
console.log('Role no evento:', role);
setUserRole(role);
if (event === 'SIGNED_IN') {
if (role === 'school') {
navigate('/dashboard');
}
}
} else {
setUser(null);
setUserRole(null);
navigate('/');
}
setLoading(false);
});
return () => {
@ -50,31 +66,15 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
};
}, [navigate]);
const handleRedirect = (role: string | undefined) => {
switch (role) {
case 'school':
navigate('/dashboard');
break;
case 'teacher':
navigate('/professor');
break;
case 'student':
navigate('/aluno');
break;
default:
navigate('/');
}
};
const signOut = async () => {
await supabase.auth.signOut();
navigate('/');
};
const value = {
user,
loading,
signOut,
signOut: async () => {
await supabase.auth.signOut();
setUser(null);
setUserRole(null);
navigate('/');
},
userRole
};