当前位置: 首页 > 知识库问答 >
问题:

实现一个记住我的Spring-社会

屠浩
2023-03-14

我有一个启用了Spring安全的项目。我已经使用运行良好的登录表单实现了记住我。但是我在登录表单上也有来自google/facebook的社交登录,它们运行良好。问题是他们不记得用户。有没有办法设置类似的“记住我”功能?

正常登录页面的当前spring配置:

<http access-denied-page="/login?authorization_error=true"
        disable-url-rewriting="true" authentication-manager-ref="formAuthenticationManager"
        xmlns="http://www.springframework.org/schema/security">
        <intercept-url pattern="/account/**" access="ROLE_USER" />

        <remember-me key="iRemember"
            token-validity-seconds="1209600" user-service-ref="formClientDetailsUserService" />
        <form-login authentication-failure-url="/login?authentication_error=true"
            default-target-url="/account/" login-page="/login"
            login-processing-url="/login.do" />
        <logout logout-success-url="http://example.com" logout-url="/logout" />
        <anonymous />
    </http>

共有3个答案

姚伟
2023-03-14

我们切换到Java配置并创建了记住我服务:

@Bean
public MyRememberMeServices myRememberMeServices(){
        MyRememberMeServices service = new MyRememberMeServices (REMEMBERME_KEY, formUserDetailsService);
        service.setAlwaysRemember(true);
        service.setCookieName("xxxx");
        service.setParameter("_spring_security_remember_me");
        service.setTokenValiditySeconds(123);
        return service;
    };

然后在社交登录的SignInAdapter实现上:

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

    // load the user based on the account id

    // create an authentication object to store in context


    // set remember-me cookie
    myRememberMeServices.onLoginSuccess(
        (HttpServletRequest) request.getNativeRequest(),
        (HttpServletResponse) request.getNativeResponse(),
        authentication);

    // forward to the original URL
    return extractOriginalUrl(request);
}
龚承嗣
2023-03-14
匿名用户

这就是我为将RememerMeServicesSpring社交集成所做的事情。就像@Sanjay所说,它基于Always记住=true逻辑。

我们不是默认的TokenBasedRememerMeServices,而是稍微定制一下:

public class DynamicRememberMeServices extends TokenBasedRememberMeServices {

public final static String PARAM_BASED_KEY = "remember-me-param-based"; 
public final static String REMEMBER_ME_KEY = "remember-me";

private Logger logger = LoggerFactory.getLogger(getClass());

public DynamicRememberMeServices(String key, UserDetailsService userDetailsService){
    super(key, userDetailsService);
    super.setParameter(REMEMBER_ME_KEY);
    super.setCookieName(REMEMBER_ME_KEY);
}

@Override
protected boolean rememberMeRequested(HttpServletRequest request, String parameter) {
    if("on".equalsIgnoreCase(request.getParameter(PARAM_BASED_KEY)) ){
        logger.debug("param based request");
        return super.rememberMeRequested(request, parameter);
    }
    logger.debug("always remember me");
    return true;
}

}

在< code>login.html上:

<form th:action="@{/login}" method="post">
   User Name : <input type="text" name="username"/> 
   Password: <input type="password" name="password"/>
   <input type="hidden" name="remember-me-param-based" value="on" /> 
   Remember me: <input type='checkbox' name='remember-me' checked="checked"/>
   <input type="hidden" name="_csrf" th:value="${_csrf.token}"/>
   <input type="submit" value="Sign In"/>
</form>

<a th:href="@{/auth/facebook}">Or via facebook</a>

因此,在facebook登录的情况下(通过/auth/facebook),它将使用AlwaysRememberMe策略,返回 ,但对于传统的

  • 如果rememberme-param-based=on,它将根据给定的参数(rememberme)以传统的 continue进行检查
  • 如果缺少基于参数的rememberMe,则其工作方式为AlwaysRememberMe

IMHO我的实现至少为“传统登录”用户提供了选择。

漆雕奇
2023-03-14

我也有类似的要求。

