如何在不传递引用的情况下在Cloud Endpoints中公开用户?

时间:2017-07-28 15:59:12

标签: java security authentication google-cloud-endpoints

Google Cloud Endpoint 中,我可以注入自定义AuthenticatorUser,如下所示。我想以类似于 Apache Shiro User的方式将SecurityUtils.getSubject()的实例暴露给服务方法。

我试图通过执行UserServiceFactory.getUserService().getCurrentUser()来执行此操作,但无效(返回null)。

我已经实现了一些在服务上执行身份验证逻辑的注释,并且我希望将它与服务中的实际业务逻辑分开。因此,如果我可以从任何地方检索当前正在处理的请求的当前用户,将会很有帮助。我是在没有 Spring Security Apache Shiro 的情况下实现的。

有干净的方法吗?

@ApiMethod(authenticators = {JwtAuthenticator.class}, name = "find", path="foobars", httpMethod = GET)
public Foobar getFoobar(User user, long id) {
    // I'd like to get rid of passing the user reference
    return foobars.get(id, user);  // performs checks on user
}

1 个答案:

答案 0 :(得分:1)

不幸的是,由于Endpoints当前的实现方式,使用Framework惯用法不可能干净利落。如果您停止在API方法中包含User个参数,那么首先不会运行身份验证器,从而无法实现身份验证器。

如果您独立于Endpoints Framework编写自己的auth代码,那么您可以使用ThreadLocal变量来存储当前用户的静态助手,这些用户通过servlet过滤器或其他一些机制填充。