2010-03-15 3 views
2

У меня есть пользователи, которые попадают в следующийКак я могу организовать код полномочий?

  • Не зарегистрированы
  • Не Проверенный
  • Проверенные
  • Модератор
  • Администратор

Весь код, только администратор и модераторы могут доступ (например, запрет) находится в ModeratorUser, который наследует от проверенного, который наследует от BaseUser. Некоторые страницы доступны для всех пользователей, таких как общедоступные профили. Если пользователь вошел в систему, он может оставить комментарий. Чтобы проверить это, я использую if (IsVerifiedUser). Теперь вот проблема. Чтобы избежать проблем, если пользователь заблокирован, он не распознается как проверенный пользователь. Однако в редком случае мне нужно знать, проверен ли он, я могу использовать usertype & Verified.

Должен ли я не делать этого? У меня есть куча кода в классе VerifiedUser, и я нахожу, что я перемещаю его в BaseUser. Является ли это чем-то полезным, потому что пользователь, не зарегистрированный в системе, может получить доступ к этой странице? Должен ли я обращаться с пользователем запрета по-другому и разрешить IsVerifiedUser быть правдой, даже если пользователь запрещен?

+0

Какой код у вас есть в этих классах? Этот код должен быть о пользователе, а не о том, что разрешено делать конкретному пользователю. –

+0

@John Saunders Посмотреть первый комментарий i left jerry – 2010-03-16 04:17:48

+0

@acidzombie: комментарии Джерри показывают, что именно меня беспокоило. У вас есть код, сгруппированный по тому, что пользователь может сделать, вместо того, чтобы группироваться в классы по функциям. Когда правила меняются, вам нужно изменить иерархию классов. Нехорошо. –

ответ

2

По крайней мере, на мой взгляд, большинство ситуаций, подобных этому, должны обрабатываться данными, а не кодом. Жестко-кодирование того факта, что (например) операция X может выполняться только администратором, имеет тенденцию быть относительно хрупкой. Прямо сейчас у вас есть пять классов пользователей, но (например,) вы почти неизбежно (где-то вдоль линии) в конечном итоге изобретаете какой-то другой класс пользователя и должны реорганизовать совсем немного кода для соответствия (например, новый шаг на полпути между модератором и администратором или, возможно, «ограниченный пользователь», который является шагом ниже обычного проверенного пользователя и т. д.). Фактически, вы уже в основном работаете с этим «запрещенным» пользователем, который в основном похож на не проверенным пользователем, но несколькими способами, как проверенный пользователь.

Необходимо переписать код каждый раз, когда вы принимаете решение об изменении, так как это плохая идея. Вместо этого вы должны (вероятно) предварительно определить пять (или, возможно, шесть) групп пользователей и (например) назначить бит каждому. Аналогично, назначьте бит-маску для каждой функции. Чтобы проверить, может ли данный пользователь выполнить данную функцию, вы и эти битмаски вместе, и посмотрите, есть ли у пользователя соответствующие биты, установленные в их маске.

Это значительно упрощает создание новых групп по мере необходимости и/или изменение назначений прав на выполнение определенных функций для групп пользователей. В частности, это позволяет вносить изменения в такие права административно, а не требовать перезаписи кода.

+0

звучит интересно. В большинстве случаев это не «жесткое» кодирование. В качестве примера у меня есть функция отправки электронной почты. Я знаю, что только проверенные пользователи и выше могут это сделать, поэтому я предпочитаю не иметь возможности вызвать функцию (ошибка времени компиляции), если Я непроверенный пользователь. В случае запрета проверенного класса бросает запрещенное исключение, которое прекрасно, потому что при вызове чего-либо в нем есть что-то, чего я не хочу делать, если пользователь запрещен. Вы только что дали мне решение wh Я не могу думать, о котором я даже не думал и не думал. Запрет пользователя между непроверенными и проверенными. (Новые форматирования комментариев) – 2010-03-16 04:12:39

+0

Как будет программировать «отправлять электронную почту» на основе бит-флагов? Я использую, чтобы каждая функция общедоступного бэкэнд проверяла разрешение, чтобы узнать, соответствует ли пользователь. Друг предложил, чтобы было лучше иметь классы, которые бросали исключение и функции, невидимые через наследование (база не может вызывать проверенную функцию == меньше подверженной ошибкам). Вернусь ли я к старому пути, кроме проверки битов вместо usertype? Будет ли у меня еще наследство или один большой класс, как раньше? (с несколькими классами внутри). – 2010-03-16 04:16:54

+0

Отличный ответ btw – 2010-03-16 04:17:10

Смежные вопросы