我试图将身份验证的网址设置为/auth/facebook?_spring_security_remember_me=true(请参阅AbstractRememberMeServices.rememberMeRequest)。但是,org.springframework.social.security.SocialAuthenticationFilter.detectRejection不会不让这件事过去。它的编码是这样的:

protected boolean detectRejection(HttpServletRequest request) {
    Set<?> parameterKeys = request.getParameterMap().keySet();
    return parameterKeys.size() > 0 
            && !parameterKeys.contains("oauth_token") 
            && !parameterKeys.contains("code") 
            && !parameterKeys.contains("scope");
}

我想,如果我们能在那里再加一条,它可能会起作用。然后我想通过子类化<code>SocialAuthenticationFilter</code>来覆盖它。但是,在<code>SpringSocialConfigurer</code>中,它没有被注入,而是使用<code>new</code>关键字来声明。子类<code>SpringSocialConfigurer</code>似乎也不是一个解决方案,因为里面有很多有用的私有字段。因此,我认为一个解决方案是将SpringSocialConfigurer复制到另一个类中,并将其与子类SocialAuthenticationFilter

当然,如果我们希望记住我始终处于打开状态,则可以通过设置RememberMeServices始终记住字段来轻松,我这样做是这样的:

@Bean
public RememberMeServices rememberMeServices() {

    TokenBasedRememberMeServices rememberMeServices = new TokenBasedRememberMeServices(rememberMeKey, userService);
    rememberMeServices.setAlwaysRemember(true);
    return rememberMeServices;

}

 类似资料:
  • 我正在和Spring Boot一起开发一个集成了LDAP的应用程序。我能够成功地连接到LDAP服务器并验证用户。现在,我需要添加“记住我”功能。我试图通过不同的职位(这),但无法找到我的问题的答案。官方的Spring安全文件指出 如果您正在使用不使用UserDetailsService的身份验证提供程序(例如,LDAP提供程序),那么它将不起作用,除非您的应用程序上下文中也有UserDetails

  • 8.2 节实现的登录系统自成一体且功能完整,不过大多数网站还会提供一种功能——用户关闭浏览器后仍能记住用户的会话。本节,我们首先实现自动记住用户会话的功能,只有用户明确退出后会话才会失效。8.4.5 节实现另一种常用方式:提供一个“记住我”复选框,让用户选择是否记住会话。这两种方式都很专业,GitHub 和 Bitbucket 等网站使用第一种,Facebook 和 Twitter 等网站使用第二

  • 本文向大家介绍ThinkPHP3.2.2实现持久登录(记住我)功能的方法,包括了ThinkPHP3.2.2实现持久登录(记住我)功能的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ThinkPHP3.2.2实现持久登录功能的方法。分享给大家供大家参考,具体如下: 实现持久登录,即用户在登录时,勾选了"记住我"之后,无论是否关闭浏览器,只要不退出登录,在指定的时间内始终保持登录状态(缺

  • 问题内容: 我有一个登录页面,我想添加“记住我”功能;因此,如果用户注销并再次打开页面,则会加载其用户名和密码。为此,当用户登录(并选中“记住我”)时,我保存了以下cookie: 问题是稍后(在同一会话中)我阅读了cookie,然后看到maxAge = -1; 即使我将其设置为3600 …为什么呢?另一个问题:如果我使用userCookie.setSecure(true)将cookie设置为安全,

  • 在实现应用程序登录时,我想使用Spring Security设置谁登录,但如何设置记住?我的用户名是这样的。 用户详细信息us详情userDetails.loadUserByUsername(u.getAccount()); Authentication认证=new UsernamePasswordAuthenticationToken( us详情,usDetails.getPassword(),

  • 问题内容: 我正在尝试实现“记住我” /“自动登录”功能。我已经在客户端存储了一个cookie,但是什么时候应该阅读它?例如,如果尝试在过滤器中执行此操作,则将无法访问用于访问数据库的应用程序范围的bean。 最佳做法是什么? 问题答案: 这在某种程度上取决于您当前的登录名是如何工作的。是容器登录后跟自定义内容(例如在会话中放置一些对象)还是仅自定义? 在第一种情况下,您无法在JSF中完全自动登录