是否有推荐的方法来测试 Pyramid 应用程序中的安全设置?更具体地说,我正在使用路线和自定义路线工厂。使用细粒度的 ACL,安全设置被拆分到不同的位置:配置设置、工厂、@view_config 中的权限集以及视图内权限的事件显式检查。
单元和功能测试页面(http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/testing.html)似乎没有指示测试用户 A 是否只能查看和修改数据的方法他被允许。
是否有推荐的方法来测试 Pyramid 应用程序中的安全设置?更具体地说,我正在使用路线和自定义路线工厂。使用细粒度的 ACL,安全设置被拆分到不同的位置:配置设置、工厂、@view_config 中的权限集以及视图内权限的事件显式检查。
单元和功能测试页面(http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/testing.html)似乎没有指示测试用户 A 是否只能查看和修改数据的方法他被允许。
这是功能测试。Webtest 可以保留会话 cookie,因此您可以使用它以用户身份登录和访问各种页面。
myapp = pyramid.paster.get_app('testing.ini')
app = TestApp(myapp)
resp = app.post('/login', params={'login': 'foo', 'password': 'seekrit'})
# this may be a redirect in which case you may want to follow it
resp = app.get('/protected/resource')
assert resp.status_code == 200
至于仅测试应用程序的某些部分,您可以使用自定义的东西(或仅使用自定义 groupfinder)覆盖身份验证策略。
def make_test_groupfinder(principals=None):
def _groupfinder(u, r):
return principals
return _groupfinder
然后,您可以使用此功能来模拟各种主体。但是,如果您的应用程序还依赖于任何地方,这不会处理用户 ID authenticated_userid(request)
。为此,您必须将身份验证策略替换为虚拟策略。
class DummyAuthenticationPolicy(object):
def __init__(self, userid, extra_principals=()):
self.userid = userid
self.extra_principals = extra_principals
def authenticated_userid(self, request):
return self.userid
def effective_principals(self, request):
principals = [Everyone]
if self.userid:
principals += [Authenticated]
principals += list(self.extra_principals)
return principals
def remember(self, request, userid, **kw):
return []
def forget(self, request):
return []
我认为此时问题和答案都可能是旧的:对于当前版本的 Pyramid,有一种testing_securitypolicy
方法(此处的文档)可以轻松访问设置的内容,如authenticated_userid、effective_principals、记住和忘记的结果等。
如果需要authenticated_userid
在请求上设置,这是一个使用示例。
from pyramid.testing import (setUp, tearDown, DummyRequest)
def test_some_view():
config = setUp()
config.testing_securitypolicy(userid='mock_user') # Sets authenticated_userid
dummy_request = DummyRequest()
print(dummy_request.authenticated_userid) # Prints 'mock_user'
# Now ready to test something that uses request.authenticated_userid
from mypyramidapp.views.secure import some_auth_view
result = some_auth_view(dummy_request)
expected = 'Hello mock_user!'
assert result == expected
# Finally, to avoid security changes leaking to other tests, use tearDown
tearDown() # Undo the effects of pyramid.testing.setUp()