gpt4 book ai didi

spring - 在 Spring 3.1 中使用记住我的功能登录用户

转载 作者:IT老高 更新时间:2023-10-28 13:52:09 26 4
gpt4 key购买 nike

我目前以编程方式登录用户(例如当他们通过 Facebook 或其他方式登录时,而不是使用我的登录表单):

SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(user, "", authorities)
);

我想要做的是让用户登录,就好像他们在登录表单中设置了“记住我”选项一样。所以我猜我需要使用 RememberMeAuthenticationToken 而不是 UsernamePasswordAuthenticationToken?但是我应该为构造函数的 key 参数添加什么?

RememberMeAuthenticationToken(String key, Object principal, Collection<? extends GrantedAuthority> authorities) 

更新:我正在使用 Persistent Token Approach described here .所以没有像 Simple Hash-Based Token Approach 那样的键。

最佳答案

我假设您已经拥有 <remember-me>在您的配置中设置。

remember-me 的工作方式是设置一个 cookie,当用户在 session 过期后返回网站时可以识别该 cookie。

你必须继承 RememberMeServices ( TokenBasedPersistentTokenBased )您正在使用并将 onLoginSuccess() 公开。例如:

public class MyTokenBasedRememberMeServices extends PersistentTokenBasedRememberMeServices {
@Override
public void onLoginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication) {
super.onLoginSuccess(request, response, successfulAuthentication);
}
}

<remember-me services-ref="rememberMeServices"/>

<bean id="rememberMeServices" class="foo.MyTokenBasedRememberMeServices">
<property name="userDetailsService" ref="myUserDetailsService"/>
<!-- etc -->
</bean>

将您的 RememberMeServices 注入(inject)到您正在执行编程登录的 bean 中。然后调用onLoginSuccess()使用您创建的 UsernamePasswordAuthenticationToken 在其上。这将设置 cookie。

UsernamePasswordAuthenticationToken auth = 
new UsernamePasswordAuthenticationToken(user, "", authorities);
SecurityContextHolder.getContext().setAuthentication(auth);
getRememberMeServices().onLoginSuccess(request, response, auth);

更新

@at 对此进行了改进,没有 RememberMeServices: 的子类化

UsernamePasswordAuthenticationToken auth = 
new UsernamePasswordAuthenticationToken(user, "", authorities);
SecurityContextHolder.getContext().setAuthentication(auth);

// This wrapper is important, it causes the RememberMeService to see
// "true" for the "_spring_security_remember_me" parameter.
HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(request) {
@Override public String getParameter(String name) { return "true"; }
};

getRememberMeServices().loginSuccess(wrapper, response, auth);

关于spring - 在 Spring 3.1 中使用记住我的功能登录用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7806921/

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