gpt4 book ai didi

java - Spring social signin 和 spring security 自定义认证管理器

转载 作者:行者123 更新时间:2023-11-30 09:27:34 24 4
gpt4 key购买 nike

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

我正在创建一个使用 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 处理,如果可用,它会处理读取 cookie 并记住用户(如果存在)。什么是我可以通过 cookie 发送给用户以记住我的最佳保护信息,现在我正在发送用户 ID,但这不是我想要的

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

第一个问题我的代码是否足以通过服务器正确验证用户身份?,在下一个请求中。如果我在 userInterceptor 中询问 SecurityContextHolder.getContext().getAuthentication() != null 我是否可以安全地假设用户已登录?

现在我想让 spring security 来处理我的身份验证,而不是自己使用拦截器来处理。所以我考虑创建一个身份验证管理器。但我不明白我需要在哪些方面进行身份验证

        public class CustomAuthenticationManager implements AuthenticationManager {
public Authentication authenticate(Authentication auth)
throws AuthenticationException {}}

我没有用户名和密码,我只是使用 facebook 进行身份验证以登录,所以我使用什么进行身份验证。总的来说,我在这里有一些知识差距,我真的不明白我应该做什么才能让所有东西粘在一起

第二个问题在我的情况下,authenticate 函数究竟需要发生什么

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

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

谢谢。

最佳答案

那里有很多问题。首先,您在第一个框中编写的代码实际上已经通过可注入(inject)的 ConnectionSignUp 在 JdbcUsersConnectionRepository 中得到支持。 ConnectionSignUp 是一个策略接口(interface),如果 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 示例。

关于java - Spring social signin 和 spring security 自定义认证管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14545413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com