Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将spring社会认证与spring安全性集成?_Spring_Spring Security_Spring Social - Fatal编程技术网

如何将spring社会认证与spring安全性集成?

如何将spring社会认证与spring安全性集成?,spring,spring-security,spring-social,Spring,Spring Security,Spring Social,我有一个小webapp,由springsecurity使用sqldb上的用户名/密码组合作为凭据进行保护 我现在想用spring social添加facebook/twitter身份验证。使用这些示例,我能够在数据库中存储用户凭据。我现在正在使用以下代码根据我的应用程序上的当前会话对用户进行身份验证: public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {

我有一个小webapp,由springsecurity使用sqldb上的用户名/密码组合作为凭据进行保护

我现在想用spring social添加facebook/twitter身份验证。使用这些示例,我能够在数据库中存储用户凭据。我现在正在使用以下代码根据我的应用程序上的当前会话对用户进行身份验证:

public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {

    User user = userService.getUserById(Long.parseLong(userId));
    user.setPassword(this.passwordEncoder.encodePassword(user.getAccessToken(), this.salt));
    this.userService.store(user);

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user.getDisplayName(), user.getAccessToken());

    HttpServletRequest req = request.getNativeRequest(HttpServletRequest.class); // generate session if one doesn't exist
    token.setDetails(new WebAuthenticationDetails(req));
    Authentication authenticatedUser = this.authenticationManager.authenticate(token);
    SecurityContextHolder.getContext().setAuthentication(authenticatedUser);

    return "/user/dashboard";
}
公共字符串签名(字符串用户ID、连接、NativeWebRequest){
User=userService.getUserById(Long.parseLong(userId));
user.setPassword(this.passwordEncoder.encodePassword(user.getAccessToken(),this.salt));
this.userService.store(用户);
UsernamePasswordAuthenticationToken=新的UsernamePasswordAuthenticationToken(user.getDisplayName(),user.getAccessToken());
HttpServletRequest req=request.getNativeRequest(HttpServletRequest.class);//如果不存在会话,则生成会话
token.setDetails(新的WebAuthenticationDetails(req));
AuthenticationAuthenticatedUser=this.authenticationManager.Authentication(令牌);
SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
返回“/用户/仪表板”;
}

身份验证工作正常,我没有收到任何不良凭证异常。但是在被重定向到/user/dashboard之后,我又回到了登录

我没有主意了,一段用于验证会话的类似代码正在经典注册后运行

有人知道为什么会发生这种情况或者如何调试吗

非常感谢!
Hendrik

我有类似的代码,适用于我,还添加了“记住我”支持:

//按id查找,在我的例子中是登录名
User=userService.findByLogin(userId);
//用于填充用户角色的代码
名单当局=。。。;
//创建my UserDetails实现的新实例
UserDetailsImpl springSecurityUser=新的UserDetailsImpl(用户、权限);
//使用UserDetails实例、密码和角色创建新身份验证
Authentication Authentication=new UsernamePasswordAuthenticationToken(springSecurityUser,user.getPassword(),authorities);
//在SecurityContext中设置身份验证
SecurityContextHolder.getContext().setAuthentication(身份验证);
//可选:记住我支持(必须在TokenBasedMemberMeservices中@Autowire)
TokenBasedMemberMeservices.onLoginSAccess(
(HttpServletRequest)请求。getNativeRequest(),
(HttpServletResponse)请求。getNativeResponse(),
认证);

这要看情况而定。我遇到了同样的情况,结果证明我的映射只允许角色“role_ANONYMOUS”,登录后我也被拒绝访问该角色。我不得不将其更改为允许“角色用户”。出于某种原因,当直接使用spring安全性登录(例如,basic或form登录)时,这不是一个问题。
// lookup by id, which in my case is the login
User user = userService.findByLogin(userId);
// code to populate the user's roles
List<GrantedAuthority> authorities = ...;
// create new instance of my UserDetails implementation
UserDetailsImpl springSecurityUser = new UserDetailsImpl(user, authorities);
// create new Authentication using UserDetails instance, password, and roles
Authentication authentication = new UsernamePasswordAuthenticationToken(springSecurityUser, user.getPassword(), authorities);
// set the Authentication in the SecurityContext
SecurityContextHolder.getContext().setAuthentication(authentication);
// optional: remember-me support (must @Autowire in TokenBasedRememberMeServices)
tokenBasedRememberMeServices.onLoginSuccess(
    (HttpServletRequest) request.getNativeRequest(),
    (HttpServletResponse) request.getNativeResponse(),
    authentication);