Dropwizard JWT 工作流程

Dropwizard JWT workflow

设计模式帮助:

我有一个实现 JWT 进行身份验证的 dropwizard 应用程序。我有这个以最基本的形式工作。

我有一个用户 class,其中包含有关用户的各种详细信息(电子邮件、姓名、设置等)

但是我被告知,当我对用户进行身份验证时,我应该 returning 委托人而不是实际用户。这是我的方法:

@Override
public Optional<Principal> authenticate(JsonWebToken token) throws AuthenticationException {

    final User user = userCollection.findOneById(token.claim().subject());

    Principal principal = new Principal() {
        @Override
        public String getName() {
            return user.getUsername();
        }
    };

    return Optional.of(principal);
}

我将用户存储在 mongoDB 集合中,因此使用令牌中的 ID 可以检索该特定用户并将该用户名分配给新的主体对象和 return 该主体.

这意味着在我需要身份验证的端点中,我可以使用来自该委托人的属性,例如:

@POST
@Path("project-create")
public Response setProject(@Auth Principal principal, @Valid Project project) {
    [...]
    project.setAuthorName(principal.getName());
    [...]
}

一切正常,但是如果我想访问 Principal 上不存在的用户的其他属性怎么办?

我是否应该使用主体的 name 值在数据库中查找用户并在每次我想使用其中一个用户属性时检索该用户?

我所做的是否存在重大缺陷?我在这方面没有太多经验,很难找到真实世界的例子。

希望得到一些关于我应该遵循哪种 pattern/workflow 的指导。

Authenticator 通用类型是 Athenticator<C, P extends Principal>,因此您可以使 User 实现 Principal 并使 Authenticator 类似于

public class JWTAuthenicator extends Authenticator<JsonWebToken, User> {
    @Override
    public Optional<User> authenticate(JsonWebToken token) {}
}

然后使用 User 泛型类型参数构建 JWTAuthFilter

new JWTAuthFilter.Builder<User>()
    .setAuthenticator(new JWTAuthenticator())
    .setEverythingElse(...)
    .buildAuthFilter();