SpringSecurity : usuario não loga após alterar a senha
Postado em
11/05/2012 16:19

0

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
Márcio Ferreira
Pontos: 14

0

0
11/05/2012 16:21
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]
}
}
Márcio Ferreira
Pontos: 14

0

0
13/05/2012 14:52
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?
Mussatto
Pontos: 345

0

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

0

0
14/05/2012 18:05
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
}
}
Mussatto
Pontos: 345

0

0
17/05/2012 14:04
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...
Márcio Ferreira
Pontos: 14

0

0
02/07/2012 14:48
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!
CarlosG
Pontos: 177