package com.nicusa.security;
import com.nicusa.controller.SecurityController;
import com.nicusa.domain.UserProfile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.web.WebAttributes;
import org.springframework.security.web.savedrequest.RequestCache;
import org.springframework.security.web.savedrequest.SavedRequest;
import org.springframework.social.connect.Connection;
import org.springframework.social.connect.web.SignInAdapter;
import org.springframework.web.context.request.NativeWebRequest;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class UserProfileSignInAdapter implements SignInAdapter {
@PersistenceContext
private EntityManager entityManager;
@Autowired
private RequestCache requestCache;
@Autowired
private SecurityController securityController;
@Override
public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {
HttpServletRequest nativeReq = request.getNativeRequest(HttpServletRequest.class);
HttpServletResponse nativeRes = request.getNativeResponse(HttpServletResponse.class);
HttpSession session = nativeReq.getSession(false);
TypedQuery<UserProfile> userProfileByUserIdQuery = entityManager
.createQuery("select u from UserProfile u where u.userId = :userId", UserProfile.class);
userProfileByUserIdQuery.setParameter("userId", userId);
UserProfile userProfile = userProfileByUserIdQuery.getSingleResult();
securityController.signin(userProfile);
SavedRequest saved = requestCache.getRequest(nativeReq, nativeRes);
if (saved == null) {
return null;
} else {
requestCache.removeRequest(nativeReq, nativeRes);
if (session != null) {
session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
}
return saved.getRedirectUrl();
}
}
}