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
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
[quote=henriquedroog]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[/quote]
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.