У меня проблемы с настройкой безопасности в пирамиде.Кажется, работает моя защита: если пользователь пытается получить доступ к ресурсу, доступ к которому у него нет прав, Pyramid выдает исключение HTTPForbidden
.Проблема в том, что в этом случае он должен вернуться к представлению входа в систему, чего не происходит.Я просто получаю экран исключений Pyramid по умолчанию со стеком трассировки.
мой вид входа в систему:
from pyramid.httpexceptions import HTTPForbidden
@view_config(context = HTTPForbidden, renderer="login.mak")
@view_config(route_name = 'login', renderer='login.mak')
class Login(ViewBase):
def __init__(self, request):
super(Login, self).__init__(request)
self.data['title'] = "Login"
if request.method == 'POST':
name = request.params['username']
passwd = request.params['password']
validuser = User.check(name, passwd)
if validuser is None:
self.data['requested_path'] = request.params['requestpath']
self.__call__()
else:
headers = remember(request, str(validuser.id))
raise HTTPFound(
location = request.params['requestpath'],
headers = headers
)
else:
self.data['requested_path'] = request.url
def __call__(self):
return self.data
Для всех представлений по умолчанию установлено разрешение 'view', my acl
Класс выглядит следующим образом:
from pyramid.security import Allow
from pyramid.security import Everyone
from pyramid.security import Authenticated
from pyramid.security import ALL_PERMISSIONS
# Handles ACL auth for the entire application
class RootFactory(object):
__acl__ = [
(Allow, Everyone, 'view'),
(Allow, 'Editor', 'edit'),
(Allow, 'Admin', ALL_PERMISSIONS)
]
def __init__(self, request):
pass
def groupfinder(userid, request):
from ctic.models import User
user = User.get(userid)
member_groups = []
if user != None:
member_groups.append(user.group.groupname)
return member_groups
else:
return None
Как я уже сказал, аспект ACL, похоже, работает.
Интересно, что если я удалю default_permission из моего init.py
, все будет работать как обычно.
Буду признателен за любые указания относительно того, где я иду не так.