Java 如何更改PersistentTokenBasedMemberMeservices logout()方法
我正在使用类PersistentTokenBasedMemberMeservices来处理RememberMe令牌。有一个logout()方法,当意外地注销时调用它,它如下所示:Java 如何更改PersistentTokenBasedMemberMeservices logout()方法,java,spring,spring-boot,spring-security,remember-me,Java,Spring,Spring Boot,Spring Security,Remember Me,我正在使用类PersistentTokenBasedMemberMeservices来处理RememberMe令牌。有一个logout()方法,当意外地注销时调用它,它如下所示: public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { super.logout(request, response
public void logout(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) {
super.logout(request, response, authentication);
if (authentication != null) {
tokenRepository.removeUserTokens(authentication.getName());
}
}
我所要做的就是重写或以某种方式仅更改这个1方法,因为我不想删除所有令牌,而是想根据经过身份验证的用户和设备删除令牌,这样用户从其他设备获得的记住我的令牌就会被存储。但这可能是我想出来的
所以我尝试扩展类并重写该方法,但它甚至没有被调用
@Service
public class CustomRememberMeService extends PersistentTokenBasedRememberMeServices {
public CustomRememberMeService(String key, MyUserDetailsService userDetailsService, PersistentTokenRepository tokenRepository) {
super(key, userDetailsService, tokenRepository);
}
@Override
public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
super.logout(request, response, authentication);
}
}
我在配置文件中创建了这种类型的bean
@Bean
public AbstractRememberMeServices rememberMeServices() {
CustomRememberMeService rememberMeServices =
new CustomRememberMeService(rememberMeKey, myUserDetailsService, persistentTokenRepository());
rememberMeServices.setAlwaysRemember(true);
return rememberMeServices;
}
但是仍然没有调用我的重写方法
我的另一个想法是使用AOP来更改logout()方法的参数,并将身份验证更改为null,这样令牌就不会被删除,我可以自己按我想要的方式删除它,但该方面从未被调用,我尝试了其他方面,它的调用非常好,所以没有问题。我的方面课
@Component
@Aspect
public class AspectForDisablingRememberMeLogout {
@Around("rememberMeLogout()")
public void RememberMeLogoutAdvice(ProceedingJoinPoint joinPoint) {
Object[] newArgs = joinPoint.getArgs();
try {
IntStream.range(0, newArgs.length)
.filter(i -> newArgs[i] instanceof Authentication)
.forEach(i -> newArgs[i] = null);
joinPoint.proceed(newArgs);
} catch(Throwable t) {
t.printStackTrace();
}
}
@Pointcut("execution(* org.springframework.security.web.authentication.rememberme.*.logout(..))")
public void rememberMeLogout() {}
}
如果你有一些纠正我,使其工作,或任何其他想法,我将不胜感激。
谢谢你的帮助