Posso validar duas tabelas distintas no Spring Security?[RESOLVIDO]

7 respostas
rpsouza441

Minha aplicação está funcionando, mas como não conhecia o spring security quando comecei a implementar eu fiz uma tabela aluno e outra funcionario (não tem fk ligando uma a outra) e queria que os dois passassem pelo spring sec…

Tentei usar UNION no authentication-manager e nada. Tem alguma forma de fazer o spring sec. fazer o login de um dos dois? Se não vocês tem alguma dica de como eu posso melhor fazer isso?

ps.: espero ter postado no lugar certo :roll:

7 Respostas

WRYEL

Não mechi ainda com Spring security … Mas, já tentou fazer uma VIEW no banco ? :slight_smile:

rpsouza441

nas minhas pesquisas eu esbarrei em VIEW do mysql, mas n consegui conceber a ideia, porque no meu caso é assim: eu passo um login e senha, e esse login(matricula) pode estar no funcionario ou no aluno. Tem como fazer uma view com condicional? Exemplo: if(funcionario) {} else(aluno)?

WRYEL

Da pra fazer ifs, switchs e mais um monte de coisa em query sql … Mas, acho que o que estamos fazendo é gambiarra, me explica melhor o que você precisa fazer que eu vejo se posso te ajudar. Por enquanto, o que eu entendi é:

CREATE VIEW logins AS 
    SELECT a.login AS login, a.senha AS senha FROM tabela1 AS a 
    UNION 
    SELECT b.login AS login, b.senha AS senha FROM tabela2 AS b;
	
SELECT * FROM logins;
rpsouza441
WRYEL:
Da pra fazer ifs, switchs e mais um monte de coisa em query sql ... Mas, acho que o que estamos fazendo é gambiarra, me explica melhor o que você precisa fazer que eu vejo se posso te ajudar. Por enquanto, o que eu entendi é:
CREATE VIEW logins AS 
    SELECT a.login AS login, a.senha AS senha FROM tabela1 AS a 
    UNION 
    SELECT b.login AS login, b.senha AS senha FROM tabela2 AS b;
	
SELECT * FROM logins;

Em primeiro lugar obrigado por estar tentando me ajuda =)

Bem vamos ver se eu consigo me explicar hehehe

pelo que eu entendi o spring security só pode fazer um select simples (tentei outras modalidades e retornou erro no sql), e por eu n ter planejado direito o programa eu tenho o seguinte problema: Tenho a tabela do Funcionario que matricula(login) e senha, e em Aluno tem matricula(login) e senha. e o spring busca no banco assim
users-by-username-query="SELECT matricula_funcionario as username, senha as password, 'true' as enable FROM funcionario where matricula_funcionario=? "

no caso essa string está funcionando, mas n busca o aluno(lógico :!: )

WRYEL

Se você poder setar 2 parametros, pode fazer assim:

SELECT f.matricula_funcionario as username, f.senha as password,  'true' as enable FROM funcionario AS f where f.matricula_funcionario=? 
UNION 
SELECT a.matricula_aluno as username, a.senha as password, 'true' as enable FROM aluno AS a WHERE a.matricula_aluno=?

Caso contrário, pode fazer uma VIEW assim:

CREATE VIEW logins AS 
	SELECT f.matricula_funcionario as username, f.senha as password FROM funcionario AS f
	UNION 
	SELECT a.matricula_aluno as username, a.senha as password FROM aluno AS a;

ai na query do spring security:

SELECT username, password, 'true' as enable FROM logins WHERE username=?

edit:

VIEW é como se você quisesse disponibilizar uma Consulta SQL como uma tabela, ai você pode fazer selects em cima da view, entende ? :slight_smile:

rpsouza441

WRYEL:

VIEW é como se você quisesse disponibilizar uma Consulta SQL como uma tabela, ai você pode fazer selects em cima da view, entende ? :)

O pouco que li sobre view entendi que uma como se fosse um funil ou algo do tipo =p. E não sabia q ela conseguia interpretar duas tabelas como uma.
E o pior que eu usei o UNION no phpmyadmin e vi como q funciona, mas no spring ele reclama que são dois parametros algo assim, mas n tinha pensado no view e union.

Vou tentar colocar aqui no programa e qualquer resultado eu volto a postar.

Obrigado pela ajuda WRYEL


Funcionou! Só consegui tempo pra testar agora hehehe muito obrigado WRYEL
:slight_smile:

odisley

Olá,
Se você usar diretamente no spring assim:
SELECT f.matricula_funcionario as username, f.senha as password, ‘true’ as enable FROM funcionario AS f where f.matricula_funcionario=?
UNION
SELECT a.matricula_aluno as username, a.senha as password, ‘true’ as enable FROM aluno AS a WHERE a.matricula_aluno=?

Você terá que colocar dois parametros e não um. Isso porque no preparedStatement cada ? corresponde a um parâmetro.

No seu caso seria mais interessante utilizar uma visão como os amigos já postaram, podendo inclusive colocar uma coluna a mais para saber se é um aluno ou funcionario.

Criado 25 de maio de 2012
Ultima resposta 27 de mai. de 2012
Respostas 7
Participantes 3