SpringSecurity : usuario não loga após alterar a senha
11/05/2012 16:19
0
fiz um codigo para fazer alteração de senha, caso o usuario a esqueça. Eu modifiquei o comportamento do plugin Spring Security UI para que o sistema envie o link para atualizar a senha passando como parametro de busca na view o email do usuario, ao inves do padrao original do plugin que é passar o username.

o código ficou assim

class RegisterController extends grails.plugins.springsecurity.ui.RegisterController {

def forgotPassword = {

if (!request.post) {
// show the form
return
}

String email = params.email
if (!email) {
flash.error = message(code: 'spring.security.ui.forgotPassword.username.missing')
redirect action: 'forgotPassword'
return
}

String usernameFieldName = SpringSecurityUtils.securityConfig.userLookup.emailPropertyName
def user = lookupUserClass().findWhere((usernameFieldName): email)
if (!user) {
flash.error = message(code: 'spring.security.ui.forgotPassword.user.notFound')
redirect action: 'forgotPassword'
return
}

def registrationCode = new RegistrationCode(username: user.username)
registrationCode.save(flush: true)

String url = generateLink('resetPassword', [t: registrationCode.token])

def conf = SpringSecurityUtils.securityConfig
def body = conf.ui.forgotPassword.emailBody
if (body.contains('$')) {
body = evaluate(body, [user: user, url: url])
}
mailService.sendMail {
to user.email
from conf.ui.forgotPassword.emailFrom
subject conf.ui.forgotPassword.emailSubject
html body.toString()
}

[emailSent: true]
}
}


Sendo que no arquivo DefaultSecurityConfig do spring, eu adicionei a variavel emailPropertyName que recebe como valor email e na view forgotPassword, eu troquei o valor username por email.

Isso esta funcionando normalmente e o sistema altera a senha do usuario, mas quando eu tento acessar o sistema com a nova senha ele diz que não pode achar o usuario com o username e a senha especificados.

Alguém já teve esse problema e conseguiu resolver?
Tags: spring, security , segurança, plugin


0
colei errado o codigo, sorry :)

//package br.com.jambu.cge.security

import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils
import org.codehaus.groovy.grails.plugins.springsecurity.ui.RegistrationCode
import br.com.jambu.cge.*

class RegisterController extends grails.plugins.springsecurity.ui.RegisterController {

def forgotPassword = {

if (!request.post) {
// show the form
return
}

String email = params.email
if (!email) {
flash.error = message(code: 'spring.security.ui.forgotPassword.username.missing')
redirect action: 'forgotPassword'
return
}

String usernameFieldName = SpringSecurityUtils.securityConfig.userLookup.emailPropertyName
def user = lookupUserClass().findWhere((usernameFieldName): email)
if (!user) {
flash.error = message(code: 'spring.security.ui.forgotPassword.user.notFound')
redirect action: 'forgotPassword'
return
}

def registrationCode = new RegistrationCode(username: user.username)
registrationCode.save(flush: true)

String url = generateLink('resetPassword', [t: registrationCode.token])

def conf = SpringSecurityUtils.securityConfig
def body = conf.ui.forgotPassword.emailBody
if (body.contains('$')) {
body = evaluate(body, [user: user, url: url])
}
mailService.sendMail {
to user.email
from conf.ui.forgotPassword.emailFrom
subject conf.ui.forgotPassword.emailSubject
html body.toString()
}

[emailSent: true]
}
}
11/05/2012 16:21


0
Esse código ae parece ok....
Na confirmação ele não está levantando nenhum exceção?

No debug ele percorreu tudo certo? Fez a verificação da entidade no banco, todas as flags tao certas?
13/05/2012 14:52


0
Bom, o console nao aponta nenhum erro quando eu clico no button de logar. E o sistema faz a atualização da senha normalmente...
14/05/2012 14:10


0
Aqui estamos deixando por padrão dar um validate e logar os erros antes de salvar cada model por causa desses erros estranhos.
Estavam deixando passar varias exceções sem a gente perceber =/

exemplo:
def user = new User(params)
if (user.validate()) {
// do something with user
}
else {
user.errors.allErrors.each {
println it
}
}
14/05/2012 18:05


0
consegui resolver... ao que parece ele estava criptografando as senhas duas vezes antes de gravar no banco...

No domain User, eu so precisei comentar esta linha


/*def beforeUpdate() {
if (isDirty('password')) {
encodePassword()
}
}*/


e funcionou...
17/05/2012 14:04


0
Oi, amigo.

Não creio que esta seja uma boa prática, pois o Spring Security Core utiliza este método de classe para evitar que o desenvolvedor o faça automaticamente em seus controllers.

Desabilite essa funcionalidade no plugin do Spring UI com o código abaixo:
grails.plugins.springsecurity.ui.encodePassword = false


Acredito ser a melhor solução para esse caso. :-)

Abraços!
02/07/2012 14:48



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