Fix: Supabase row-level security error
The AI addressed the Supabase row-level security error by ensuring correct authentication and data insertion in `TransactionForm.tsx`. It also updated `src/services/transacaoService.ts` to check for valid sessions.
This commit is contained in:
parent
c5d3e51a34
commit
9116d7a5be
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import { Toaster } from "@/components/ui/toaster";
|
import { Toaster } from "@/components/ui/toaster";
|
||||||
import { Toaster as Sonner } from "@/components/ui/sonner";
|
import { Toaster as Sonner } from "@/components/ui/sonner";
|
||||||
@ -105,7 +104,7 @@ const App = () => {
|
|||||||
setIsAutenticado(true);
|
setIsAutenticado(true);
|
||||||
localStorage.setItem('autenticado', 'true');
|
localStorage.setItem('autenticado', 'true');
|
||||||
localStorage.setItem('userId', session.user.id);
|
localStorage.setItem('userId', session.user.id);
|
||||||
} else if (event === 'SIGNED_OUT' || event === 'USER_DELETED') {
|
} else if (event === 'SIGNED_OUT') {
|
||||||
setIsAutenticado(false);
|
setIsAutenticado(false);
|
||||||
localStorage.setItem('autenticado', 'false');
|
localStorage.setItem('autenticado', 'false');
|
||||||
localStorage.removeItem('userId');
|
localStorage.removeItem('userId');
|
||||||
|
|||||||
@ -20,16 +20,14 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => {
|
|||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Verificar se temos um userId armazenado
|
// Verificar se temos uma sessão válida com o Supabase primeiro
|
||||||
const userId = localStorage.getItem('userId');
|
|
||||||
|
|
||||||
// Verificar se temos uma sessão válida com o Supabase
|
|
||||||
const { data: sessionData, error: sessionError } = await supabase.auth.getSession();
|
const { data: sessionData, error: sessionError } = await supabase.auth.getSession();
|
||||||
|
|
||||||
if (sessionError) {
|
if (sessionError) {
|
||||||
console.error('Erro ao verificar sessão:', sessionError);
|
console.error('Erro ao verificar sessão:', sessionError);
|
||||||
setIsAutenticado(false);
|
setIsAutenticado(false);
|
||||||
localStorage.setItem('autenticado', 'false');
|
localStorage.setItem('autenticado', 'false');
|
||||||
|
localStorage.removeItem('userId');
|
||||||
|
|
||||||
toast({
|
toast({
|
||||||
title: "Erro de autenticação",
|
title: "Erro de autenticação",
|
||||||
@ -51,14 +49,13 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => {
|
|||||||
console.log('Não foi possível atualizar a sessão ou usuário não está autenticado');
|
console.log('Não foi possível atualizar a sessão ou usuário não está autenticado');
|
||||||
setIsAutenticado(false);
|
setIsAutenticado(false);
|
||||||
localStorage.setItem('autenticado', 'false');
|
localStorage.setItem('autenticado', 'false');
|
||||||
|
localStorage.removeItem('userId');
|
||||||
|
|
||||||
if (userId) {
|
|
||||||
toast({
|
toast({
|
||||||
title: "Sessão expirada",
|
title: "Sessão expirada",
|
||||||
description: "Sua sessão expirou. Por favor, faça login novamente",
|
description: "Sua sessão expirou. Por favor, faça login novamente",
|
||||||
variant: "destructive"
|
variant: "destructive"
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
return;
|
return;
|
||||||
@ -67,6 +64,10 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => {
|
|||||||
console.log('Sessão atualizada com sucesso');
|
console.log('Sessão atualizada com sucesso');
|
||||||
setIsAutenticado(true);
|
setIsAutenticado(true);
|
||||||
localStorage.setItem('autenticado', 'true');
|
localStorage.setItem('autenticado', 'true');
|
||||||
|
|
||||||
|
// Garantir que o userId esteja atualizado
|
||||||
|
localStorage.setItem('userId', refreshData.session.user.id);
|
||||||
|
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -74,15 +75,12 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => {
|
|||||||
// Se chegou aqui, temos uma sessão válida
|
// Se chegou aqui, temos uma sessão válida
|
||||||
setIsAutenticado(true);
|
setIsAutenticado(true);
|
||||||
localStorage.setItem('autenticado', 'true');
|
localStorage.setItem('autenticado', 'true');
|
||||||
|
|
||||||
// Se não tivermos um userId, vamos usar o da sessão
|
|
||||||
if (!userId && sessionData.session.user.id) {
|
|
||||||
localStorage.setItem('userId', sessionData.session.user.id);
|
localStorage.setItem('userId', sessionData.session.user.id);
|
||||||
}
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Erro ao verificar autenticação:', error);
|
console.error('Erro ao verificar autenticação:', error);
|
||||||
setIsAutenticado(false);
|
setIsAutenticado(false);
|
||||||
localStorage.setItem('autenticado', 'false');
|
localStorage.setItem('autenticado', 'false');
|
||||||
|
localStorage.removeItem('userId');
|
||||||
|
|
||||||
toast({
|
toast({
|
||||||
title: "Erro inesperado",
|
title: "Erro inesperado",
|
||||||
@ -112,6 +110,7 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => {
|
|||||||
} else if (event === 'TOKEN_REFRESHED' && session) {
|
} else if (event === 'TOKEN_REFRESHED' && session) {
|
||||||
setIsAutenticado(true);
|
setIsAutenticado(true);
|
||||||
localStorage.setItem('autenticado', 'true');
|
localStorage.setItem('autenticado', 'true');
|
||||||
|
localStorage.setItem('userId', session.user.id);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -57,59 +57,39 @@ export function TransactionForm({ onSuccess, onCancel }: TransactionFormProps) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
async function revalidateSession() {
|
async function onSubmit(data: TransactionFormValues) {
|
||||||
|
setIsSubmitting(true);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Verificar sessão com Supabase
|
// Obter a sessão atual primeiro
|
||||||
const { data: sessionData, error: sessionError } = await supabase.auth.getSession();
|
const { data: sessionData, error: sessionError } = await supabase.auth.getSession();
|
||||||
|
|
||||||
if (sessionError || !sessionData.session) {
|
if (sessionError) {
|
||||||
console.error('Sessão inválida, tentando atualizar...');
|
toast({
|
||||||
|
title: "Erro de autenticação",
|
||||||
|
description: "Ocorreu um problema ao verificar sua autenticação. Por favor, faça login novamente.",
|
||||||
|
variant: "destructive"
|
||||||
|
});
|
||||||
|
navigate('/auth');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Tentar atualizar a sessão
|
// Verificar se temos uma sessão válida
|
||||||
const { data: refreshData, error: refreshError } = await supabase.auth.refreshSession();
|
if (!sessionData.session) {
|
||||||
|
|
||||||
if (refreshError || !refreshData.session) {
|
|
||||||
// Se não conseguir atualizar, redirecionar para login
|
|
||||||
console.error('Não foi possível atualizar a sessão:', refreshError);
|
|
||||||
toast({
|
toast({
|
||||||
title: "Sessão expirada",
|
title: "Sessão expirada",
|
||||||
description: "Sua sessão expirou. Por favor, faça login novamente.",
|
description: "Sua sessão expirou. Por favor, faça login novamente.",
|
||||||
variant: "destructive"
|
variant: "destructive"
|
||||||
});
|
});
|
||||||
|
|
||||||
// Limpar o estado de autenticação
|
|
||||||
localStorage.setItem('autenticado', 'false');
|
|
||||||
|
|
||||||
// Redirecionar para a página de login após um pequeno atraso
|
|
||||||
setTimeout(() => {
|
|
||||||
navigate('/auth');
|
navigate('/auth');
|
||||||
}, 1000);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('Sessão atualizada com sucesso');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Erro ao verificar sessão:', error);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function onSubmit(data: TransactionFormValues) {
|
|
||||||
setIsSubmitting(true);
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Verificar se a sessão está válida
|
|
||||||
const sessionValid = await revalidateSession();
|
|
||||||
if (!sessionValid) {
|
|
||||||
setIsSubmitting(false);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const userId = sessionData.session.user.id;
|
||||||
|
|
||||||
|
// Atualizar o userId no localStorage para garantir consistência
|
||||||
|
localStorage.setItem('userId', userId);
|
||||||
|
|
||||||
const valorNumerico = parseFloat(data.valor.replace(',', '.'));
|
const valorNumerico = parseFloat(data.valor.replace(',', '.'));
|
||||||
|
|
||||||
if (isNaN(valorNumerico)) {
|
if (isNaN(valorNumerico)) {
|
||||||
@ -118,19 +98,6 @@ export function TransactionForm({ onSuccess, onCancel }: TransactionFormProps) {
|
|||||||
description: "O valor precisa ser um número válido",
|
description: "O valor precisa ser um número válido",
|
||||||
variant: "destructive"
|
variant: "destructive"
|
||||||
});
|
});
|
||||||
setIsSubmitting(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obtém o ID do usuário logado
|
|
||||||
const userId = localStorage.getItem('userId');
|
|
||||||
if (!userId) {
|
|
||||||
toast({
|
|
||||||
title: "Erro de autenticação",
|
|
||||||
description: "Você precisa estar logado para adicionar transações",
|
|
||||||
variant: "destructive"
|
|
||||||
});
|
|
||||||
setIsSubmitting(false);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,15 +111,12 @@ export function TransactionForm({ onSuccess, onCancel }: TransactionFormProps) {
|
|||||||
|
|
||||||
console.log(`Inserindo transação na tabela ${tabelaTransacoes} para o usuário ${userId}`);
|
console.log(`Inserindo transação na tabela ${tabelaTransacoes} para o usuário ${userId}`);
|
||||||
|
|
||||||
// Obtém a sessão atual para acessar o token JWT - nova solicitação após validação
|
// Insere a transação na tabela específica do usuário usando o userId da sessão atual
|
||||||
const { data: sessionData } = await supabase.auth.getSession();
|
|
||||||
|
|
||||||
// Insere a transação na tabela específica do usuário
|
|
||||||
const { error } = await supabase
|
const { error } = await supabase
|
||||||
.from(tabelaTransacoes as any)
|
.from(tabelaTransacoes as any)
|
||||||
.insert([
|
.insert([
|
||||||
{
|
{
|
||||||
usuario_id: userId,
|
usuario_id: userId, // Usar o userId da sessão atual, não do localStorage
|
||||||
estabelecimento: data.estabelecimento,
|
estabelecimento: data.estabelecimento,
|
||||||
valor: valorFinal,
|
valor: valorFinal,
|
||||||
detalhes: data.detalhes,
|
detalhes: data.detalhes,
|
||||||
@ -165,7 +129,7 @@ export function TransactionForm({ onSuccess, onCancel }: TransactionFormProps) {
|
|||||||
if (error) {
|
if (error) {
|
||||||
console.error('Erro ao salvar transação:', error);
|
console.error('Erro ao salvar transação:', error);
|
||||||
|
|
||||||
if (error.message.includes('JWTClaimsSetVerificationException')) {
|
if (error.message.includes('authentication')) {
|
||||||
toast({
|
toast({
|
||||||
title: "Erro de autenticação",
|
title: "Erro de autenticação",
|
||||||
description: "Sua sessão expirou. Por favor, faça login novamente.",
|
description: "Sua sessão expirou. Por favor, faça login novamente.",
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user