Java Dropwizard JWT工作流

Java Dropwizard JWT工作流,java,jwt,dropwizard,Java,Jwt,Dropwizard,设计模式帮助: 我有一个dropwizard应用程序,它实现了用于身份验证的JWT。我用最基本的形式写了这个 我有一个用户类,它有关于用户的各种详细信息(电子邮件、姓名、设置等) 然而,有人告诉我,当我对用户进行身份验证时,我应该返回一个主体,而不是实际用户。以下是我的方法: @Override public Optional<Principal> authenticate(JsonWebToken token) throws AuthenticationException {

设计模式帮助:

我有一个dropwizard应用程序,它实现了用于身份验证的JWT。我用最基本的形式写了这个

我有一个用户类,它有关于用户的各种详细信息(电子邮件、姓名、设置等)

然而,有人告诉我,当我对用户进行身份验证时,我应该返回一个主体,而不是实际用户。以下是我的方法:

@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);
}
这一切都正常,但如果我想访问用户的其他属性,而这些属性在主体上不存在,该怎么办

我是否应该使用主体的
名称
值在数据库中查找用户,并在每次使用某个用户属性时检索该用户

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


如果您能提供一些关于我应该遵循哪种模式/工作流程的指导,我将不胜感激。

身份验证器的泛型是
Athenticator
,因此您可以让您的
用户实施
主体
,并使您的
身份验证器类似于

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

您知道您可以创建
Principal
的子类并使用它。如果你让
User
扩展
Principal
,你可以使用它;我创建了一个实现主体的抽象类,然后我可以告诉用户扩展我的主体,然后在我的验证器类中,我可以为用户切换所有主体对象?当然。。。确保您将所有泛型类型参数切换到User而不是Principal是的,我尝试过,但随后我得到了一个编译错误,JWTAuthFilter不喜欢实现验证器不是Principal,即使用户是从Principal扩展而来。您从哪里得到这个
JWTAuthFilter
的?我可能很快就会说出来,当身份验证过程工作并通过时,@Auth User User的值现在始终为null,即使返回可选值。@of(User)成功返回对象。我不确定这是JWTFilter还是DropWizard您注册了DW AuthValueFactoryProvider吗?我注册了,但是它仍然引用主体而不是用户。。。这肯定足够解决它了。慢慢开始明白这一切是如何联系在一起的!再次干杯
public class JWTAuthenicator extends Authenticator<JsonWebToken, User> {
    @Override
    public Optional<User> authenticate(JsonWebToken token) {}
}
new JWTAuthFilter.Builder<User>()
    .setAuthenticator(new JWTAuthenticator())
    .setEverythingElse(...)
    .buildAuthFilter();