我正在使用python和Google应用引擎。我想使用任务队列。作为任务队列处理程序的一部分,我检查当前用户是否是管理员(使用用户服务)。此测试总是失败。有没有办法让这个测试通过?
更新:为了避免进一步的混淆,我试图找出触发任务的用户是否是管理员(这只是一个简单的例子)。我知道该任务正在从服务器运行,所有用户cookie早已不复存在。所以我正在努力的答案是将会话转移到任务
的方法import logging
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import taskqueue
class MyRequesHandler(webapp.RequestHandler):
def get(self):
taskqueue.add(url="/task/")
class MyTaskHandler(webapp.RequestHandler):
def post(self):
if users.is_current_user_admin():
logging.debug("admin")
else:
logging.debug("not admin")
def main():
logging.getLogger().setLevel(logging.DEBUG)
application = webapp.WSGIApplication([
('/', MyRequesHandler),
('/task/', MyTaskHandler)
],
debug=True)
run_wsgi_app(application)
答案 0 :(得分:5)
Users API反映了当前请求的登录用户的详细信息,显然在任务队列任务的情况下,没有用户,因为它是由任务队列系统启动的。在排队任务之前,您需要执行此检查,并将结果作为标志传递给任务。
答案 1 :(得分:1)
要在某些特定事件上代表执行任务,只需将数据存储区ID或密钥(或用户的任何其他标识符)作为其有效负载传输到任务。
class MyRequesHandler(webapp.RequestHandler):
def get(self):
taskqueue.add(url="/task/do_something", params={'user_email': users.get_current_user().email()})
class MyTaskHandler(webapp.RequestHandler):
def post(self):
user_email = self.request.POST.get('user_email')
user = User.all().filter('email', user_email).get()
# ... do something on behalf of user
这显然需要保护任务的URL免受外部未经授权的访问 - 这可以在app.yaml
中完成:
handlers:
- url: /task/(.*)
script: tasks.py
login: admin
任务队列访问需要管理员登录的网址没有问题。
答案 2 :(得分:0)
执行任务队列项时,无法通过用户服务使用原始用户。但是,在创建任务时,您可以将原始用户的ID包含在请求中。
要防止外部用户在任务执行期间伪造此用户ID,请查找X-AppEngine-QueueName
请求标头。此标头为only present on task queue items,无法由外部用户伪造。