Java GAE的认证策略

Java GAE的认证策略,java,google-app-engine,authentication,Java,Google App Engine,Authentication,我有一个应用程序部署到谷歌应用程序引擎。在应用程序中,有两个角色:标准用户和管理员。我有基于表单的身份验证设置,需要身份验证的URL(例如/admin和/account)设置为需要任何角色(*),这样我就可以确保Google已经对它们进行了身份验证。我为管理员路径和帐户路径设置了一个筛选器,该筛选器与后端业务逻辑对话,以查看用户是否在我的应用程序中拥有帐户,然后再将其转发到他们请求的页面,或者在必要时重定向 这似乎很麻烦,因为对于每个请求,过滤器都使用UserService获取google用户,

我有一个应用程序部署到谷歌应用程序引擎。在应用程序中,有两个角色:标准用户和管理员。我有基于表单的身份验证设置,需要身份验证的URL(例如/admin和/account)设置为需要任何角色(*),这样我就可以确保Google已经对它们进行了身份验证。我为管理员路径和帐户路径设置了一个筛选器,该筛选器与后端业务逻辑对话,以查看用户是否在我的应用程序中拥有帐户,然后再将其转发到他们请求的页面,或者在必要时重定向

这似乎很麻烦,因为对于每个请求,过滤器都使用UserService获取google用户,以确定通过google身份验证的人是否在应用程序中拥有帐户。我知道,在部署到传统应用程序服务器的应用程序上下文中,我实际上可以定义访问url所需的应用程序级角色,并且由于应用程序服务器将了解应用程序的角色/用户,这就足够了,但由于google正在处理身份验证,我假设我必须按照每个请求处理访问需求,就像我现在使用过滤器一样,这是正确的吗?我选择使用过滤器来保持实际的servlet“更干净”,这样我就知道当客户端请求到达servlet时,它们已经过身份验证,并且有权访问这些资源


在会话中携带这些数据(用户是否经过身份验证,他们是否是管理员或标准用户)是否明智?这是我能想出的唯一其他选择。我不确定为每个请求访问UserService的成本有多高,因为这反过来又会访问数据存储。我认为必须有更好的方法来处理身份验证。

不确定这是否是一个最佳解决方案,但我们现在要做的是存储一个用户会话(我们自己的实现,而不是GAEs),并使用Objecitfy的缓存功能积极缓存它。这样,我们只在登录/注销时访问数据存储,之后的大多数查询实际上都是免费的(因为我们的应用程序使用标准会话时间,缓存刷新并不是一个真正的问题)

我也在考虑缓存。一个保存所有用户帐户的id,一个保存所有管理员的id,这些缓存将在创建新帐户时更新。这样,过滤器就可以与缓存而不是数据存储进行通信。在创建它们之后,必须多次重新加载它们。