Spring Security Plugin -> Constraints nos campos Username e Password nao funciona
16/07/2012 22:45
0
Fala pessoal,

Estou com um problema com o Spring Security Plugin, pois criei o SecUser, mas nao consigo colocar CONSTRAINTS nos campos username e password... quando deixo eles como o padrao de fabrica eles funcionam, mas caso contrario o postgres simplesmente nao salva o usuario e apresenta a mensagem -->


URI
/udoctor/cadastro/cadastroInicialCliente
Class
java.sql.BatchUpdateException
Message
Entrada em lote 0 insert into usuario_regra (regra_id, usuario_id) values ('1', '3') foi abortada. Chame getNextException para ver a causa.

2012-07-16 19:01:02,712 [http-bio-7070-exec-3] ERROR StackTrace - Full Stack Trace:
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at br.com.udoctor.seguranca.UsuarioRegra.create(UsuarioRegra.groovy:32)
at br.com.udoctor.cadastro.CadastroController.cadastroInicialCliente(CadastroController.groovy:40)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into usuario_regra (regra_id, usuario_id) values ('1', '2') foi abortada. Chame getNextException para ver a causa.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2619)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:405)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2752)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
... 5 more
2012-07-16 19:01:02,712 [http-bio-7070-exec-3] ERROR StackTrace - Full Stack Trace:
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at br.com.udoctor.seguranca.UsuarioRegra.create(UsuarioRegra.groovy:32)
at br.com.udoctor.cadastro.CadastroController.cadastroInicialCliente(CadastroController.groovy:40)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into usuario_regra (regra_id, usuario_id) values ('1', '2') foi abortada. Chame getNextException para ver a causa.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2619)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:405)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2752)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
... 5 more



Dominio -->


		username blank: false, unique: true// email: true, size: 7..128 
//password blank: false ---> FUNCIONA
password validator: { String password, user ->
if (user.username && user.username.equals(password)) {
return 'user.password.error.username'
}

if (password && password.length() >= 8 && password.length() <= 64 &&
(!password.matches('^.*\p{Alpha}.*$') ||
!password.matches('^.*\p{Digit}.*$') ||
!password.matches('^.*[!@#$%^&].*$'))) {
return 'user.password.error.username'
}
}




Nao consigo usar CONSTRAINTS nos campos username e password, e nao estou entendendo esse erro somente nesse caso... ja fiz a instalacao do plugin 3 vezes do 0 e continuo com esse bug.

Segue o controller -->

				if(cliente.save(flush: true, failOnError: true)){
UsuarioRegra.create (cliente, regra, true)
chain(action:"formularioCliente", model:[cliente: cliente])
Tags: constraints, username, password, validacao


0
Daniel uso o springSecurityCore tbm, o que eu faço para tratar o campo password:
1 - o password ele é criptografado dai pode ser que retorne 'false' no seu validador após o springSecurityCore criptografa-lo, dai não salva de jeito nenhum.
2 - Para contornar esse erro eu uso um transient tipo 'password2' que ele não salva no banco mas faz as verificações necessárias para validadar o password.


transient password2

constraints {
username blank: false, unique: true// email: true, size: 7..128
//password blank: false ---> FUNCIONA
password2 validator: { String password, user ->
if (user.username && user.username.equals(password)) {
return 'user.password.error.username'
}

if (password && password.length() >= 8 && password.length() <= 64 &&
(!password.matches('^.*\p{Alpha}.*$') ||
!password.matches('^.*\p{Digit}.*$') ||
!password.matches('^.*[!@#$%^&].*$'))) {
return 'user.password.error.username'
}
}
}


No caso acima na hora de 'bindar' os valores tem que atribuir o valor de password ao password2 antes de criptografa-lo. No meu caso era isso que acontecia no plugin acredito que seja o mesmo com vc.
17/07/2012 12:10


0
Obrigado pela ajuda castiel, mas ainda nao consegui botar para funcionar.

Criei o seguinte transient password2:

		password2 validator: { password_aux, usuario ->
if (usuario.nome == password_aux) {
return false
}
if (password_aux.lenght() < 5 || password_aux.lenght() > 30){
return false
}
}



Modifiquei minha GSP para password2 e mantive meu controlador.
cliente.properties = params


Agora o grails esta reclamando que o password2 eh null, mas minha GSP esta com um campo g:passWord id=`passwor2`

Message Cannot invoke method lenght() on null object

O que estou fazendo de incorreto?


17/07/2012 16:43


0
Tenta o seguinte, volta a sua GSP ao normal('password'):

<g:passwordField name="password" value="" />


E tente mudar o Controller para:

cliente.properties = params
cliente.password2 = params.password
17/07/2012 17:56


0
Vou tentar agora
17/07/2012 18:20


0
Class
java.lang.NullPointerException
Message
Cannot invoke method lenght() on null object

Around line 50 of grails-app/domain/br/com/udoctor/seguranca/Usuario.groovy

47: if (usuario.nome == password_aux) {48: return false49: }50: if (password_aux.lenght() < 5 || password_aux.lenght() > 30){51: return false52: }53: }


O problema continua
17/07/2012 18:39


0

password blank: false, nullable: false
password2 validator: { password_aux, usuario ->
if (usuario.nome == password_aux) {
return false
}
if (password_aux != null && (password_aux.lenght() < 5 || password_aux.lenght() > 30)){
return false
}
}

Se fazer a maneira acima o 'password2' poderá ser nulo, porém se o 'password' for nullo ocorre o erro.
17/07/2012 19:49


0
Agora esta funcionando 100%, muito obrigado pelo suporte castiel.

17/07/2012 23:37



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto