[RESOLVIDO] - Spring Security - Login com 3 campos

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"> &nbsp; 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"> &nbsp; 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.