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);
|
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]}`);
|
||||||
|
|||||||
@ -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}</>;
|
||||||
|
|||||||
@ -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 (event === 'SIGNED_IN' && session?.user) {
|
if (session?.user) {
|
||||||
const role = session.user.user_metadata?.role;
|
setUser(session.user);
|
||||||
handleRedirect(role);
|
const role = session.user.user_metadata.role;
|
||||||
} else if (event === 'SIGNED_OUT') {
|
console.log('Role no evento:', role);
|
||||||
|
setUserRole(role);
|
||||||
|
|
||||||
|
if (event === 'SIGNED_IN') {
|
||||||
|
if (role === 'school') {
|
||||||
|
navigate('/dashboard');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} 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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user