Olá Pessoal,
O post de hoje vem com o objetivo de complementar dois posts do Edson Gonçalves referente Spring Security. Muitos desenvolvedores que pretende usar Spring Security (SS) em suas apps JEE para implementar a regra de segurança sofrem quando já temos dados cadastrado no BD e não queremos mudar as informações no BD para prefix o ROLE_ que é requerido pelo SS.
Neste post vou mostrar como resolver este problema, que você pode se deparar em sistema legado.
Lets go…
Recomendado:
Iniciando
Vou levar em conta que você ja tem implementado o SS conforme este post do Edson Gonçalves. Caso contrário leia o post do Gonçalves antes de continuar com o meu.
Mas, para refrescar sua mente lembre-se que o role deve ter ROLE_ prefixado para que as regras funcionem. Isso é default no SS. Há como alterar, porém pesquisei muitooo e não conseguir implementar, no forum SS há varias sugestoes, 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 funcao concat(), no Oracle podemos usar | | etc. Em verifique na documentação do seu banco como concatenar.
A seguir mostramos com o MySQL. É simples demais, confira:
authorities-by-username-query="SELECT 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 enable FROM users WHERE username=?" authorities-by-username-query="SELECT username, concat('ROLE_',authority) FROM users where username = ? " />
ou dessa forma:
users-by-username-query="SELECT l.login as username, l.senha as password, 'true' as enable from funcionario l where l.login=?" authorities-by-username-query="SELECT lo.login as username, CONCAT('ROLE_',lo.cargo)as authority FROM funcionario lo where lo.login=?" />
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:
users-by-username-query="SELECT us.email as username, us.senha as password, 'true' as enable FROM usuario as us WHERE email=?" authorities-by-username-query="SELECT us.email as username, us.tipo as authority FROM usuario us where email= ?"
Vou ficando por aqui, espero que tenham gostado do post.
Abracos e até o próximo post.