关于java:使用-SaToken-实现-记住我-模式登录七天免登录

4次阅读

共计 3834 个字符,预计需要花费 10 分钟才能阅读完成。

一、需要剖析

如图所示,个别网站的登录界面都会有一个 [记住我] 按钮,当你勾选它登录后,即便你敞开浏览器再次关上网站,也仍然会处于登录状态,毋庸反复验证明码:

本文将具体介绍在 Sa-Token 中,如何做到以下登录模式:

  • 记住我登录:登录后敞开浏览器,再次关上网站登录状态仍然无效,无需反复登录。
  • 仅本次无效登录:登录后敞开浏览器,再次关上网站登录状态将生效,须要再次登录。
  • 七天免登录:为登录状态设定一个具体的有效期,在这个期限内无需反复登录,过了期限后须要再次登录。

Sa-Token 是一个轻量级 java 权限认证框架,次要解决登录认证、权限认证、单点登录、OAuth2、微服务网关鉴权 等一系列权限相干问题。

Gitee 开源地址:https://gitee.com/dromara/sa-token

首先在我的项目中引入 Sa-Token 依赖:

<!-- Sa-Token 权限认证 -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.34.0</version>
</dependency>

注:如果你应用的是 SpringBoot 3.x,只须要将 sa-token-spring-boot-starter 批改为 sa-token-spring-boot3-starter 即可。

二、在 Sa-Token 中实现记住我性能

Sa-Token 的登录受权,默认就是 [记住我] 模式 ,为了实现[非记住我] 模式,你须要在登录时如下设置:

// 设置登录账号 id 为 10001,第二个参数指定是否为[记住我],当此值为 false 后,敞开浏览器后再次关上须要从新登录
StpUtil.login(10001, false);

那么,Sa-Token 实现 [记住我] 的具体原理是?

三、实现原理

Cookie 作为浏览器提供的默认会话跟踪机制,其生命周期有两种模式,别离是:

  • 长期 Cookie:有效期为本次会话,只有敞开浏览器窗口,Cookie 就会隐没。
  • 长久 Cookie:有效期为一个具体的工夫,在工夫未到期之前,即便用户敞开了浏览器 Cookie 也不会隐没。

利用 Cookie 的此个性,咱们便能够轻松实现 [记住我] 模式:

  • 勾选 [记住我] 按钮时:调用 StpUtil.login(10001, true),在浏览器写入一个 长久 Cookie贮存 Token,此时用户即便重启浏览器 Token 仍然无效。
  • 不勾选 [记住我] 按钮时:调用 StpUtil.login(10001, false),在浏览器写入一个 长期 Cookie贮存 Token,此时用户在重启浏览器后 Token 便会隐没,导致会话生效。

动静演示图:

四、前后端拆散模式下如何实现[记住我]?

此时机智的你😏很快发现一个问题,Cookie 虽好,却无奈在前后端拆散环境下应用,那是不是代表上述计划在 APP、小程序等环境中有效?

精确的讲,答案是必定的,任何基于 Cookie 的认证计划在前后端拆散环境下都会生效(起因在于这些客户端默认没有实现 Cookie 性能),不过好在,这些客户端个别都提供了代替计划,
惟一遗憾的是,此场景中 token 的生命周期须要咱们在前端手动管制:

以经典跨端框架 uni-app 为例,咱们能够应用如下形式达到同样的成果:

// 应用本地存储保留 token,达到 [长久 Cookie] 的成果
uni.setStorageSync("satoken", "xxxx-xxxx-xxxx-xxxx-xxx");

// 应用 globalData 保留 token,达到 [长期 Cookie] 的成果
getApp().globalData.satoken = "xxxx-xxxx-xxxx-xxxx-xxx";

如果你决定在 PC 浏览器环境下进行前后端拆散模式开发,那么更加简略:

// 应用 localStorage 保留 token,达到 [长久 Cookie] 的成果
localStorage.setItem("satoken", "xxxx-xxxx-xxxx-xxxx-xxx");

// 应用 sessionStorage 保留 token,达到 [长期 Cookie] 的成果
sessionStorage.setItem("satoken", "xxxx-xxxx-xxxx-xxxx-xxx");

Remember me, it’s too easy!

五、登录时指定 Token 有效期

登录时不仅能够指定是否为 [记住我] 模式,还能够指定一个特定的工夫作为 Token 无效时长,如下示例:

// 示例 1:// 指定 token 有效期(单位: 秒),如下所示 token 七天无效
StpUtil.login(10001, new SaLoginModel().setTimeout(60 * 60 * 24 * 7));

// ----------------------- 示例 2:所有参数
// `SaLoginModel` 为登录参数 Model,其有诸多参数决定登录时的各种逻辑,例如:StpUtil.login(10001, new SaLoginModel()
            .setDevice("PC")                 // 此次登录的客户端设施类型, 用于 [同端互斥登录] 时指定此次登录的设施类型
            .setIsLastingCookie(true)        // 是否为长久 Cookie(长期 Cookie 在浏览器敞开时会主动删除,长久 Cookie 在从新关上后仍然存在).setTimeout(60 * 60 * 24 * 7)    // 指定此次登录 token 的有效期, 单位: 秒(如未指定,主动取全局配置的 timeout 值).setToken("xxxx-xxxx-xxxx-xxxx") // 预约此次登录的生成的 Token 
            .setIsWriteHeader(false)         // 是否在登录后将 Token 写入到响应头
            );

注:如果在登录时未指定 new SaLoginModel().setTimeout(604800) 那么框架将采纳全局配置的 sa-token.timeout 值作为 Token 的有效期。

六、不同登录策略的代码比照

以下是三种登录策略的代码差别:

package com.pj.cases.up;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;

/**
 * Sa-Token 记住我模式登录 
 * 
 * @author kong
 * @since 2022-10-17 
 */
@RestController
@RequestMapping("/RememberMe/")
public class RememberMeController {

    // 记住我登录    ---- http://localhost:8081/RememberMe/doLogin?name=zhang&pwd=123456
    @RequestMapping("doLogin")
    public SaResult doLogin(String name, String pwd) {if("zhang".equals(name) && "123456".equals(pwd)) {StpUtil.login(10001, true);
            return SaResult.ok("登录胜利");
        }
        return SaResult.error("登录失败");
    }
    
    // 不记住我登录    ---- http://localhost:8081/RememberMe/doLogin2?name=zhang&pwd=123456
    @RequestMapping("doLogin2")
    public SaResult doLogin2(String name, String pwd) {if("zhang".equals(name) && "123456".equals(pwd)) {StpUtil.login(10001, false);
            return SaResult.ok("登录胜利");
        }
        return SaResult.error("登录失败");
    }

    // 七天免登录    ---- http://localhost:8081/RememberMe/doLogin3?name=zhang&pwd=123456
    @RequestMapping("doLogin3")
    public SaResult doLogin3(String name, String pwd) {if("zhang".equals(name) && "123456".equals(pwd)) {StpUtil.login(10001, 60 * 60 * 24 * 7);
            return SaResult.ok("登录胜利");
        }
        return SaResult.error("登录失败");
    }
    
}

可顺次拜访正文中提供的测试链接,察看不同登录策略带来的会话有效期差别。


参考资料

  • Sa-Token 文档:https://sa-token.cc
  • Gitee 仓库地址:https://gitee.com/dromara/sa-token
  • GitHub 仓库地址:https://github.com/dromara/sa-token
正文完
 0