springboot2.3.0集成springsecurity,实现持久化到数据库的记住我以及logout

1:首先创建一张表

为什么是这张表,可以点开JdbcTokenRepositoryImpl看
sql:CREATE TABLEpersistent_logins(usernamevarchar(64) NOT NULL,seriesvarchar(64) NOT NULL,tokenvarchar(64) NOT NULL,last_usedtimestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (series) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在springsecurity的配置类中配置

// 是sql下 的DataSource,表示applicantion.yml中配置的数据源
import javax.sql.DataSource;
/**
     * @Description: 记住我持久化到数据库中
     * @author libiao
     * @Date 2020-6-22 9:50
     * @Param
     * @return
     **/
    @Bean
    public PersistentTokenRepository persistentTokenRepository(){
        JdbcTokenRepositoryImpl repository = new JdbcTokenRepositoryImpl();
        repository.setDataSource(dataSource);
        return repository;
    }

还需要告诉springsecurity

// 开启记住我,60秒
        http.rememberMe().rememberMeParameter("rememberMe").tokenValiditySeconds(60)
                .tokenRepository(persistentTokenRepository()).userDetailsService(userDetailsService);

2:logout

logout的默认行为

  • 当前session失效,即:logout的核心需求,session失效就是访问权限的回收
  • 删除当前用户的remember-me“记住我”的功能信息
  • clear 清除当前的SecurityContext
  • 重定向到登陆页面,loginPage配置的页面// 如果有配置登出成功后的页面,那么就跳转到指定的页面(http.logout().logoutSuccessUrl("/");)

logout也有成功后执行handler
在自定义的这个handler中可以实现一些登出的逻辑,比如记录登陆的时间等
编码:
首先实现LogoutSuccessHandler

package com.libiao.basicserver.config.auth;

import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
    @Override
    public void onLogoutSuccess(HttpServletRequest request,
                                HttpServletResponse response,
                                Authentication authentication)
            throws IOException, ServletException {

        //具体的业务逻辑,比如:登录时间的统计

		// 重定向的页面
        response.sendRedirect("/");
    }
}

然后在springsecurity的配置类中配置这个handler

// 开启注销
        http.logout()
                //.logoutSuccessUrl("/")
                .logoutSuccessHandler(myLogoutSuccessHandler);
Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。 Spring Security 为基于J2EE企业应用软件提供了全面安全服务。特别是使用领先的J2EE解决方案-Spring框架开发的企业软件项目。人们使用Spring Security有很多种原因,不过通常吸引他们的是在J2EE Servlet规范或EJB规范中找不到典型企业应用场景的解决方案。 特别要指出的是他们不能再WAR 或 EAR 级别进行移植。这样,如果你更换服务器环境,就要,在新的目标环境进行大量的工作,对你的应用系统进行重新配 置安全。使用Spring Security 解决了这些问题,也为你提供很多有用的,完全可以指定的其他安全特性。 你可能知道,安全包括两个主要操作。 第一个被称为“认证”,是为用户建立一个他所声明的主体。主题一般式指用户,设备或可以在你系 统中执行动作的其他系统。“授权”指的是一个用户能否在你的应用中执行某个操作,在到达授权判断之前,身份的主题已经由 身份验证过程建立了。这些概念是通用的,不是Spring Security特有的。在身份验证层面,Spring Security广泛支持各种身份验证模式,这些验证模型绝大多数都由第三方提供,或则正在开发的有关标准机构提供的,例如 Internet Engineering Task Force.作为补充,Spring Security 也提供了自己的一套验证功能。 Spring Security 目前支持认证一体化如下认证技术: HTTP BASIC authentication headers (一个基于IEFT RFC 的标准) HTTP Digest authentication headers (一个基于IEFT RFC 的标准) HTTP X.509 client certificate exchange (一个基于IEFT RFC 的标准) LDAP (一个非常常见的跨平台认证需要做法,特别是在大环境) Form-based authentication (提供简单用户接口的需求) OpenID authentication Computer Associates Siteminder JA-SIG Central Authentication Service (CAS,这是一个流行的开源单点登录系统) Transparent authentication context propagation for Remote Method Invocation and HttpInvoker (一个Spring远程调用协议)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值