mirror of
https://github.com/lucasrcsantana/story-generator.git
synced 2025-12-17 05:47:52 +00:00
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:
parent
4b431358e0
commit
441b55535e
@ -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]}`);
|
||||
|
||||
@ -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}</>;
|
||||
|
||||
@ -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
|
||||
};
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user