Olá, pessoal!
No artigo de hoje, quero complementar dois artigos do Edson
Gonçalves sobre Spring Security:
- Segurança com Spring Security 3.0 utilizando banco de dados
- Segurança passo a passo com Spring Security 3.0
Muitos desenvolvedores que
pretendem usar Spring Security (SS) em suas apps JEE sofrem para implementar
a regra de segurança quando já existem dados cadastrados no BD
e não se quer mudar as informações no BD para prefixar o ROLE_, que
é requerido pelo SS.
Vamos ver, então, como resolver esse problema, com o qual você pode se
deparar em sistema legado.
Lets
go…
Recomendado:
Iniciando
Vou levar em conta que
você já tem implementado o SS conforme este artigo do Edson Gonçalves. Caso contrário, leia o texto do
Gonçalves antes de continuar com o meu.
Mas, para refrescar
sua mente, lembre-se de que o role deve ter ROLE_ prefixado para que as
regras funcionem. Isso é default no SS. Há como alterar, porém
pesquisei muito e não consegui implementar. No fórum SS existem
várias sugestões, mas nenhuma delas foi mais eficiente que prefix o
ROLE_ com os dados trazido do BD.
Desenvolvendo
A solução é mais
simples que podemos imaginar, você vai precisar apenas prefix o
ROLE_. Para quem usa MySQL, temos a função concat(). Enfim, verifique na documentação do seu banco como
concatenar.
A seguir, mostramos com
o MySQL. É simples demais, confira:
authorities-by-username-query="SELECT<br /> username, concat('ROLE_',authority) FROM users where username = ? "O código completo fica
assim:
< jdbc-user-service data-source-ref="dataSource"users-by-username-query="SELECT username, password, 'true' as <br />enable FROM users WHERE username=?" authorities-by-username-query="SELECT username, concat('ROLE_',authority) FROM<br /> users where username = ? "/> Outra dica é se a
coluna do usuario/password não for o que o Spring Security espera,
basta você fazer conforme o código a seguir:
<jdbc-user-service<br />data-source-ref="dataSource" users-by-username-query="SELECT<br />us.email as username, us.senha as password, 'true' as enable FROM usuario as us WHERE email=?" <br />authorities-by-username-query="SELECTus.email as username, us.tipo as authority FROM usuario us where email= ?"/> <br /></authentication-provider> Vou
ficando por aqui, espero que tenham gostado. Abraços e até o próximo!







