Spring Security 构建rest服务实现rememberme 记住我功能

Spring security记住我基本原理:

登录的时候,请求发送给过滤器UsernamePasswordAuthenticationFilter,当该过滤器认证成功后,会调用RememberMeService,会生成一个token,将token写入到浏览器cookie,同时RememberMeService里边还有个TokenRepository,将token和用户信息写入到数据库中。这样当用户再次访问系统,访问某一个接口时,会经过一个RememberMeAuthenticationFilter的过滤器,他会读取cookie中的token,交给RememberService,RememberService会用TokenRepository根据token从数据库中查是否有记录,如果有记录会把用户名取出来,再调用UserDetailService根据用户名获取用户信息,然后放在SecurityContext里。

 RememberMeAuthenticationFilter在Spring Security中认证过滤器链的倒数第二个过滤器位置,当其他认证过滤器都没法认证成功的时候,就会调用RememberMeAuthenticationFilter尝试认证。

实现:

1,登录表单加上<input type="checkbox" name="remember-me" value="true"/>,SpringSecurity在SpringSessionRememberMeServices类里定义了一个常量,默认值就是remember-me

2,根据上边的原理图可知,要配置TokenRepository,把生成的token存进数据库,这是一个配置bean的配置,放在了BrowserSecurityConfig里

3,在configure里配置

4,在BrowserProperties里加上自动登录时间,把记住我时间做成可配置的

//记住我秒数配置
private int rememberMeSeconds = 10;齐活
package com.imooc.s@Configuration //这是一个配置
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter{
  //读取用户配置的登录页配置
  @Autowired
  private SecurityProperties securityProperties;
  //自定义的登录成功后的处理器
  @Autowired
  private AuthenticationSuccessHandler imoocAuthenticationSuccessHandler;
  //自定义的认证失败后的处理器
  @Autowired
  private AuthenticationFailureHandler imoocAuthenticationFailureHandler;
  //数据源
  @Autowired
  private DataSource dataSource;
  @Autowired
  private UserDetailsService userDetailsService;
  //注意是org.springframework.security.crypto.password.PasswordEncoder
  @Bean
  public PasswordEncoder passwordencoder(){
    //BCryptPasswordEncoder implements PasswordEncoder
    return new BCryptPasswordEncoder();
  }
  /**
   * 记住我TokenRepository配置,在登录成功后执行
   * 登录成功后往数据库存token的
   * @Description: 记住我TokenRepository配置
   * @param @return  JdbcTokenRepositoryImpl
   * @return PersistentTokenRepository
   * @throws
   * @author lihaoyang
   * @date 2018年3月5日
   */
  @Bean
  public PersistentTokenRepository persistentTokenRepository(){
    JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
    jdbcTokenRepository.setDataSource(dataSource);
    //启动时自动生成相应表,可以在JdbcTokenRepositoryImpl里自己执行CREATE_TABLE_SQL脚本生成表
    jdbcTokenRepository.setCreateTableOnStartup(true);
    return jdbcTokenRepository;
  }
  //版本二:可配置的登录页
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    //验证码过滤器
    ValidateCodeFilter validateCodeFilter = new ValidateCodeFilter();
    //验证码过滤器中使用自己的错误处理
    validateCodeFilter.setAuthenticationFailureHandler(imoocAuthenticationFailureHandler);
    //配置的验证码过滤url
    validateCodeFilter.setSecurityProperties(securityProperties);
    validateCodeFilter.afterPropertiesSet();
    //实现需要认证的接口跳转表单登录,安全=认证+授权
    //http.httpBasic() //这个就是默认的弹框认证
    //
    http //把验证码过滤器加载登录过滤器前边
      .addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)
      //表单认证相关配置
      .formLogin()
        .loginPage("/authentication/require") //处理用户认证BrowserSecurityController
        //登录过滤器UsernamePasswordAuthenticationFilter默认登录的url是"/login",在这能改
        .loginProcessingUrl("/authentication/form")
        .successHandler(imoocAuthenticationSuccessHandler)//自定义的认证后处理器
        .failureHandler(imoocAuthenticationFailureHandler) //登录失败后的处理
      .and()
      //记住我相关配置
      .rememberMe()
        .tokenRepository(persistentTokenRepository())//TokenRepository,登录成功后往数据库存token的
        .tokenValiditySeconds(securityProperties.getBrowser().getRememberMeSeconds())//记住我秒数
        .userDetailsService(userDetailsService) //记住我成功后,调用userDetailsService查询用户信息
      .and()
      //授权相关的配置
      .authorizeRequests()
        // /authentication/require:处理登录,securityProperties.getBrowser().getLoginPage():用户配置的登录页
        .antMatchers("/authentication/require",
        securityProperties.getBrowser().getLoginPage(),//放过登录页不过滤,否则报错
        "/verifycode/image").permitAll() //验证码
        .anyRequest()    //任何请求
        .authenticated()  //都需要身份认证
      .and()
        .csrf().disable() //关闭csrf防护
      ;
  }
}ecurity.browser;

