8-SpringSecurity:RemeberMe及Base64编码

简介: 8-SpringSecurity:RemeberMe及Base64编码

背景


本系列教程,是作为团队内部的培训资料准备的。主要以实验的方式来体验 SpringSecurity 的各项Feature。


SpringSecurity提供了开箱即用的remember-me功能,就是长下面这样:

image.png

直接5-SpringSecurity:RBAC及方法授权的项目springboot-security-rbac 中进行实验 ,核心依赖为 WebSpringSecurity

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>


实验0:开启RememberMe


直接在最后加一个配置:.and().rememberMe()便开启了RememberMe功能,此时再到登录页,就会看到有个可勾选的checkbox

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/user/add").hasRole("dev")
            .antMatchers("/user/query").hasAuthority("ROLE_test")
            .antMatchers("/user/**").authenticated()
            .anyRequest().permitAll() // Let other request pass
            .and()
            .formLogin()
            .and()
            .rememberMe();
}

填写账号、密码并勾选Remember me on this computer.之后,先打开浏览器控制台,然后点击登录,可以观察到Cookie中除了JSESSIONID之外,还多了一个remember-me

image.png


实验1:解析remember-me


.and().rememberMe()这个配置项一直跟到源码AbstractRememberMeServices类,可以看到有个encodeCookie(String[] cookieTokens)方法,里面最后返回是一个Base64编码的字符串。

protected String encodeCookie(String[] cookieTokens) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < cookieTokens.length; i++) {
        try {
            sb.append(URLEncoder.encode(cookieTokens[i], StandardCharsets.UTF_8.toString()));
        }
        catch (UnsupportedEncodingException ex) {
            this.logger.error(ex.getMessage(), ex);
        }
        if (i < cookieTokens.length - 1) {
            sb.append(DELIMITER);
        }
    }
    String value = sb.toString();
    sb = new StringBuilder(new String(Base64.getEncoder().encode(value.getBytes())));
    while (sb.charAt(sb.length() - 1) == '=') {
        sb.deleteCharAt(sb.length() - 1);
    }
    return sb.toString();
}

这里先利用线上的工具进行Base64解码:

image.png

接着,再用Java自带的工具类解码:

image.png

可以观察到解码后的字符串一致,由三部分构成:用户名:时间戳:类似MD5或去了连词符的UUID,其中时间戳经过计算是14天,这在源码中得到了证实。具体规则经过查阅官方文档,是这样的:

image.png

image.png


实验2:什么是Base64编码


Base64编码,是选出64个字符作为一个基本字符集(A-Z,a-z,0-9,+,/,再加上作为补充的"=",实际是65个字符),其它所有符号都按照规则转换成这个字符集中的字符。正常编码转成Base64编码,满足3 * 8 = 24 = 4 * 6。即每3个字节的正常编码可以转成由4个字节组成的正常编码。编码规则如下:


  1. 计算机中,每个字节由8个二进制位构成,将每3个字节作为一组,一共是24个二进制位;


  1. 将这24个二进制位分为4组,每个组有6个二进制位;


  1. 在每组前面加00,扩展成32个二进制位,即4个字节;


  1. 根据码表,得到扩展后的每个字节的对应符号,便是Base64的编码值。

码表(参考RFC2045):

image.png

  • 将3个字节编码为4个字符

image.png

Note:如果要编码的字节数不能被3整除,最后会多出1个或2个字节。

image.png


目录
相关文章
|
存储 Java
Springboot 验证码生成和校验,图片格式和base64编码串
Springboot 验证码生成和校验,图片格式和base64编码串
843 0
Springboot 验证码生成和校验,图片格式和base64编码串
|
2月前
|
存储 安全 数据库
浅谈base64编码
浅谈base64编码
|
3月前
|
存储 XML 数据格式
深入理解Base64编码
【8月更文挑战第20天】
168 0
|
6月前
|
缓存 Java Apache
Spring一行代码搞定图片url地址转换为Base64,超简单!!!!
这段内容讲述了如何将URL指向的图片转换为Base64字符串。首先通过`org.apache.commons.io.IOUtils`或Java标准库读取URL的字节流,然后用Java 8的`Base64`类编码。示例代码提供了两种实现方式:一种依赖Apache Commons IO,另一种仅使用Java内置类。在第二种方式中,自定义了`toByteArray()`方法处理输入流并转换为字节数组,最后关闭输入流释放资源。
|
6月前
|
存储 算法 JavaScript
base64编码是啥?
base64编码是啥?
71 0
|
数据采集 算法 安全
Base64 编码原理 && 实现
Base64 编码原理 && 实现
102 0
|
存储 索引
Base64编码
通过阅读本篇文章,你可以了解到: 1、Base64 编码的作用 2、Base64 编码的规则 3、Base64 索引表
235 0
Base64编码
|
Web App开发 缓存 前端开发
关于图片的Base64编码
什么是Base64编码 Base64编码是一种图片处理格式,通过特定的算法将图片编码成一长串字符串,在页面上显示的时候,可以用该字符串来代替图片的url属性。 base64编码就是长得像下面这样子的代码: thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg== 上面代码大家都熟悉吧,迅雷下载链接哦,就是base64编码后的地址,所以以后看到这种:一堆连续字母,最后有1~2个"="的代码就是base64。
3064 0
|
算法 区块链 索引
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(一)
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(一)
433 0
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(一)
|
算法 Android开发
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(二)
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(二)
371 0