【发布时间】: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