Bom dia pessoal !!
Segui o tutorial: “http://jamacedo.com/2011/01/crud-jsf-2-parte-3-seguna-com-spring-security-3/” e funcionou perfeitamente, porém preciso acrescentar mais um campo ao fazer o login: “CNPJ”, tentei acrescentar seguindo o mesmo padrão dos campos USERNAME e PASSWORD, mas não funciona, ou melhor loga no sistema mesmo não digitando nada no campo CNPJ… É algum padrão do Spring apenas USERNAME E PASSWORD ??? pois todos tutoriais que vejo segue o mesmo padrão… agradeço pela ajuda de todos…vlwww
[RESOLVIDO] - Spring Security - Login com 3 campos
5 Respostas
Bom dia Felipe.
Aqui na empresa teve um projeto que usamos o spring security 3, da mesma forma que você a gente precisou de um login onde eram informados 3 dados no login. Foi resolvido da seguinte forma:
Obs. não fui eu quem criou esta solução, apenas estudei a solução criada.
No botão de submit do login no evento onclick o campo adicional identificador é concatenado com o username:
logon.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<html>
<head>
<title><f:view> <h:outputText value="#{msg.logon}"/></f:view> </title>
<link rel="shortcut icon" href="<%=request.getContextPath()%>/resources/images/favicon.ico"/>
<link type="text/css" rel="stylesheet"
href="<%=request.getContextPath()%>/resources/css/login.css" />
</head>
<f:view locale="#{languageSwitcher.locale}">
<body onload="document.getElementById('identificador').focus();">
<div class="geral">
<form method="POST" action="<c:url value="/j_spring_security_check" />">
<img id="logo"
src="<%=request.getContextPath()%>/resources/images/Logo.gif" />
<fieldset>
<c:if test="${not empty param.error}">
<div>
<font color="red"> Identificador, usuário ou senha inválido.</font>
</div>
</c:if>
<label for="identificador"><h:outputText value="#{msg.logon_identificador}" /></label>
<input type="text" name="i_identificador" id="identificador" maxlength="20" tabindex="1" />
<label for="login"><h:outputText value="#{msg.logon_usuario}" /></label>
<input type="text" name="i_username" id="login" maxlength="20" tabindex="1" /> <input type="hidden" name="j_username" />
<label for="password"><h:outputText value="#{msg.logon_senha}" /></label> <input type="password" name="j_password" id="password" maxlength="20" tabindex="10" />
</fieldset>
<br />
<h:commandButton value="#{msg.botao_enviar}" onclick="j_username.value=i_identificador.value + '@' + i_username.value; return true" styleClass="botao" />
<h:commandButton value="#{msg.botao_limpar}" type="reset" styleClass="botao"/>
</form>
</div>
</body>
</f:view>
</html>
Para resolver esta situação da concatenação foi criada uma classe que estende JdbcDaoImpl, nessa classe as queries defaults UsersByUsernameQuery e AuthoritiesByUsernameQuery são sobrepostas por chamadas as funções internas de nosso banco que fazem a separação do parametro username e do identificador adicional concatenado.
Funciona certinho da maneira que precisamos.
Att. Henrique
Bom dia Felipe.Aqui na empresa teve um projeto que usamos o spring security 3, da mesma forma que você a gente precisou de um login onde eram informados 3 dados no login. Foi resolvido da seguinte forma:
Obs. não fui eu quem criou esta solução, apenas estudei a solução criada.No botão de submit do login no evento onclick o campo adicional identificador é concatenado com o username:
logon.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <html> <head> <title><f:view> <h:outputText value="#{msg.logon}"/></f:view> </title> <link rel="shortcut icon" href="<%=request.getContextPath()%>/resources/images/favicon.ico"/> <link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/resources/css/login.css" /> </head> <f:view locale="#{languageSwitcher.locale}"> <body onload="document.getElementById('identificador').focus();"> <div class="geral"> <form method="POST" action="<c:url value="/j_spring_security_check" />"> <img id="logo" src="<%=request.getContextPath()%>/resources/images/Logo.gif" /> <fieldset> <c:if test="${not empty param.error}"> <div> <font color="red"> Identificador, usuário ou senha inválido.</font> </div> </c:if> <label for="identificador"><h:outputText value="#{msg.logon_identificador}" /></label> <input type="text" name="i_identificador" id="identificador" maxlength="20" tabindex="1" /> <label for="login"><h:outputText value="#{msg.logon_usuario}" /></label> <input type="text" name="i_username" id="login" maxlength="20" tabindex="1" /> <input type="hidden" name="j_username" /> <label for="password"><h:outputText value="#{msg.logon_senha}" /></label> <input type="password" name="j_password" id="password" maxlength="20" tabindex="10" /> </fieldset> <br /> <h:commandButton value="#{msg.botao_enviar}" onclick="j_username.value=i_identificador.value + '@' + i_username.value; return true" styleClass="botao" /> <h:commandButton value="#{msg.botao_limpar}" type="reset" styleClass="botao"/> </form> </div> </body> </f:view> </html>Para resolver esta situação da concatenação foi criada uma classe que estende JdbcDaoImpl, nessa classe as queries defaults UsersByUsernameQuery e AuthoritiesByUsernameQuery são sobrepostas por chamadas as funções internas de nosso banco que fazem a separação do parametro username e do identificador adicional concatenado.
Funciona certinho da maneira que precisamos.
Att. Henrique
Obrigado pela dica, vou tentar implementar dessa forma…vlww
Mais uma vez obrigado Henrique, consegui resolver através de sua dica, ao invés de separar a concatenação, eu fiz uma consulta com a concatenação, segue a modificação no “applicationContext”:
<authentication-manager>
<authentication-provider>
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="SELECT concat(username,'@',cnpj) as username, password, enable FROM usuario WHERE concat(username,'@',cnpj)=?"
authorities-by-username-query="SELECT concat(Usuario_username,'@', Usuario_cnpj) as username, autorizacoes_nome as authority FROM usuario_autorizacao WHERE concat(Usuario_username,'@', Usuario_cnpj)=?"
/>
</authentication-provider>
</authentication-manager>
vlwww
.
Legal que funcionou felipe. Legal também você postar a alteração/solução que você fez.
vlw.