Python中文网

一个关于 编程问题的解答网站.

有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有Hibernate对象“get”方法的java JPA返回不同版本的一对一关系

我有一个与AuthorizationToken对象具有一对一关系的用户对象。这个项目的基础可以找到here

当用户登录时,将通过一对一地持久化链接到该用户的授权令牌(具有指定的到期时间)来创建新会话。出于开发目的,这个到期时间被设置为1个月,这在我的脑海中浮现。现在我的代币已开始过期,系统出现错误

用户登录时调用以下方法:

public AuthorizationToken createAuthorizationToken(User user) {
    if(user.getAuthorizationToken() == null || user.getAuthorizationToken().hasExpired()) {
        LOG.debug("UserToken has expired or is null, creating new token");
        user.setAuthorizationToken(new AuthorizationToken(user, applicationConfig.getAuthorizationExpiryTimeInSeconds()));
        userRepository.save(user);
    }
    return user.getAuthorizationToken();
}

这将返回当前令牌,如果它为空或过期,则返回一个新令牌。如果为null或过期,连接到用户的令牌也会被替换(setAuthorizationToken方法)。这样,我的新令牌在数据库中创建,并返回给客户机

然后,我们使用令牌为每个后续请求创建请求签名。服务器接收签名,使用存储的令牌进行复制,并检查它们是否相同以识别发送者

问题就出在这里,下面是一种用于在服务器中创建签名的方法:

private boolean isAuthorized(User user, AuthorizationRequestContext authorizationRequest, String hashedToken) {
    String unEncodedString = composeUnEncodedRequest(authorizationRequest);
    AuthorizationToken authorizationToken = user.getAuthorizationToken();
    String userTokenHash = encodeAuthToken(authorizationToken.getToken(), unEncodedString);
        if (hashedToken.equals(userTokenHash)) {
            return true;
        }
    return false;
}

我使用的是同一个用户。getAuthorizationToken()方法用于原始登录过程,但它生成两个不同的值。login方法返回新创建的令牌,签名服务返回数据库中与该用户相关的第一个实例(该实例现在已过期,不应再映射到用户对象)。这里出了什么问题?这只是清理过期代币的问题,这样它们就不会被混淆了吗?我相信这是一个更深层次的问题,因为用户一次只能有一个身份验证令牌映射

如对代码有任何意见,我们将不胜感激


共 (0) 个答案