“token“的验证

以下代码中,为什么要验证两次"token"?

if (JwtUtil.validateToken(authToken) && sessionService.isTokenValid(authToken)) {
                    UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
                            userDetails, null, userDetails.getAuthorities());
                    auth.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                    SecurityContextHolder.getContext().setAuthentication(auth);
                }

因为 validateTokenisTokenValid 执行的是不同类型的验证,因此两者都是有其必要性的。下面是各自方法的功能解析:

  1. validateToken(String token)

    • 这个方法使用 Jwts.parserBuilder() 来验证 JWT 令牌的结构、签名、有效性(例如是否过期)。这是基本的 JWT 安全性验证,确保了令牌在技术层面上是合法的。
    • 如果令牌解析成功,说明它至少在创建时是由合法的服务生成,并且在传输过程中没有被篡改。
  2. isTokenValid(String token)

    • 这个方法通过查询 Redis 来检查令牌是否存在。这通常用于实现如会话管理的额外逻辑,例如检查用户是否已经登出或令牌是否被服务端主动废弃。
    • 使用 Redis 进行检查可以帮助实现例如可撤销令牌的功能,即使令牌从技术上看仍然是有效的,也可以因为某些业务逻辑(如用户主动登出)而被标记为无效。

结论

  • 两次验证都是必要的。第一次验证确保了 JWT 本身的有效性和完整性。第二次验证则提供了对业务规则的支持,例如允许从服务端废弃或撤销令牌。
  • 这种验证方式提高了系统的安全性,使得即便是技术上有效的令牌,也可以因为业务需求(如用户行为)而被标记为无效。

因此,这两种验证方法各自承担了不同的角色,共同提供了更全面的安全保障。维持这两步验证可以确保系统既能防范技术层面的攻击,也能满足业务层面的安全需求。

  • 23
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我明白了。这是一个关于设计一个小语言的词法分析程序的问题。让我来回答你的问题: 该小语言的文法如下: ``` <程序> -> <语句> <语句> -> <赋值语句> | <条件语句> <赋值语句> -> <变量> = <表达式> <条件语句> -> if <条件> then <语句> else <语句> <条件> -> <表达式> <比较符> <表达式> <比较符> -> < | > | <= | >= | == | != <表达式> -> <项> | <项> + <表达式> | <项> - <表达式> <项> -> <因子> | <因子> * <项> | <因子> / <项> <因子> -> <变量> | <常量> | ( <表达式> ) <变量> -> <字母> <字符串> <常量> -> <数字> <字符串> <字母> -> a | b | c | ... | z | A | B | C | ... | Z <数字> -> 0 | 1 | 2 | ... | 9 <字符串> -> <字符串> <字母> | <字符串> <数字> | ε ``` 其中,ε表示空串。 根据以上文法,可以构造一个词法分析程序,按照以下步骤进行: 1. 读入源程序文件,逐个字符进行识别。 2. 根据文法定义,判断字符属于哪一类单词(如变量、常量等)。 3. 将单词加入相应的单词表中,并记录单词在表中的位置。 4. 如果遇到词法错误,输出错误信息。 5. 重复步骤2-4,直到读入所有源程序字符。 6. 将单词表中的内容输出到单词串文件中。 请注意,在识别单词时,需要注意单词之间的分隔符(如空格、换行符等)。 同时,为了避免混淆,可以将该小语言的关键字(如if、then、else等)和操作符(如+、-、*、/等)单独列出来,作为特殊单词进行识别。 希望这个回答能够帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值