【转载】spring-security-oauth2(五) 记住我

添加记住我功能

  1. 记住我功能基本原理
  2. 实现记住我功能
  3. 记住我SpringSecurity源码分析

1.记住我功能基本原理

过滤器链

 

 2.实现记住我功能 

给登录界面添加记住我选项


 
 
  1. <html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>登录 </title>
  5. </head>
  6. <body>
  7. <h2>标准登录页面 </h2>
  8. <h3>表单登录 </h3>
  9. <form action="/authentication/form" method="post">
  10. <table>
  11. <tr>
  12. <td>用户名: </td>
  13. <td> <input type="text" name="username"> </td>
  14. </tr>
  15. <tr>
  16. <td>密码: </td>
  17. <td> <input type="password" name="password"> </td>
  18. </tr>
  19. <tr>
  20. <td>图形验证码: </td>
  21. <td>
  22. <input type="text" name="imageCode">
  23. <img src="/captcha/image">
  24. </td>
  25. </tr>
  26. <tr>
  27. <td colspan="2"> <input type="checkbox" name="remember-me" value="true"/>记住我 </td>
  28. </tr>
  29. <tr>
  30. <td colspan="2">
  31. <button type="submit">登录 </button>
  32. </td>
  33. </tr>
  34. </table>
  35. </form>
  36. </body>
  37. </html>

注意记住我的name要固定  源码如下:

public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>>
      extends AbstractHttpConfigurer<RememberMeConfigurer<H>, H> {
   /**
    * The default name for remember me parameter name and remember me cookie name
    */
   private static final String DEFAULT_REMEMBER_ME_NAME = "remember-me";
}

浏览器配置中添加可配置的失效时间


 
 
  1. package com.rui.tiger.auth.core.properties;
  2. import com.rui.tiger.auth.core.model.enums.LoginTypeEnum;
  3. /**
  4. * 浏览器配置
  5. *
  6. * @author CaiRui
  7. * @date 2018-12-6 8:42
  8. */
  9. public class BrowserProperties {
  10. /**
  11. * 登录页面 不配置默认标准登录界面
  12. */
  13. private String loginPage = "/tiger-login.html";
  14. /**
  15. * 跳转类型 默认返回json数据
  16. */
  17. private LoginTypeEnum loginType = LoginTypeEnum.JSON;
  18. /**
  19. * 记住我秒数
  20. * @return
  21. */
  22. private int remberMeSeconds= 3600;
  23. public String getLoginPage() {
  24. return loginPage;
  25. }
  26. public void setLoginPage(String loginPage) {
  27. this.loginPage = loginPage;
  28. }
  29. public LoginTypeEnum getLoginType() {
  30. return loginType;
  31. }
  32. public void setLoginType(LoginTypeEnum loginType) {
  33. this.loginType = loginType;
  34. }
  35. public int getRemberMeSeconds() {
  36. return remberMeSeconds;
  37. }
  38. public void setRemberMeSeconds(int remberMeSeconds) {
  39. this.remberMeSeconds = remberMeSeconds;
  40. }
  41. }

依据记住我原理对配置类进行修改


 
 
  1. package com.rui.tiger.auth.browser.config;
  2. import com.rui.tiger.auth.core.authentication.TigerAuthenticationFailureHandler;
  3. import com.rui.tiger.auth.core.authentication.TigerAuthenticationSuccessHandler;
  4. import com.rui.tiger.auth.core.captcha.CaptchaFilter;
  5. import com.rui.tiger.auth.core.properties.SecurityProperties;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  10. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  11. import org.springframework.security.core.userdetails.UserDetailsService;
  12. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  13. import org.springframework.security.crypto.password.PasswordEncoder;
  14. import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
  15. import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
  16. import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
  17. import javax.sql.DataSource;
  18. /**
  19. * 浏览器security配置类
  20. *
  21. * @author CaiRui
  22. * @date 2018-12-4 8:41
  23. */
  24. @Configuration
  25. public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
  26. @Autowired
  27. private SecurityProperties securityProperties;
  28. @Autowired
  29. private TigerAuthenticationFailureHandler tigerAuthenticationFailureHandler;
  30. @Autowired
  31. private TigerAuthenticationSuccessHandler tigerAuthenticationSuccessHandler;
  32. @Autowired
  33. private DataSource dataSource;
  34. @Autowired
  35. private UserDetailsService userDetailsService;
  36. /**
  37. * 密码加密解密
  38. *
  39. * @return
  40. */
  41. @Bean
  42. public PasswordEncoder passwordEncoder() {
  43. return new BCryptPasswordEncoder();
  44. }
  45. /**
  46. * 记住我持久化数据源
  47. * JdbcTokenRepositoryImpl CREATE_TABLE_SQL 建表语句可以先在数据库中执行
  48. *
  49. * @return
  50. */
  51. @Bean
  52. public PersistentTokenRepository persistentTokenRepository() {
  53. JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
  54. jdbcTokenRepository.setDataSource(dataSource);
  55. //第一次会执行CREATE_TABLE_SQL建表语句 后续会报错 可以关掉
  56. //jdbcTokenRepository.setCreateTableOnStartup(true);
  57. return jdbcTokenRepository;
  58. }
  59. @Override
  60. protected void configure(HttpSecurity http) throws Exception {
  61. //加入图片验证码过滤器
  62. CaptchaFilter captchaFilter = new CaptchaFilter();
  63. captchaFilter.setFailureHandler(tigerAuthenticationFailureHandler);
  64. captchaFilter.setSecurityProperties(securityProperties);
  65. captchaFilter.afterPropertiesSet();
  66. //图片验证码放在认证之前
  67. http.addFilterBefore(captchaFilter, UsernamePasswordAuthenticationFilter.class)
  68. .formLogin()
  69. .loginPage( "/authentication/require") //自定义登录请求
  70. .loginProcessingUrl( "/authentication/form") //自定义登录表单请求
  71. .successHandler(tigerAuthenticationSuccessHandler)
  72. .failureHandler(tigerAuthenticationFailureHandler)
  73. .and()
  74. //记住我相关配置
  75. .rememberMe()
  76. .tokenRepository(persistentTokenRepository())
  77. .tokenValiditySeconds(securityProperties.getBrowser().getRemberMeSeconds())
  78. .userDetailsService(userDetailsService)
  79. .and()
  80. .authorizeRequests()
  81. .antMatchers(securityProperties.getBrowser().getLoginPage(),
  82. "/authentication/require", "/captcha/image") //此路径放行 否则会陷入死循环
  83. .permitAll()
  84. .anyRequest()
  85. .authenticated()
  86. .and()
  87. .csrf().disable() //跨域关闭
  88. ;
  89. }
  90. }

下面我们来测试下,项目启动后可以看到用户token关系表已经建好了

 我们再前面登录,勾选记住我功能

 

成功登录后,可以看见后台已经保存关系了 

再访问我们的用户信息可以成功访问,接下来我们退出浏览器或重新启动项目,再次访问用户信息 还是可以成功访问 说明我们的记住我功能成功实现

3.记住我SpringSecurity源码分析

 

文章转载至:https://blog.csdn.net/ahcr1026212/article/details/84981801

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值