Spring Security-用户注销及记住我

这篇具有很好参考价值的文章主要介绍了Spring Security-用户注销及记住我。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

用户注销

在配置类增加退出映射地址

 @Override
 protected void configure(HttpSecurity http) throws Exception {
     //退出/注销
     http.logout().logoutUrl("/logout").logoutSuccessUrl("/test/hello").permitAll();
 }

完整代码:

 package com.config;
 ​
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
 ​
 @Configuration    //配置类
 public class SecurityConfig extends WebSecurityConfigurerAdapter {
 ​
     @Autowired
     UserDetailsService userDetailsService;
 ​
 ​
     @Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
     }
     @Bean
     PasswordEncoder passwordEncoder(){
         return new BCryptPasswordEncoder();
     }
 ​
     @Override
     protected void configure(HttpSecurity http) throws Exception {
         //退出/注销
         http.logout().logoutUrl("/logout").logoutSuccessUrl("/test/hello").permitAll();
 ​
         //配置没有权限访问跳转的页面
         http.exceptionHandling().accessDeniedPage("/403.html");
 ​
         http.formLogin().loginPage("/login.html")   // 自定义登录页面
                         .loginProcessingUrl("/user/login")     //登录访问路径
                         .defaultSuccessUrl("/test/index").permitAll()      //登录成功后 跳转路径
                         .and().authorizeRequests()
                 //       /user/login","/test/add" 面允许任意访问
                         .antMatchers("/","/user/login","/test/add").permitAll() //设置哪些路径可以不认证 直接访问
                          //当前登录用户 只有具备admins权限才可以访问这个路径
                         //.antMatchers("/test/index").hasAnyAuthority("admins","abc")
                         //.antMatchers("/test/index").hasRole("sale")
                         .antMatchers("/test/index").hasAnyRole("sale","p22")
                         .anyRequest().permitAll()
                         .and().csrf().disable() ; // 关闭csrf的防护
     }
 }

在static下 增加 success.html

 <h1> 登录成功</h1>
 <a href="/logout">退出</a>

修改配置类,登录成功后 跳转到 成功页面success.html

 package com.config;
 ​
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
 ​
 @Configuration    //配置类
 public class SecurityConfig extends WebSecurityConfigurerAdapter {
 ​
     @Autowired
     UserDetailsService userDetailsService;
 ​
 ​
     @Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
     }
     @Bean
     PasswordEncoder passwordEncoder(){
         return new BCryptPasswordEncoder();
     }
 ​
     @Override
     protected void configure(HttpSecurity http) throws Exception {
         //退出/注销
         http.logout().logoutUrl("/logout").logoutSuccessUrl("/test/add").permitAll();
 ​
         //配置没有权限访问跳转的页面
         http.exceptionHandling().accessDeniedPage("/403.html");
 ​
         http.formLogin().loginPage("/login.html")   // 自定义登录页面
                         .loginProcessingUrl("/user/login")     //登录访问路径
                         .defaultSuccessUrl("/success.html").permitAll()      //登录成功后 跳转路径
                         .and().authorizeRequests()
                 //       /user/login","/test/add" 面允许任意访问
                         .antMatchers("/","/user/login","/test/add").permitAll() //设置哪些路径可以不认证 直接访问
                          //当前登录用户 只有具备admins权限才可以访问这个路径
                         //.antMatchers("/test/index").hasAnyAuthority("admins","abc")
                         //.antMatchers("/test/index").hasRole("sale")
                         .antMatchers("/test/index").hasAnyRole("sale","p22")
                         .anyRequest().permitAll()
                         .and().csrf().disable() ; // 关闭csrf的防护
     }
 }

在成功页面添加 超链接, 写设置退出路径 

<a href="/logout">退出</a>

登录成功后,在成功页面点击退出 , 再去访问其他contoller不能进行访问

启动测试: 在地址栏输入 http://localhost:8080/login.html 输入正确用户名/密码 ,可以看到 success.html页面内容, 然后再打开一个浏览器窗口 , 在地址栏访问 localhost:8080/test/index

页面显示 hello index

然后 点击 成功页面的 退出 , 实际访问 /test/add

Spring Security-用户注销及记住我,Spring Security,spring,java,后端

在刷新刚刚 另一个页面 localhost:8080/test/index , 发现 需要登录 ,

Spring Security-用户注销及记住我,Spring Security,spring,java,后端

记住我 (7天内免登录) 自动登录

Spring Security-用户注销及记住我,Spring Security,spring,java,后端

