【问题标题】:Dropwizard JWT workflowDropwizard JWT 工作流程
【发布时间】:2016-03-10 20:02:27
【问题描述】:

设计模式帮助:

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

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

但是,我被告知,当我对用户进行身份验证时,我应该返回一个 Principal 而不是实际用户。这是我的方法:

@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,我可以检索该特定用户并将该用户名分配给新的主体对象并返回该主体。

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

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

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

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

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

对于我应该遵循哪种模式/工作流程的一些指导,我将不胜感激。

【问题讨论】:

  • 您知道您可以创建Principal 的子类并使用that。如果您将User 扩展为Principal,则可以使用它。
  • 澄清一下;我创建了一个实现 Principal 的抽象类,然后我可以告诉 User 扩展 MyPrincipal,然后在我的 Authenticator 类中我可以为 User 切换出所有的主体对象?
  • 当然...确保将所有泛型类型参数切换为 User 而不是 Principal
  • 是的,我试过了,但是我得到了一个编译错误,因为 JWTAuthFilter 不喜欢实现 Authenticator 不是委托人,即使用户是从委托人扩展而来的
  • 你从哪里得到这个JWTAuthFilter

标签: java jwt dropwizard


【解决方案1】:

Authenticator 泛型类型是Athenticator&lt;C, P extends Principal&gt;,因此您可以让您的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();

【讨论】:

  • 我可能已经讲了一点,当身份验证过程正常并通过时,即使 return Optional.of(user) 成功返回对象,@Auth User user 的值现在也始终为 null。我不确定这是 JWTFilter 还是 Dropwizard
  • 你注册了DW AuthValueFactoryProvider吗?
  • 我做到了,但是它仍然引用的是 Principal 而不是 User... 肯定足以修复它。现在慢慢开始明白这一切是如何联系在一起的!再次欢呼
猜你喜欢
  • 2014-01-28
  • 2021-04-30
  • 2021-09-20
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
相关资源
最近更新 更多