Grails - ShiroSecurity - вручную войти в систему - PullRequest
2 голосов
/ 24 августа 2011

Я пытаюсь сделать относительно простую вещь: войти в систему пользователя вручную.Я использую плагин FacebookGraph для подключения к Facebook.Если пользователь входит в систему через Facebook, я получаю его идентификатор и хочу аутентифицировать его в ShiroSecurity.Конечно, такая банальная вещь, как

session.user = user

, не работает.Я нашел код в вики, который должен сделать трюк:

Object userIdentity = user.email
String realmName = "username";
PrincipalCollection principals = new SimplePrincipalCollection(userIdentity, realmName);
Subject subject = new Subject.Builder().principals(principals).buildSubject();

Однако он не работает.Я все еще перенаправлен на авторизацию / вход в систему с сообщением log.debug, что ShiroSubject является нулевым.Может быть, это потому, что я вызываю этот код в службе.Любые идеи, как сделать эту работу?

ОБНОВЛЕНИЕ:

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

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

    // Get the user with the given username. If the user is not
    // found, then they don't have an account and we throw an
    // exception.
    log.debug "reached this point2"
    def user = ShiroUser.findByUsername(username)
    log.debug "reached this point"
    if (!user) {
        throw new UnknownAccountException("No account found for user [${username}]")
    }

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

    // Now check the user's password against the hashed value stored
    // in the database.
    def account = new SimpleAccount(username, user.passwordHash, "ShiroDbRealm")
    if (!credentialMatcher.doCredentialsMatch(authToken, account)) {
        log.info "Invalid password (DB realm)"
        throw new IncorrectCredentialsException("Invalid password for user '${username}'")
    }

    return account
}

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

Посмотрите на действие AuthController.groovy -> signIn.

Это именно тот код, который вам необходим для входа в систему.Главный шаг -

SecurityUtils.subject.login(new UsernamePasswordToken(username,password))

Надеюсь, это поможет ...

ок.Это только отправная точка ... взгляните на свой Realm-код на /Realms.Там вы найдете authenticate(authToken) закрытие.Кажется, это вызывается через SecurityUtils.subject.login() и обрабатывает проверку учетных данных ...

Это должно решить вашу проблему с хешированным паролем ....

2 голосов
/ 18 сентября 2011

Согласно Javadoc , Subject.Builder () не связывает автоматически тему с текущим потоком приложения.Попробуйте добавить это после создания вашего объекта Subject:

ThreadContext.bind(subject)
...