Spring Security安全框架之记住我功能

yizhihongxing

标题:Spring Security安全框架之记住我功能详解

什么是记住我功能

记住我功能是指,在用户登录成功后,用户的身份认证信息会保持在客户端的cookie中,以便用户下次访问同一站点时不需要再次登录。

Spring Security中如何实现记住我功能

要在Spring Security中实现记住我功能,需要进行以下几个步骤:

1.在spring security的配置文件中配置rememberMe()方法

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/admin/**").hasAnyRole("ADMIN")
                .anyRequest().authenticated()
            .and()
                .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/home")
                .permitAll()
            .and()
                .logout()
                .permitAll()
            .and()
                .rememberMe()
                .key("uniqueAndSecret")
                .rememberMeParameter("remember-me")
                .rememberMeCookieName("my-remember-me")
                .tokenValiditySeconds(24 * 60 * 60)
                .dataSource(dataSource);
    }
}
  1. 在登录页面中增加remember-me元素
<form action="/login" method="post">
  <label for="username">Username:</label>
  <input type="text" id="username" name="username" required />
  <br />
  <label for="password">Password:</label>
  <input type="password" id="password" name="password" required />
  <br />
  <input type="checkbox" id="remember-me" name="remember-me"
  value="true" />
  <label for="remember-me">Remember me on this computer</label>
  <br />
  <input type="submit" value="Login" />
</form>

增加remember-me元素后,用户勾选remember me选项时,会在cookie中记录用户的身份信息。

记住我功能示例

示例一:使用内存存储用户信息

配置内存用户信息

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
        auth
            .inMemoryAuthentication()
                .withUser("user").password(encoder.encode("password")).roles("USER").and()
                .withUser("admin").password(encoder.encode("password")).roles("ADMIN");
    }
}

配置记住我

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/admin/**").hasAnyRole("ADMIN")
                .anyRequest().authenticated()
            .and()
                .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/home")
                .permitAll()
            .and()
                .logout()
                .permitAll()
            .and()
                .rememberMe()
                .key("uniqueAndSecret")
                .rememberMeParameter("remember-me")
                .rememberMeCookieName("my-remember-me")
                .tokenValiditySeconds(24 * 60 * 60)
                .dataSource(dataSource);
    }
}

测试

运行程序,在浏览器输入http://localhost:8080/admin,应该会跳转到登录页面。输入正确的用户名和密码,并勾选remember-me选项,登录成功后,点击退出登录,再次访问http://localhost:8080/admin,会发现不需要再次登录即可访问该页面。

示例二:使用JDBC存储用户信息

创建用户表和remember-me持久化表

CREATE TABLE users
(
    username VARCHAR(50) NOT NULL PRIMARY KEY,
    password VARCHAR(100) NOT NULL,
    enabled TINYINT(1) NOT NULL,
    authority VARCHAR(50) NOT NULL);

CREATE TABLE persistent_logins
(
    username VARCHAR(64) NOT NULL,
    series VARCHAR(64) NOT NULL PRIMARY KEY,
    token VARCHAR(64) NOT NULL,
    last_used TIMESTAMP NOT NULL
);

配置JDBC用户信息

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
        auth.jdbcAuthentication()
                .dataSource(dataSource)
                .usersByUsernameQuery("select username,password,enabled "
                        + "from users "
                        + "where username = ?")
                .authoritiesByUsernameQuery("select username,authority "
                        + "from authorities "
                        + "where username = ?")
                .passwordEncoder(encoder);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/admin/**").hasAnyRole("ADMIN")
                .anyRequest().authenticated()
            .and()
                .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/home")
                .permitAll()
            .and()
                .logout()
                .permitAll()
            .and()
                .rememberMe()
                .key("uniqueAndSecret")
                .rememberMeParameter("remember-me")
                .rememberMeCookieName("my-remember-me")
                .tokenValiditySeconds(24 * 60 * 60)
                .dataSource(dataSource);
    }
}

测试

同样在运行程序,访问http://localhost:8080/admin,输入正确的用户名和密码,并勾选remember-me选项,登录成功后,点击退出登录,再次访问http://localhost:8080/admin,会发现不需要再次登录即可访问该页面。

小结

Spring Security提供了方便的记住我功能,让用户在下一次访问同一站点时不需要再次登录。可以通过内存存储用户信息和JDBC存储用户信息两种方式配置记住我功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security安全框架之记住我功能 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • java自带命令行工具jmap、jhat与jinfo的使用实例代码详解

    Java自带命令行工具攻略 Java自带了多个命令行工具,可以对Java程序进行分析、调试和监控。其中,jmap、jhat和jinfo是非常重要的工具。本攻略将详细讲解它们的使用,包括实例代码和示例结果。 jmap jmap是Java Memory Map的缩写,是一个用于打印Java进程中内存使用情况的命令行工具。下面是jmap的常用选项: Usage: …

    Java 2023年5月19日
    00
  • 员工管理系统java版

    这里为您详细讲解“员工管理系统java版”的完整攻略。 系统概述 这是一个基于Java语言开发的员工管理系统,主要功能包括员工信息录入、查询、修改和删除,部门信息录入、查询和修改,以及用户权限管理等。 系统环境 本系统运行需要JDK1.8及以上版本,建议使用IntelliJ IDEA等集成开发环境进行开发和调试。 数据库设计 本系统使用MySQL数据库进行数…

    Java 2023年5月23日
    00
  • 用headjs来管理和加载js 提高网站加载速度

    使用headjs来管理和加载JS可以提高网站的加载速度,这是因为headjs通过异步加载JS文件来提高页面渲染的速度。下面是使用headjs来管理和加载JS的完整攻略: 1. 下载并引入headjs 首先,需要下载head.js库,并在网页中引入该文件,可以使用CDN来引入该文件,如下所示: <script src="https://cdn.…

    Java 2023年6月15日
    00
  • Java如何自定义类数组的创建和初始化

    要创建和初始化自定义类数组,可按以下步骤进行: 1. 自定义类 首先,需要创建自定义类,这里以学生类为示例,定义一个包含学生姓名和学号的类。 public class Student { private String name; private int id; public Student(String name, int id){ this.name = …

    Java 2023年5月26日
    00
  • 关于C#继承的简单应用代码分析

    下面就是“关于C#继承的简单应用代码分析”的攻略: 什么是继承? 在面向对象的编程中,继承是一个重要的概念。继承是指一个类可以从另一个类中继承其成员,包括字段和方法。从父类继承的成员可以被子类直接使用,也可以被子类重写。 如何使用继承? 在C#中,使用冒号(:)来指示一个类继承自另一个类。例如: class Animal { public void Eat(…

    Java 2023年5月19日
    00
  • 详细聊一聊JavaWeb中的Request和Response

    接下来我将详细讲解一下JavaWeb中的Request和Response。 什么是Request和Response? 在JavaWeb中,客户端通过HTTP协议向服务器发送请求,服务器对请求进行处理后再返回相应的响应信息。JavaWeb中的Request和Response就是对HTTP请求和响应的封装。 Request(请求)对象是由客户端发送到服务器的,并…

    Java 2023年5月20日
    00
  • java MyBatis拦截器Inteceptor详细介绍

    Java MyBatis拦截器Inteceptor详细介绍 什么是MyBatis拦截器Inteceptor MyBatis拦截器Inteceptor是MyBatis中的一个重要组件,使用拦截器可以实现对MyBatis的许多事务进行拦截和控制,比如SQL执行、查询结果处理等等。MyBatis拦截器Inteceptor主要由两部分组成:拦截器接口和拦截对象。 如…

    Java 2023年5月20日
    00
  • 详解SpringSecurity如何实现前后端分离

    下面是详解SpringSecurity如何实现前后端分离的完整攻略: 前后端分离的基本概念 前后端分离是指将前端和后端的代码分别部署在不同的服务器上,通过API接口进行数据交互和业务处理。前端只负责显示数据和响应用户操作,后端则负责数据处理和业务逻辑。 前后端分离的优点 前后端分离可以大大提高系统的并发处理能力,提升用户的使用体验。同时,前后端分离也能够简化…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部