您可以通过创建自己的路由器来进行授权。为此,继承 Router() 并覆盖(至少)authorize() 方法:
def authorize(self, session, uri, action):
return True
这个方法非常简单,如果你返回一个 True 则会话被授权做它正在尝试的任何事情。您可以制定一个规则,所有订阅必须以“com.example.USER_ID”开头,因此,您的 python 代码将拆分 uri,获取第三个字段,并将其与当前会话 id 进行比较,如果它们匹配则返回 True,false否则。这就是事情变得有点奇怪的地方。我有做类似事情的代码,这是我的 authorize() 方法:
@inlineCallbacks
def authorize(self, session, uri, action):
authid = session._authid
if authid is None:
authid = 1
log.msg("AuthorizeRouter.authorize: {} {} {} {} {}".format(authid,
session._session_id, uri, IRouter.ACTION_TO_STRING[action], action))
if authid != 1:
rv = yield self.check_permission(authid, uri, IRouter.ACTION_TO_STRING[action])
else:
rv = yield True
log.msg("AuthorizeRouter.authorize: rv is {}".format(rv))
if not uri.startswith(self.svar['topic_base']):
self.sessiondb.activity(session._session_id, uri, IRouter.ACTION_TO_STRING[action], rv)
returnValue(rv)
return
请注意,我潜入会话以获取 _authid,这是不好的业力(我认为),因为我不应该查看这些私有变量。不过,我不知道还能从哪里得到它。
另外,值得注意的是,这与身份验证密切相关。在我的实现中,_authid 是经过身份验证的用户 id,类似于 unix 用户 id(正唯一整数)。我很确定这可以是任何东西,比如一个字符串,所以如果你愿意的话,你应该可以将你的 'user_b' 作为 _auth_id。
-g