Spring社交登录和Spring安全自定义身份验证管理器

时间:2013-01-27 07:34:08

标签: java spring spring-mvc spring-security spring-social

我想了解我是否正确处理我的服务器身份验证

我正在创建一个使用Facebook自动登录的服务器,而且我正在使用hibernate

我通过制作默认JdbcUsersConnectionRepository的相同流程来实现这一点 但我总是返回一个用户。如果没有找到。

@Override
public List<String> findUserIdsWithConnection(Connection<?> connection) {
    List<String> ret = new LinkedList<String>();
    ConnectionKey key = connection.getKey();
    MyUser myUser = userService.getUserBySocialConnection(key.getProviderId(), key.getProviderUserId());
    if (myUser == null)
    {
        MyUser user = userService.createUserFromConnection(connection);
        String myUserId = String.valueOf(user.getId());
        ret.add(myUserId);
    }else
    {
        ret.add(String.valueOf(myUser.getId()));
    }
    return ret;
}

所以我的signIn有这段代码。登录用户:

   public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {
    MyUser user = userService.getUserById(Long.parseLong(userId));
    Authentication authentication = SecurityToolbox.signInUser(user);
    // set remember-me cookie
    MyUser myu = (MyUser)authentication.getPrincipal();
    userCookieGenerator.addCookie(String.valueOf(myu.getId()), request.getNativeResponse(HttpServletResponse.class));
    return null;
}

以及来自SecurityToolBox的代码:

  public static Authentication signInUser(MyUser user) {
    List<GrantedAuthority> authorities = getAuthorities(user);
    Authentication authentication = new UsernamePasswordAuthenticationToken(user, "", authorities);
    SecurityContextHolder.getContext().setAuthentication(authentication);
    return authentication;
  }

现在所有这一切都由我编写的userInterceptor处理,该userInterceptor处理读取cookie(如果可用)并记住用户(如果存在)。 什么是最好的受保护信息,我可以发送给用户的cookie,以便记住我现在发送用户ID,但这不是我想要的

我现在想让spring security处理我的session / remmeberme / authentication过程 但我真的不明白我应该做些什么。

第一个问题 我的代码是否足以在下一个请求中使用服务器正确验证用户?如果我在SecurityContextHolder.getContext().getAuthentication() != null询问 public class CustomAuthenticationManager implements AuthenticationManager { public Authentication authenticate(Authentication auth) throws AuthenticationException {}} 我是否可以安全地假设用户已登录?

现在我希望有Spring安全性来处理我的身份验证,而不是自己使用拦截器。所以我想创建一个身份验证管理器。但我不明白我需要在

中进行身份验证
authenticate

我没有用户名和密码,我刚刚通过facebook验证登录,所以我可以通过身份验证进行身份验证。 总的来说,我在这里有一些知识差距,我真的不明白我应该做些什么来让一切都团结在一起

第二个问题 在我的情况{{1}}函数中究竟需要发生什么?

第三个问题 我希望spring security能够处理会话和cookie以便记住我。我知道有一个记住我的令牌与u / p令牌相同,但我仍然不明白我应该如何在我的情况下使用它。

第四个问题 现在,整个登录过程发生在发送到服务器的每个请求(不是资源)上。这是应该发生的方式吗?

感谢。

1 个答案:

答案 0 :(得分:2)

那里有很多问题。首先,您在第一个框中编写的代码实际上已经通过可以注入的ConnectionSignUp在JdbcUsersConnectionRepository中受支持。 ConnectionSignUp是一个策略接口,如果JdbcUsersConnectionRepository找不到用户,您可以实现该接口来创建用户。查看spring-social-quickstart应用程序以查看此实例的示例。

如果没有深入阅读,你的登录代码看起来很好,但我同意,基本上重新创建Spring Security已经在拦截器中执行的所有工作是很多工作。因此,Spring Social的最新快照构建包括与Spring Security的更紧密集成。

新东西有一个SocialAuthenticationFilter,它是一个Spring Security身份验证过滤器,就像任何其他身份验证过滤器一样,它直接插入Spring Security的过滤器链。此身份验证筛选器的工作方式是将用户的提供程序信息与本地应用程序上先前建立的连接进行比较,如果找到匹配项,则会对其进行签名。否则,它会重定向到注册页面。

从功能角度来看,它与Spring Social的ProviderSignInController完成相同的工作。但它的不同之处在于它与Spring Security紧密集成,因此您期望的所有安全性内容(记住我,权限等)只是按照您的期望而不需要太多/任何额外的努力部分。

同样,这只是在最新的1.1.0.BUILD-SNAPSHOT版本中,但我预计(除非有任何意外)在下周初推出1.1.0.M2版本。如果你想看一些这方面的例子,请看一下spring-social-showcase-sec或spring-social-showcase-sec-xml示例。