FastNetMon

Показаны сообщения с ярлыком AuthKit. Показать все сообщения
Показаны сообщения с ярлыком AuthKit. Показать все сообщения

воскресенье, 14 марта 2010 г.

Pylons: авторизация посредством AuthKit

Задачу с проверкой логина и пароля мы решили в прошлый раз, теперь хотелось бы в зависимости от логина пользователя давать или не давать ему доступ к определенным контроллерам. Действовать мы будем по мануалу: http://pylonsbook.com/en/1.1/authentication-and-authorization.html#the-authorization-decorator

Теперь открываем наш контроллер:
vi myapp/controllers/main.py


И в блок import ов добавляем следующее:

from authkit.authorize.pylons_adaptors import authorize
from authkit.permissions import RemoteUser, ValidAuthKitUser, UserIn


Теперь мы можем переписать контроллер private в более простом виде :
@authorize(RemoteUser())
def private(self):
return "You are authenticated!"


То есть в декораторе идет проверка является ли юзер залогиненым (установлено ли REMOTE_USER) и только после этого выполняет код метода. При этом в книге по Pylons крайне рекомендуется использовать ValidAuthKitUser() вместо RemoteUser(), так как второй просто проверяет не пустоту поля REMOTE_USER, но не убеждается, что это явно разрешенный в конфиге юзер. Как понимаете, ValidAuthKitUser более безопасен.

Теперь создадим контроллер, который будет доступен только пользователю admin2:

@authorize(UserIn(['admin2']))
def private2(self):
return "You are admin2!"


И если же попытаться войти на эту страницу от имени admin, то в ответ мы получим "403 Forbidden".

Кроме подключения авторизации через декораторы возможно ее использование как Middleware, подробно это описано вот здесь: http://pylonsbook.com/en/1.1/authentication-and-authorization.html#the-authorization-middleware

А вот так вот можно закрыть весь контроллер сразу (я крайне долго искал подобную фичу в Catalyst, но не нашел):

@authorize(ValidAuthKitUser())
def __before__(self):
pass


Ну вот, пожалуй, и хватит с авторизацией. Но замечу, что кроме описанных фич у AuthKit есть еще очень много всего вкусного, например, группы пользователей / роли (то есть можно гранулировано выдавать полномочия на те или иные подсистемы разным юзерам) / разрешения / поддержка OpenID а также искаробочная возможность привязывать юзеров только к определенным IP.

Pylons: аутентификация посредством AuthKit

Есть вот такая отличная библиотека для всего, что только можно вытворить с авторизацией / аутентификацией в веб-приложении (поддерживаются HTTP basic, HTTP digest, form, cookie OpenID ит.д.) http://authkit.org/. Также на офсайте AuthKit явно указано, что с Pylons он работает ну просто супер :) Вот ее мы и будем подключать, хотя есть еще аналоги в лице http://what.repoze.org/docs/1.0/ и http://static.repoze.org/whodocs/ При этом руководствоваться мы будем вот этой инструкцией: http://pylonsbook.com/en/1.1/authentication-and-authorization.html Также в случае проблем с пониманием "куда вставить этот код" использовалась вот эта сборочка: http://pypi.python.org/pypi/SimpleSite/0.3.0

Настроим аутентификацию (просто проверка логина/пароля без контроля прав доступа к различным ресурсам).

Устанавливаем:
easy_install authkit


Открываем конфигурацию middleware:
vi myapp/config/middleware.py


Добавляем в самый верх, в блок import:
import authkit.authenticate


Также ПЕРЕД блоком:

# Display error documents for 401, 403, 404 status codes (and
# 500 when debug is disabled)
if asbool(config['debug']):
app = StatusCodeRedirect(app)
else:
app = StatusCodeRedirect(app, [400, 401, 403, 404, 500])



С аналогичным отступом добавляем подключение auth middleware:

app = authkit.authenticate.middleware(app, app_conf)


Теперь нам необходимо сконфигурировать AuthKit:
vi development.ini


И в самый низ блока "[app:main]" добавляем следующее:

authkit.setup.method = form, cookie
authkit.form.authenticate.user.data = admin:qwerty
[без выравнивания по = раб. не будут ]admin2:qwerty2
authkit.cookie.secret = secret string
authkit.cookie.signoutpath = /main/signout


Таким образом мы создали одного пользователя и выбрали тип аутентификации - формы/куки, а также выбрали метод, при вызове которого будет происходить logout.

Теперь открываем наш контроллер:

vi myapp/controllers/main.py


После этого создаем там методы:

def private(self):
if request.environ.get("REMOTE_USER"):
return "You are authenticated as %s!" % request.environ.get("REMOTE_USER")
else:
response.status = "401 Not authenticated"
return "You are not authenticated"
def signout(self):
return "Successfully signed out!"


И пробуем открыть его через сеть: http://xx.xx.xx.xx:5000/main/private и там нам будет выдана форма, введя в которую admin/qwerty мы станем аутентифицированным пользователем. Проверка статус аутентификации проверяется по логину, который в случае успешной аутентификации помещается в request.environ.get("REMOTE_USER"). Чтобы "вылогиниться" нам необходимо просто посетить адрес http://xx.xx.xx.xx:5000/main/signout при этом куки файл, хранящий данные о залогинености будет удален.

Все, с аутентификацией закончено :)