如何测试金字塔安全设置?

时间:2013-08-26 19:40:50

标签: security testing pyramid

是否有推荐的方法来测试Pyramid应用程序中的安全设置?更具体地说,我正在使用路线和自定义路线工厂。使用细粒度ACL,安全设置会在不同位置进行拆分:配置设置,工厂,@ view_config中设置的权限以及视图内部权限的事件显式检查。

单元和功能测试页面(http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/testing.html)似乎没有表明测试用户A是否只能查看和修改他允许的数据的方法。

2 个答案:

答案 0 :(得分:5)

这是功能测试。 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

就测试应用程序的某些部分而言,您可以使用自定义内容覆盖身份验证策略(或仅使用自定义组查找器)。

def make_test_groupfinder(principals=None):
    def _groupfinder(u, r):
        return principals
    return _groupfinder

然后,您可以使用此功能来模拟各种主体。但是,如果您的应用在任何地方依赖authenticated_userid(request),则无法处理用户ID。为此,您必须使用虚拟策略替换身份验证策略。

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 []

答案 1 :(得分:0)

我认为目前的问题和答案可能都比较古老:在当前版本的Pyramid中,有一个testing_securitypolicy方法(docs here),可以轻松访问设置诸如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()