一.记住我概述
Remember me(记住我)记住我,当用户发起登录勾选了记住我,在一定的时间内再次登录就不用输入用户名和密码了,即使浏览器退出重新打开也是如此。
二.流程分析
在SpringSecurity中提供RememberMeAuthenticationFilter过滤器来实现记住我功能,其核心流程如下:
1.认证成功UsernamePasswordAuthenticationFilter会调用RememberMeServices创建Token
(见其父类AbstractAuthenticationProcessingFilter.successfulAuthentication),同时 RemeberMeService 会调用TokenRepository将Token写入数据库(persistent_logins),然后 RemeberMeService通 过Reponse.addCookie把Token写到浏览器的Cookies中
2.当浏览器再次发起请求会进入RemeberMeAuthenticationFilter,该Filter获取到请求中的token交给RemeberMeService
3.RemeberMeService调用TokenRepository去数据库中根据Token查询用户名
4.调用UserDetilasService.loadUserByUsername根据用户名获取用户认证信息
5.通过authenticationManager.authenticate,做一次认证,然后把用户信息放入上下文对象中
三,实现
1,开启记住我功能(http.rememberMe();)
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll() // 允许访问公开路径.antMatchers("/public/index").access("hasRole('vip')") // 需要指定用户在可以使用.antMatchers("/admin/**").access("hasRole('admin')") // 需要指定用户在可以使用.anyRequest().authenticated() // 其他请求需要认证.and().formLogin() // 使用表单登录.loginPage("/login") // 指定登录页面.permitAll() // 允许所有用户访问登录页面.and().logout() // 配置注销.logoutUrl("/logout") // 注销路径.logoutSuccessUrl("/login?logout") // 注销成功后跳转的页面.and().csrf().disable();//关闭csrf功能//记住我http.rememberMe();}
2,测试,关闭浏览器再次打开用户依旧存在
本质上是保存到cookie,通过浏览器审查元素的application中可以看到
3,如果使用自己的页面中的按钮,可以给按钮设置name,再在配置后面加上如下方法
http.rememberMe().rememberMeParameter("remember");
四,定制登录页
在配置中设置,用.loginProcessingUrl("/login")并将前端form表单的action设置为括号内相同即可,但如果前端用户名和密码前后端不一样,则需要进行设置,括号内的属性为前端页面的name属性
http.formLogin().loginPage("/toLogin").usernameParameter("username").passwordParameter("password").loginProcessingUrl("/login");