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); setLoading(true);
try { try {
console.log('Tentando login com:', { email, userType });
const { data, error } = await supabase.auth.signInWithPassword({ const { data, error } = await supabase.auth.signInWithPassword({
email: email, email: email,
password: password password: password
}); });
console.log('Resposta do Supabase:', { data, error });
if (error) throw error; if (error) throw error;
if (!data.user) { if (!data.user) {
throw new Error('Usuário não encontrado'); 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) { if (userRole !== userType) {
throw new Error(`Este não é um login de ${userTypeLabels[userType]}`); throw new Error(`Este não é um login de ${userTypeLabels[userType]}`);

View File

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

View File

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