Facebook 登录后 (javascript sdk) - 如何在 Spring-Security 中创建用户会话?

Posted

技术标签:

【中文标题】Facebook 登录后 (javascript sdk) - 如何在 Spring-Security 中创建用户会话?【英文标题】:After Facebook Login (javascript sdk) - How do i create a user session in Spring-Security? 【发布时间】:2014-11-28 05:10:00 【问题描述】:

我正在使用: - Facebook-javascript-SDK(用于登录) - Angular-JS(前端) - Spring-Security(服务器安全层) - Spring MVC(服务器 MVC)

用户可以通过 (A) 使用 Facebook 登录(在 javascript FB SDK 中实现)或 (B) 登录到我的网络应用通过普通的用户名/密码表单。

在 (B) 的情况下 我做了一个带有字段的表单帖子:

j_username
j_password

to /j_spring_security_check (Spring Security)

这很好用。

但在 (A) 的情况下,用户通过 FB(在前端)登录后, 我需要做什么才能让 Spring Security 为用户创建会话? 此时我所拥有的只是 facebook 用户的电子邮件,而服务器在前端不知道此登录。

【问题讨论】:

【参考方案1】:

Face Book 登录成功后,您应该向您的后端API 发出AJAX 请求,并为用户创建有关Face book 身份验证的数据库条目。

1)您需要从 Spring-Security 实现 UserDetailsS​​ervice

@Component
public class CustomUserDetailsService implements UserDetailsService 

@Override
public UserDetails loadUserByUsername(String userEmail) throws UsernameNotFoundException 
    // check for Facebook authentication(DB Entry)
    // fetch user details and roles from db using e-mail
    SimpleGrantedAuthority authority = new SimpleGrantedAuthority(roles);

    UserDetails usd = new User(userId, userId, grantedAuths);
    return usd;




2) 实现自定义身份验证提供程序

@Component("customAuthenticationProvider")

public class CustomAuthenticationProvider implements AuthenticationProvider 

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException 
        String userId = authentication.getName();
        String password = authentication.getCredentials().toString();

        UserDetails userFromDB = customUserDetailsService.loadUserByUsername(userId);

        if (userFromDB != null) 

            List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>();
            for (GrantedAuthority auth : userFromDB.getAuthorities()) 
                grantedAuths.add(auth);
            

            if (grantedAuths.size() != 0) 
                System.out.println("user:" + userId + " got auth from custom auth provider");
                return new UsernamePasswordAuthenticationToken(userFromDB, password, grantedAuths);

             else 
                throw new DisabledException("No roles assigned");
            

        

        throw new DisabledException("User or password incorrect");

    

    @Override
    public boolean supports(Class<?> authentication) 
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    

3) 登录控制器

@Controller
public class LoginController 

    @Autowired
    private CustomAuthenticationProvider customAuthenticationProvider;

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

@RequestMapping(value = "/login",           )
public ResponseEntity<Object> fbLogin(@RequestParam String userEmail,  HttpServletRequest request) 

  UserDetails   userDetails=customUserDetailsService.loadUserByUsername(userid);

            UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(userDetails, userid);
            token.setDetails(new WebAuthenticationDetails(request));
            Authentication authentication = this.customAuthenticationProvider.authenticate(token);



4) Spring 安全配置

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 

@Autowired
private CustomAuthenticationProvider authProvider;  

 @Override
 protected void configure(AuthenticationManagerBuilder auth) throws Exception 
    auth.authenticationProvider(authProvider);
    

【讨论】:

以上是关于Facebook 登录后 (javascript sdk) - 如何在 Spring-Security 中创建用户会话?的主要内容,如果未能解决你的问题,请参考以下文章

Facebook API - javascript sdk:注销后状态显示“已连接”

利用 JavaScript SDK 部署网页版“Facebook 登录”

使用 JavaScript SDK 为 Web 登录 Facebook

Facebook 登录:如何将 JavaScript 与 PHP SDK 结合起来?

facebook 登录 使用 javascript sdk 的服务器端应用程序

JavaScript Facebook应用程序登录/授权完全是客户端