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.
Opa, muito bom o post.
Eu sei já trabalhar com java, como OOP, métodos, tipos de dados e etc.
Quero focar no desenvolvimento web, onde sempre me confundo o que é servelet ou JSP, por que usar os framework e etc. Minha dúvida é, você recomenda qual livro para java para web?
Obrigado
olá Rafael,
Faz parte do processo essa confusão, nao se preocupe, quanto mais for se envolvendo, vai entendendo melhor. Sobre servlet veja: aqui
E um livro que indico é do Edson Gonçalves Desenvolvendo Aplicações Web com JSP, SERVLETS, JAVASERVER FACES, HIBERNATE, EJB 3 PERSISTENCE E AJAX
flw!
Uma outra duvida, o que seria JSF é um framework ou é nativo do java?
olá Rafael,
Sim é um framework desenvolvido pela Sun. Esqueça os .jsp, JSTL quando usa JSF.
abracos, 😀