security 中实现

用户认证成功之后调用RemeberMeService根据用户名名生成Token由TokenRepository写入到数据库,同时也将Token写入到浏览器的Cookie中 重启服务之后,用户再次登入系统会由RememberMeAuthenticationFilter拦截,从Cookie中读取Token信息,与persistent_logins表匹配判断是否使用记住我功能。最中由UserDetailsService查询用户信息

具体实现

1.创建表:


 create table persistent_logins (
     `username` varchar(64) not null, 
     `series` varchar(64) not null, 
     `token` varchar(64) not null, 
     `last_used` timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
         primary key (`series`));
 ​
  1. 修改配置类,注入数据源, 配置操作数据库对象

    配置文件

     spring:
       datasource:
         driver-class-name: com.mysql.cj.jdbc.Driver
         url: jdbc:mysql://localhost:3306/ssm
         username: 自己的用户
         password: 自己的密码

    配置类

    Spring Security-用户注销及记住我,Spring Security,spring,java,后端
 
@Autowired
 private DataSource dataSource;   //注入数据源
 ​
 @Bean
 public PersistentTokenRepository persistentTokenRepository(){
     JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
     jdbcTokenRepository.setDataSource(dataSource);
     //启动时自动创建表  ,因为表已经创建  因此这里注释掉
     //jdbcTokenRepository.setCreateTableOnStartup(true);
     return jdbcTokenRepository;
 }

修改 配置类, 增加 remeberme配置

配置类完整代码

 package com.config;
 ​
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
 import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
 ​
 import javax.sql.DataSource;
 ​
 @Configuration    //配置类
 public class SecurityConfig extends WebSecurityConfigurerAdapter {
 ​
     @Autowired
     UserDetailsService userDetailsService;
 ​
     @Autowired
     private DataSource dataSource;   //注入数据源
 ​
     //配置数据库对象
     @Bean
     public PersistentTokenRepository persistentTokenRepository(){
         JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
         jdbcTokenRepository.setDataSource(dataSource);
         //启动时自动创建表  ,因为表已经创建  因此这里注释掉
         //jdbcTokenRepository.setCreateTableOnStartup(true);
         return jdbcTokenRepository;
     }
 ​
 ​
 ​
 ​
     @Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
     }
     @Bean
     PasswordEncoder passwordEncoder(){
         return new BCryptPasswordEncoder();
     }
 ​
     @Override
     protected void configure(HttpSecurity http) throws Exception {
         //退出/注销
         http.logout().logoutUrl("/logout").logoutSuccessUrl("/test/add").permitAll();
 ​
         //配置没有权限访问跳转的页面
         http.exceptionHandling().accessDeniedPage("/403.html");
 ​
         http.formLogin().loginPage("/login.html")   // 自定义登录页面
                         .loginProcessingUrl("/user/login")     //登录访问路径
                         .defaultSuccessUrl("/success.html").permitAll()      //登录成功后 跳转路径
                         .and().authorizeRequests()
                 //       /user/login","/test/add" 面允许任意访问
                         .antMatchers("/","/user/login","/test/add").permitAll() //设置哪些路径可以不认证 直接访问
                          //当前登录用户 只有具备admins权限才可以访问这个路径
                         //.antMatchers("/test/index").hasAnyAuthority("admins","abc")
                         //.antMatchers("/test/index").hasRole("sale")
                         .antMatchers("/test/index").hasAnyRole("sale","p22")
                         .anyRequest().permitAll()
                          //   记住我 设置
                          .and().rememberMe().tokenRepository(persistentTokenRepository())
                           // 设置有效时长 单位 秒
                           .tokenValiditySeconds(60)
                          .userDetailsService(userDetailsService)
             
                         .and().csrf().disable() ; // 关闭csrf的防护
     }
 }

3.在登录页面 增加复选框

登陆页面添加记住我复选款(name必须是remember-me)

修改 static 下的 login.html

 <form action="/user/login" method="post">
     <input type="text" name="username" placeholder="输入用户名"/><br/>
     <input type="password" name="password" placeholder="输入密码"/><br/>
     <input type="checkbox" name="remember-me"/> 自动登录<br/>
     <input type="submit" value="注册"/>
 </form>

启动 测试

进入登录页面: http:/localhost:8080/login.html ,输入正常的用户名及密码

等时间差不过 到点 后 ,关闭浏览器, 在访问登录成功页面 ,直接跳转到 登录页面文章来源地址https://www.toymoban.com/news/detail-797272.html

