Spring Rest和社交SignUp with Rest

时间:2015-01-27 14:42:29

标签: facebook spring rest spring-security spring-social

我的应用程序公开了服务的REST API,并使用SpringSecurity来管理私有服务的登录。 通过自定义注册和登录,我不会遇到任何问题,但现在我尝试使用Facebook或Twitter实现登录/注册,而且我不知道如何执行此操作。

有没有人有同样的问题并解决了它?

我尝试使用自定义密码"很长时间"对于每个Facebook和Twitter帐户,但这不起作用。

更新

我尝试了您的解决方案,但收到错误。这是我的代码

public UserDetails loadUserByUsername(String mail) throws UsernameNotFoundException {
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        if (ConstantPWCabinet.SOCIAL_LOGIN_FACEBOOK.equalsIgnoreCase(attr.getRequest().getParameter(ConstantPWCabinet.LOGIN_TYPE))) {
            User facebookInfo = dao.getFacebookInfo(new FacebookTemplate(attr.getRequest().getParameter(ConstantPWCabinet.FACEBOOK_TOKEN)));
            List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
            authorities.add(new SimpleGrantedAuthority(Role.ROLE_USER_FACEBOOK.toString()));
            org.springframework.security.core.userdetails.User user = new org.springframework.security.core.userdetails.User(facebookInfo.getEmail(), null, authorities);
            Authentication auth = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
            SecurityContextHolder.getContext().setAuthentication(auth);

            return user;

        }

        logger.debug("Mail di accesso: " + mail);
        User user = dao.getUserSelectedMail(mail);
        List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        String role = user.getRole().toString();
        if (StringUtils.isEmpty(role))
            authorities.add(new SimpleGrantedAuthority(Role.ROLE_USER.toString()));
        else
            authorities.add(new SimpleGrantedAuthority(role));
        return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), authorities);
    }

但是我得到了&#34; Bad credential&#34;没有登录。

1 个答案:

答案 0 :(得分:2)

  1. 您有一个可以侦听网址j_spring_security_check
  2. 的AuthenticationFilter
  3. 过滤器创建一个身份验证对象并发送给身份验证提供程序。
  4. AuthenticationProvider调用UserDetailsS​​ervice以按用户名加载用户并对用户进行身份验证。
  5. 过滤器然后检查提供程序返回的身份验证对象,并向成功/失败处理程序发送请求。
  6. 当您通过社交媒体进行此操作时,您的用户将通过外部来源进行身份验证,因此您无需在最终验证用户。

    你可以简单地做到

    //验证用户

    UserDetails user = userDetailsService.loadUserByUsername(username);
    Authentication auth = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
    SecurityContextHolder.getContext().setAuthentication(auth); 
    

    这将在没有密码的情况下对用户进行身份验证。