Как обрабатывать аутентифицированный доступ пользователей к ресурсам в системе, ориентированной на документы?

Я разрабатываю приложение, ориентированное на документы, и мне нужно управлять доступом пользователей к документам. У меня есть модуль, который обрабатывает аутентификацию пользователей, и еще один модуль, который обрабатывает операции CRUD с документами в хранилище данных. После аутентификации пользователя мне нужно указать, какие операции пользователь может и не может выполнять с документами на основе разрешений пользователя. Лучший вариант, который я мог бы придумать для объединения этих двух частей, — это создать еще один модуль, который дублирует API данных, но также принимает аутентифицированного пользователя в качестве параметра. Модуль делегирует проверку авторизации модулю аутентификации и делегирует операцию с документом модулю доступа к данным. Что-то типа:

 -module(auth_data_access).

 % User is authenticated (logged into the system)
 % save_doc validates if user is allowed to save the given document and if so
 % saves it returning ok, else returns {error, permission_denied}
 save_doc(Doc, User) ->
    case auth:save_allowed(Doc, User) of
       ok ->
          data_access:save_doc(Doc);
       denied ->
          {error, permission_denied}
     end
  end. 

Есть ли лучший способ справиться с этим?


person Jeremy Raymond    schedule 12.01.2010    source источник
comment
Способ, который вы демонстрируете выше, кажется мне вполне приемлемым.   -  person Jeremy Wall    schedule 12.01.2010
comment
Ваша обработка ошибок кажется непоследовательной. Вы помещаете auth:save_allowed в оператор case, но допускаете сбой data_access:save_doc при ошибке.   -  person Zed    schedule 12.01.2010
comment
Это не был фактический образец кода, просто пример. Но вы правы, это непоследовательно и должно быть исправлено.   -  person Jeremy Raymond    schedule 13.01.2010


Ответы (1)


Согласно моему ответу на вопрос "Как элегантно проверить много условий в Erlang" я предпочитаю что-то вроде

save_doc(Doc, User) ->
    ok = auth:save_allowed(Doc, User),
    data_access:save_doc(Doc).
person Hynek -Pichi- Vychodil    schedule 13.01.2010
comment
Это выглядит чище, чем пример кода в вопросах, но не отвечает, есть ли лучший общий способ проверки/применения авторизации. - person Jeremy Raymond; 13.01.2010