我正在开发云端点后端,并希望将某些操作限制为管理员用户。
我目前的代码是这样的:
@ApiMethod(httpMethod = "PATCH", name = "item.update", path = "items")
public Item update(Item newObject, User user)
throws UnauthorizedException, OAuthRequestException {
OAuthService oAuthService = OAuthServiceFactory.getOAuthService();
if (!oAuthService.isUserAdmin()) {
throw new UnauthorizedException("Only admin users can modify content.");
}
...
}
我知道app引擎有一个用户角色的概念,但我很好奇Endpoints 做。我尝试过使用OAuthService.isUserAdmin()调用,但事实并非如此 似乎工作得很好,而且文档有一个很老的警告说
注意:您不应将端点auth与auth for混淆 关于配置设置的文章中描述的非端点 App Engine Web应用 管理员中的https://developers.google.com/appengine/articles/auth 控制台,您还可以在其中指定用户登录要求 的web.xml https://developers.google.com/appengine/docs/java/config/webxml#Security_and_Authentication 文件。这种方法不与端点一起使用。“
我是否必须自己创建某种授权,使用传递给更新方法的User对象?有什么想法吗?
答案 0 :(得分:3)
我有类似的问题。实际上,OAuth用户服务与AppEngine用户服务无关。我最终做的是在我的数据存储区中有一个专用的用户类型实体,我为每个用户存储一个特定的标志(常规/管理员)。我使用AppEngine用户服务时更新此标志(即,以便我在控制台中指定的管理员获得正确的管理标志)。
在我的端点API中,我获取当前用户的authDomain和id,在我的数据存储区中查找是否有admin标志。我的用户实体的密钥由“authDomain:userId”组成,因为我现在只支持谷歌用户,它看起来像(gmail.com:123456789)
这意味着管理员必须使用AppEngine UserService(即我的专用网页)登录一次,以便正确更新该标志
答案 1 :(得分:0)
我需要做同样的事情,并验证一些端点只授予对项目控制台中列出的管理员成员的访问权限并使用上面介绍的相同实现,但是oAuthService.isUserAdmin()接受一个或多个字符串参数,这个参数是您指定的范围,Oauth用于获取用户信息,在我的情况下,我只是设置此参数,它的工作方式与下面的代码类似。
OAuthService authService = OAuthServiceFactory.getOAuthService();
User user;
try {
com.google.appengine.api.users.User currentUser =
authService.getCurrentUser(Constants.EMAIL_SCOPE);
if (currentUser != null && authService.isUserAdmin(Constants.EMAIL_SCOPE)) {
user = new User(currentUser.getEmail());
return user;
}
...
EMAIL_SCOPE常量由
定义public static final String EMAIL_SCOPE = "https://www.googleapis.com/auth/userinfo.email";
在我的情况下,我实现了一个身份验证器,只有当它是管理员用户时才将用户信息传递给端点,如果需要,您可以阅读有关身份验证器的更多信息。 https://cloud.google.com/appengine/docs/java/endpoints/javadoc/com/google/api/server/spi/config/Authenticator