Я пытался интегрировать социальный вход в свое весеннее приложение. Ранее я сталкивался с ошибками, такими как отсутствие имени боба 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;
}