java.lang.IllegalStateException: ни один пользователь в настоящее время не вошел в - PullRequest
0 голосов
/ 13 мая 2018

Я пытался интегрировать социальный вход в свое весеннее приложение. Ранее я сталкивался с ошибками, такими как отсутствие имени боба facebook и connectionRepository. После того, как я интегрировал код из https://github.com/spring-social/spring-social-google-example,, особенно socialConfig и других файлов, я смог двигаться дальше. Но все равно я получаю ошибку java.lang.IllegalStateException: No user is currently signed in, которая существует в файле SecurityContext.java, где метод getCurrentUser() выдает IllegalStateException, хотя я установил currentUser из метода SimpleSignInAdapter.signIn. Для пользователя Facebook я использовал org.springframework.social.facebook.api.User и установил SecurityContext.setCurrentUser(new User(userId, null, null, null, null, null));

Ошибка возникает из ConnectionRepository.connectionRepository при вызове User user = SecurityContext.getCurrentUser (). Я напечатал значение, и оно возвращает ноль, и исключение выдается. Я раньше не использовал threadlocal и испытывал трудности при работе с ним. Есть ли другие альтернативы для threadlocal и другие возможные решения?

Мой класс SecurityContext такой, как показано ниже

    public  final class SecurityContext  {

    private static final ThreadLocal<User> currentUser = new ThreadLocal<User>();
    private static Logger logger = LoggerFactory.getLogger(SecurityContext.class);

    public static User getCurrentUser() {
        User user = currentUser.get();
        if (user == null) {
            throw new IllegalStateException("No user is currently signed in");
        }
        return user;
    }

    public static void setCurrentUser(User user) {
        currentUser.set(user);
    }

    public static boolean userSignedIn() {
        return currentUser.get() != null;
    }

    public static void remove() {
        currentUser.remove();
    }

}

ThreadLocal currentUser установлен из следующего класса

public final class SimpleSignInAdapter implements SignInAdapter {

    private final UserCookieGenerator userCookieGenerator = new UserCookieGenerator();

    public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {
User user= new User(userId, null, null, null, null, null);
        SecurityContext.setCurrentUser(user);
        userCookieGenerator.addCookie(userId, request.getNativeResponse(HttpServletResponse.class));
         boolean flag = true;
            if (flag) {        
                return "/signup";
            }
        return null;
    }
}

Ниже приведен мой метод connectionRepository из socialConfig.class, из которого возникает ошибка при вызове SecurityContext.getCurrentUser (), который является нулевым, даже если currentuser установлен в вышеприведенном классе.

    @Bean
@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)
public ConnectionRepository connectionRepository() {
    User user = SecurityContext.getCurrentUser();
    ConnectionRepositorycr=usersConnectionRepository().createConnectionRepository(user.getId());
    logger.debug("cr==>"+cr);
    return cr;
}
...