其中由于要和数据库打交道,所以需要注入一个数据源:application.properties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/imooc-demo
spring.datasource.username=root
spring.datasource.password=root

启动应用,访问 localhost:8080/user,需要登录

登录成功:

数据库:生成一个persistent_logins表,存进去了一条数据

停止服务,从新启动(注释掉生成保存token表的jdbcTokenRepository.setCreateTableOnStartup(true);)因为我们的用户登录信息都存在了session中,所以重启服务后,再访问localhost:8080/user,本应该重新引导到登录页,但是由于配置了记住我,所以能够直接访问,拿到了接口数据

请求头:

至此基本的rememberMe已做好

完整代码放在了github:https://github.com/lhy1234/spring-security

总结

以上所述是小编给大家介绍的Spring Security 构建rest服务实现rememberme 记住我功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • 详解使用Spring Security进行自动登录验证
  • Spring Boot如何使用Spring Security进行安全控制
  • Spring Boot(四)之使用JWT和Spring Security保护REST API
  • Spring Boot中整合Spring Security并自定义验证代码实例
  • Java中SpringSecurity密码错误5次锁定用户的实现方法
  • Spring security实现登陆和权限角色控制
(0)

相关推荐

  • Spring Boot(四)之使用JWT和Spring Security保护REST API

    通常情况下,把API直接暴露出去是风险很大的,不说别的,直接被机器攻击就喝一壶的.那么一般来说,对API要划分出一定的权限级别,然后做一个用户的鉴权,依据鉴权结果给予用户开放对应的API.目前,比较主流的方案有几种: 用户名和密码鉴权,使用Session保存用户鉴权结果. 使用OAuth进行鉴权(其实OAuth也是一种基于Token的鉴权,只是没有规定Token的生成方式) 自行采用Token进行鉴权 第一种就不介绍了,由于依赖Session来维护状态,也不太适合移动时代,新的项目就不要采用了.

  • Java中SpringSecurity密码错误5次锁定用户的实现方法

    Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作. 下面看下实例代码: 第

  • 详解使用Spring Security进行自动登录验证

    在之前的博客使用SpringMVC创建Web工程并使用SpringSecurity进行权限控制的详细配置方法 中,我们描述了如何配置一个基于SpringMVC.SpringSecurity框架的网站系统.在这篇博客中,我们将继续描述如何使用Spring Security进行登录验证. 总结一下Spring Security的登录验证关键步骤: 1.在数据库中建好三张表,即users.authorities和persistent_logins三个.注意字段的定义,不能少,可以多,名字必须按规定来.

  • Spring security实现登陆和权限角色控制

     随笔简介 1.spring版本:4.3.2.RELEASE+spring security 版本:4.1.2.RELEASE(其它不做说明) 2.所展示内容全部用注解配置 3.springmvc已经配置好,不作说明 4.会涉及到springmvc,spel,el的东西,不熟悉的同学可以先去看一下这方面内容,特别是springmvc 首先想一下,登陆需要什么,最简单的情况下,用户名,密码,然后比对数据库,如果吻合就跳转到个人页面,否则回到登陆页面,并且提示用户名密码错误.这个过程中应该还带有权限

  • Spring Boot中整合Spring Security并自定义验证代码实例

    最终效果 1.实现页面访问权限限制 2.用户角色区分,并按照角色区分页面权限 3.实现在数据库中存储用户信息以及角色信息 4.自定义验证代码 效果如下: 1.免验证页面 2.登陆页面 在用户未登录时,访问任意有权限要求的页面都会自动跳转到登陆页面. 3.需登陆才能查看的页面 用户登陆后,可以正常访问页面资源,同时可以正确显示用户登录名: 4.用户有角色区分,可以指定部分页面只允许有相应用户角色的人使用 4.1.只有ADMIN觉得用户才能查看的页面(权限不足) 4.2.只有ADMIN觉得用户才能查

  • Spring Boot如何使用Spring Security进行安全控制

    我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache Shiro.spring Security). 本文将具体介绍在Spring Boot中如何使用Spring Security进行安全控制. 准备工作 首先,构建一个简单的Web工程,以用于后续添加安全控制,也可以用之前Chapter3-1-2做为基础工程.若对如何使用Spring Boot构建We

  • Spring Security 构建rest服务实现rememberme 记住我功能

    Spring security记住我基本原理: 登录的时候,请求发送给过滤器UsernamePasswordAuthenticationFilter,当该过滤器认证成功后,会调用RememberMeService,会生成一个token,将token写入到浏览器cookie,同时RememberMeService里边还有个TokenRepository,将token和用户信息写入到数据库中.这样当用户再次访问系统,访问某一个接口时,会经过一个RememberMeAuthenticationFilt

  • Spring Boot中使用 Spring Security 构建权限系统的示例代码

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作. 权限控制是非常常见的功能,在各种后台管理里权限控制更是重中之重.在Spring Boot中使用 Spring Security 构建权限系统是非常轻松和简单的.下面我们就来快速入门 Spring Security .在开始前我们需要一对

  • 详解spring cloud构建微服务架构的网关(API GateWay)

    前言 在我们前面的博客中讲到,当服务A需要调用服务B的时候,只需要从Eureka中获取B服务的注册实例,然后使用Feign来调用B的服务,使用Ribbon来实现负载均衡,但是,当我们同时向客户端暴漏多个服务的时候,客户端怎么调用我们暴漏的服务了,如果我们还想加入安全认证,权限控制,过滤器以及动态路由等特性了,那么就需要使用Zuul来实现API GateWay了,下面,我们先来看下Zuul怎么使用. 一.加入Zuul的依赖 <dependency> <groupId>org.spri

  • Spring Security 实现“记住我”功能及原理解析

    这章继续扩展功能,来一个"记住我"的功能实现,就是说用户在登录一次以后,系统会记住这个用户一段时间,这段时间内用户不需要重新登录就可以使用系统. 记住我功能基本原理 原理说明 用户登录发送认证请求的时候会被UsernamePasswordAuthenticationFilter认证拦截,认证成功以后会调用一个RememberMeService服务,服务里面有一个TokenRepository,这个服务会生成一个Token,然后将Token写入到浏览器的Cookie同时会使用TokenR

  • Spring Security基于散列加密方案实现自动登录功能

    目录 前言 一. 自动登录简介 1. 为什么要自动登录 2. 自动登录的实现方案 二. 基于散列加密方案实现自动登录 1. 配置加密令牌的key 2. 配置SecurityConfig类 3. 添加测试接口 4. 启动项目测试 三. 散列加密方案实现原理 1. cookie的加密原理分析 2. cookie的解码原理分析 3. 自动登录的源码分析 3.1 令牌生成的源码分析 3.2 令牌解析的源码分析 前言 在前面的2个章节中,一一哥 带大家实现了在Spring Security中添加图形验证码

  • Spring Boot构建系统安全层的步骤

    01 | Spring Security 架构及核心类 Spring Security 中的过滤器链 Spring Security 中采用的是管道-过滤器(Pipe-Filter)架构模式,这些过滤器链,构成了 Spring Security 的核心.如下图所示: 项目一旦启动,过滤器链将会实现自动配置,如下图所示: UsernamePasswordAuthenticationFilter 用来检查输入的用户名和密码,代码如下: public class UsernamePasswordAut

  • SpringBoot与spring security的结合的示例

    权限控制,也是我们再日常开发中经常遇到的场景,需要根据用户的角色决定是否可以看到某个资源.目前,市面上此类框架主要有shiro与我们今天要讲到的spring security.关于权限的控制有复杂的控制,例如几乎每个公司都有单点登录系统,根据用户名来到数据库中拿到对应的权限,在展示该权限下能看到的资源.还有一种就是简单的控制,也就是我们今天所要提到的.将账号,密码,角色配置到代码中,也可以进行简单的控制,缺点不言而喻,扩展性不好,只有固定的账号,但是作为演示还是够用的. 好了废话不多说,上pom

  • Spring Cloud Gateway 整合 knife4j 聚合接口文档功能

    当系统中微服务数量越来越多时,如果任由这些服务散落在各处,那么最终管理每个项目的接口文档将是一件十分麻烦的事情,单是记住所有微服务的接口文档访问地址就是一件苦差事了.当如果能够将所有微服务项目的接口文档都统一汇总在同一个可视化页面,那么将大大减少我们的接口文档管理维护工作,为此,我们可以基于 Spring Cloud Gateway 网关 + nacos + knife4j 对所有微服务项目的接口文档进行聚合,从而实现我们想要的文档管理功能 注:本案例需要 springboot 提前整合 nac

  • Spring Security实现两周内自动登录"记住我"功能

    本文是Spring Security系列中的一篇.在上一篇文章中,我们通过实现UserDetailsService和UserDetails接口,实现了动态的从数据库加载用户.角色.权限相关信息,从而实现了登录及授权相关的功能.这一节就在此基础上新增,登录过程中经常使用的"记住我"功能,也就是我们经常会在各种网站登陆时见到的"两周内免登录","三天内免登录"的功能.该功能的作用就是:当我们登录成功之后,一定的周期内当我们再次访问该网站,不需要重新登

  • Spring Security实现两周内自动登录"记住我"功能

    本文是Spring Security系列中的一篇.在上一篇文章中,我们通过实现UserDetailsService和UserDetails接口,实现了动态的从数据库加载用户.角色.权限相关信息,从而实现了登录及授权相关的功能.这一节就在此基础上新增,登录过程中经常使用的"记住我"功能,也就是我们经常会在各种网站登陆时见到的"两周内免登录","三天内免登录"的功能.该功能的作用就是:当我们登录成功之后,一定的周期内当我们再次访问该网站,不需要重新登

随机推荐