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 实现 UserDetailsService
@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 结合起来?