到了这里,关于Spring Security-用户注销及记住我的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 后端进阶之路——深入理解Spring Security配置(二)

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 「推荐专栏」 : ★ java一站式服务 ★ ★ 前端炫酷代码分享 ★ ★ uniapp-从构建到提升 ★ ★ 从0到英雄,vue成神之路 ★ ★ 解决算法,一个专栏就够了 ★ ★ 架构咱们从0说 ★ ★ 数据流通的精妙之道★ ★后端进

    2024年02月14日
    浏览(40)
  • 后端进阶之路——综述Spring Security认证,授权(一)

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 「推荐专栏」 : ★ java一站式服务 ★ ★ 前端炫酷代码分享 ★ ★ uniapp-从构建到提升 ★ ★ 从0到英雄,vue成神之路 ★ ★ 解决算法,一个专栏就够了 ★ ★ 架构咱们从0说 ★ ★ 数据流通的精妙之道★ ★后端进

    2024年02月14日
    浏览(32)
  • 伙伴匹配(后端)-- 查询,删除用户,用户注销接口开发

    写接口的流程 先做设计 代码实现 持续优化(复用代码,提取公共逻辑,/常量) 需要注意的地方 1.请求:查询用户用get请求(无请求体) 2.必须要鉴权:只有管理员可以查询和删除,更新用户 3.为啥是否是管理员要设置一个常量呢?1(ADMIN_ROLE) 0 (DEFAULT_ROLE),增强可读性(

    2024年04月28日
    浏览(25)
  • Spring Security登录用户数据获取(4)

    登录成功之后,在后续的业务逻辑中,开发者可能还需要获取登录成功的用户对象,如果不使用任何安全管理框架,那么可以将用户信息保存在HttpSession中,以后需要的时候直接从HttpSession中获取数据。在Spring Security中,用户登录信息本质上还是保存在 HttpSession中,但是为了方

    2024年02月03日
    浏览(36)
  • 后端进阶之路——Spring Security构建强大的身份验证和授权系统(四)

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 「推荐专栏」 : ★ java一站式服务 ★ ★ 前端炫酷代码分享 ★ ★ uniapp-从构建到提升 ★ ★ 从0到英雄,vue成神之路 ★ ★ 解决算法,一个专栏就够了 ★ ★ 架构咱们从0说 ★ ★ 数据流通的精妙之道★ ★后端进

    2024年02月14日
    浏览(41)
  • Spring Security实现用户身份验证及权限管理

    Spring Security是Spring生态的一个成员,提供了一套Web应用安全性的完整解决方案。 Spring Security 旨在以一种自包含的方式进行操作,因此你不需要在 Java 运行时环境中放置任何特殊的配置文件。这种设计使部署极为方便,因为可以将目标 工件 (无论是 JAR还是WAR)从一个系统复

    2024年02月05日
    浏览(30)
  • Spring Boot Security认证:Redis缓存用户信息

    🎉欢迎来到架构设计专栏~Spring Boot Security认证:Redis缓存用户信息 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:架构设计 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有限,如

    2024年02月04日
    浏览(38)
  • 系列三、Spring Security中自定义用户名/密码

    1.1.1、配置文件中配置 1.1.2、定义基于内存的用户 1.1.3、基于UserDetailService接口定义用户 概述:         Spring Security支持多种数据源,例如内存、数据库、LDAP等,这些不同来源的数据被共同封装成了UserDetailService接口,换句话说任何实现了UserDetailService接口的对象都可以作为

    2024年01月19日
    浏览(26)
  • Spring Security in Action 第三章 SpringSecurity管理用户

    本专栏将从基础开始,循序渐进,以实战为线索,逐步深入SpringSecurity相关知识相关知识,打造完整的SpringSecurity学习步骤,提升工程化编码能力和思维能力,写出高质量代码。希望大家都能够从中有所收获,也请大家多多支持。 专栏地址:SpringSecurity专栏 本文涉及的代码都已

    2024年02月07日
    浏览(32)
  • 新版Spring Security6.2案例 - Authentication用户名密码

    前面有翻译了新版Spring Security6.2架构,包括总体架构,Authentication和Authorization,感兴趣可以直接点链接,这篇翻译官网给出的关于Authentication的Username/Password这页。 首先呢,官网就直接给出了基于用户名和密码的认证的代码,可以说是spring security的一个入门小案例,表单登录

    2024年02月20日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包