将用户信息传播到Dropwizard中的所有图层

时间:2017-07-28 11:35:56

标签: authentication dropwizard

我在我的Dropwizard应用程序中使用基本身份验证机制,我在其中捕获登录的用户详细信息,如下所示:

@POST
@Timed
@Consumes(MediaType.APPLICATION_JSON)
@Produces("application/pdf")
@Path("/")
@RolesAllowed("user,admin")
public Response function(@Auth User user) throws Exception {
    //some logic around here
}

现在出于审计目的,我希望在我的应用程序的每一层传递此用户信息,我的意思是在服务,DAO,ExceptionMappers等中,我不想将它作为函数参数传递到任何地方,因为它看起来笨拙并且还具有可维护性开销。所以我的问题是,有没有什么方法可以为每个REST调用或用户会话设置一些全局配置,并可以在任何我想要的地方获取它? 我一直是Ruby用户,因此我们能够做到这样的事情:

Thread.current[:user] = user

每个用户会话都可以访问。

1 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是使用Java的ThreadLocal,其中您可以设置User对象,并且该对象将可用于该特定执行程序线程。

将以下内容添加到资源类中。

private static ThreadLocal<User> localUser = new InheritableThreadLocal<>();

public static ShortenerServiceUser getUser() {
    return localUser.get();
}

无论何时调用function()方法,只需将User对象设置为ThreadLocal变量即可。

localUser.set(user);

现在,每当您需要从当前线程上下文访问User对象时,您需要做的就是如下

User localUser = YourResource.getUser();

您可以使用ThreadLocal.remove()方法从上下文中清除User对象。