2013-08-20 4 views
1

Я ищу переход от использования комбинации имени пользователя/пароля для аутентификации в приложении Grails с использованием электронной почты/пароля. Я попытался внести изменения в AuthControler.groovy и ShiroDbReal.groovy, чтобы разрешить это, но он не позволяет мне войти в систему.Использование адреса электронной почты в качестве уникального идентификатора вместо имени пользователя с помощью Shiro for Grails

Вот моя модель класса

class User { 
String email 
String passwordHash 
byte[] passwordSalt 


static belongsTo = Account 
static hasMany = [ roles: Role, permissions: String ] 

static constraints = { 
    email (nullable: false, blank: false, unique: true) 
} 
} 

Вот моя функция AuthController зарегистрировались

def signIn = { 
    def authToken = new UsernamePasswordToken(params.email, params.password as String) 

    if (params.rememberMe) { 
     authToken.rememberMe = true 
    } 

    def targetUri = params.targetUri ?: "/" 

    def savedRequest = WebUtils.getSavedRequest(request) 
    if (savedRequest) { 
     targetUri = savedRequest.requestURI - request.contextPath 
     if (savedRequest.queryString) targetUri = targetUri + '?' + savedRequest.queryString 
    } 

    try{ 
     SecurityUtils.subject.login(authToken) 
     redirect(uri: targetUri) 
    } 
    catch (AuthenticationException ex){ 
     log.info "Authentication failure for user '${params.username}'." 
     flash.message = message(code: "login.failed") 
     redirect(action: "login", params: m) 
    } 
} 

Наконец мой ShiroDbReal.groovy

def authenticate(authToken) { 
    log.info "Attempting to authenticate ${authToken.username} in DB realm..." 
    def email = authToken.username 

    if (email == null) { 
     throw new AccountException("Null usernames are not allowed by this realm.") 
    } 

    def user = User.findByEmail(email) 
    if (!user) { 
     throw new UnknownAccountException("No account found for user [${username}]") 
    } 

    log.info "Found user '${user.username}' in DB" 
    def account = new SimpleAuthenticationInfo(email, user.passwordHash, new SimpleByteSource(user.passwordSalt), "ShiroDbRealm") 

    if (!credentialMatcher.doCredentialsMatch(authToken, account)) { 
     log.info "Invalid password (DB realm)" 
     throw new IncorrectCredentialsException("Invalid password for user '${username}'") 
    } 

    return account 
} 

Я ПОЛУЧАТЬ в «groovy.lang .MissingPropertyException: Нет такого свойства: имя пользователя для класса: исключение icango.User в отладчике на th e 'SecurityUtils.subject.login (authToken)' вызов метода.

Я не уверен, где еще искать, потому что я не могу найти документацию об изменении уникального идентификатора. Любая помощь будет действительно оценена.

ответ

2

Вы забыли изменить следующую строку:

log.info "Found user '${user.username}' in DB" 

удалить его или изменить его:

log.info "Found user '${user.email}' in DB" 

должен это исправить.

+0

Поскольку запись была отключена, я не думал, что эти утверждения будут оценены, я был неправ. Спасибо за головы. –

0

То же самое касается всех ваших исключений, кстати ... Вы должны изменить все имена пользователей по электронной почте.