Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Social: "Unable to get a ConnectionRepository: no user signed in"

I'm trying to use Facebook sign in as described in https://github.com/spring-guides/gs-accessing-facebook

When I'm trying to create JdbcUsersConnectionRepository, I need spring security in class path. And when I add spring security I receive

"java.lang.IllegalStateException: Unable to get a ConnectionRepository: no user signed in"

when trying to receive Connection

Connection<Facebook> connection = connectionRepository.findPrimaryConnection(Facebook.class);

or checking

if (!facebook.isAuthorized())

All this happens only when spring security is in the class path

like image 899
Pavel Bernshtam Avatar asked Dec 29 '15 13:12

Pavel Bernshtam


1 Answers

Social Connection should be correspond to any auth user. It seems user should login through username/password or Service Provider. Try look at http://docs.spring.io/spring-social/docs/1.0.x/reference/html/signin.html

"java.lang.IllegalStateException: Unable to get a ConnectionRepository: no user signed in"

It happens because AuthenticationNameUserIdSource used by default

Internally, Spring Social’s configuration support will use the UsersConnectionRepository to create a request-scoped ConnectionRepository bean. In doing so, it must identify the current user. Therefore, we must also override the getUserIdSource() to return an instance of a UserIdSource.

In this case, we’re returning an instance of AuthenticationNameUserIdSource. This implementation of the UserIdSource interface assumes that the application is secured with Spring Security. It uses the SecurityContextHolder to lookup a SecurityContext, and from that return the name property of the Authentication object.

If your application isn’t secured with Spring Security, you’ll need to implement the UserIdSource interface as approprate for your application’s security mechanism. The UserIdSource interface looks like this:

package org.springframework.social;
public interface UserIdSource {
    String getUserId();
}

The getUserId() method simply returns a String that uniquely identifies the current user.

More info here

like image 157
Vitaly Velikodny Avatar answered Oct 02 '22 12:10

Vitaly Velikodny