web2py: ограничить доступ пользователя только к строкам, созданным пользователем

#python #web2py

#python #web2py

Вопрос:

Я хотел бы ограничить пользователей только созданными ими записями в базе данных. Есть ли у них какой-либо стандартный способ web2py сделать это? auth.requires_permission выглядел хорошо, но, похоже, для него требуется жестко запрограммированный идентификатор строки, что не решает мою проблему.

Ответ №1:

Это не должно обрабатываться web2py. Предполагается, что ваша база данных обрабатывает пользовательские разрешения для этого, поэтому вам нужно будет посмотреть в документации для используемого вами бэкэнда db.

Кроме того, если у каждого есть отдельная учетная запись пользователя на вашем интерфейсе, все они подключаются к одному пользователю базы данных, тогда вы вообще не сможете контролировать разрешения без набора независимого кода «безопасности», добавленного поверх вашей базы данных и вокруг нее. Например, таблица в базе данных, которая просматривает поле, предоставленное web2py при подключении, чтобы определить «пользователя», а затем соответствующим образом установить привилегии, закодированные вручную. У баз данных есть пользователи именно по этой причине.

Комментарии:

1. Django имеет управление доступом на основе объектов / строк.

Ответ №2:

Вы можете сделать это с помощью CRUD

http://web2py.com/book/default/chapter/08#Authorization-and-CRUD

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

Ответ №3:

Добавьте поле ‘created_by’ в базу данных. Вставьте идентификатор пользователя при вставке записи. Используйте это для фильтрации при выборе.

Ответ №4:

Возможно, попробовать обычные фильтры: http://web2py.com/books/default/chapter/29/06?search=common filter#Common-filters

 db.some_table._common_filter = lambda query: db.some_table.created_by == auth.user.id
  

Ответ №5:

Используйте обратный вызов функции delete и верните True, если пользователь не создавал строку.

 db.some_table._bedfore_delete = lambda query: False if db.some_table.created_by == auth.user_id else True
  

Комментарии:

1. Определенно хотелось бы увидеть систему, похожую на Django в этом