设计模式帮助:
我有一个dropwizard应用程序,它实现了JWT进行身份验证。我以最基本的形式工作。
我有一个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
值来查找数据库中的用户,并在每次要使用其中一个用户属性时检索该用户?
我所做的事情有很大的缺陷吗?我在这方面没有太多经验,很难找到真实世界的例子。
对于我应该遵循什么样的模式/工作流程表示赞赏。
答案 0 :(得分:3)
Athenticator<C, P extends Principal>
泛型类型为User
,因此您可以使Principal
实施Authenticator
并使public class JWTAuthenicator extends Authenticator<JsonWebToken, User> {
@Override
public Optional<User> authenticate(JsonWebToken token) {}
}
类似
JWTAuthFilter
然后使用User
泛型类型参数
new JWTAuthFilter.Builder<User>()
.setAuthenticator(new JWTAuthenticator())
.setEverythingElse(...)
.buildAuthFilter();
-h