Я пытаюсь сделать относительно простую вещь: войти в систему пользователя вручную.Я использую плагин 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
}