Spring Security「记住我」用 JSON 登录不生效?我踩到的坑与解决

2 阅读1分钟

JSON 登录时 Spring Security 记住我不写库(persistent_logins 无记录)解决办法

开发环境:spring-boot-starter-parent 4.0.3, 包含 Security-core 7.0.3

前端用 JSON 调登录接口,后端上了 Spring Security 的持久化记住我(PersistentTokenBasedRememberMeServices + persistent_logins 表),表建了、登录也调了 rememberMeServices.loginSuccess,但库里就是没数据,接口 200 也不报错。


Spring Security 判断「要不要记住我」看的是 request.getParameter("remember-me"),不会去解析 JSON body。 表单登录时一般是 application/x-www-form-urlencoded,会有 remember-me=on;你发的是 application/jsongetParameter("remember-me") 一直是 null,框架就认为没勾选,所以哪怕你手动调了 loginSuccess,它内部还是会打 Remember-me login not requested,不写库也不设 cookie。

开启了 org.springframework.security.web.authentication.rememberme 的 DEBUG日志,登录一次看到这两行才确定的:

  • Did not send remember-me cookie (principal did not set parameter 'remember-me')
  • Remember-me login not requested.

所以首先要让「记住我」这个信息出现在请求参数里。我选的是前端改:勾选记住我时,登录请求的 URL 带上 query,例如 POST /auth/login?remember-me=on,body 照常 JSON。后端不用动,继续用 @RequestBodyrememberMe 决定要不要调 loginSuccess,一旦调了,框架从 request 里能拿到 remember-me=on,就会正常往 persistent_logins 写记录、下发表单。