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



 


Esqueceu sua senha?
 
Grails Brasil é mantido por itexto Desenvolvimento de Projetos Ltda.
Em caso de problemas, sinta-se livre para procurar Henrique Lobo Weissmann (Kico) por e-mail: kicolobo@itexto.net
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão (clique no logo à direita para maiores detalhes)