Лучшее место, чтобы проверить, заблокирован ли пользователь другим - PullRequest
0 голосов
/ 16 марта 2012

Если я хочу представить концепцию заблокированных пользователей, где наиболее подходящее место, чтобы выполнить проверку, если пользователь заблокирован, не нарушая принципы хорошего дизайна?

До сих пор я использовал Spring Security, чтобы комментировать методы контроллера о том, есть ли у конкретного пользователя разрешения на выполнение определенного действия. С этим заблокированным пользователем все становится немного сложнее. Должен ли я попытаться установить это снова в контроллере (возможно, снова с помощью безопасности Spring) или это то, что я должен позволить доменному объекту решать самому?

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

1 Ответ

1 голос
/ 16 марта 2012

Одним из подходов может быть введение роли, называемой «BLOCKED», назначение ее всем пользователям, когда они заблокированы, и аннотирование всех методов, которые не позволяют заблокированным пользователям получать к ним доступ:

@PreAuthorize("!hasRole('BLOCKED')")
public void secureMethod();

Другим подходом будет сохранение заблокированного статуса в пользовательской базе данных или в каком-либо другом хранилище. Затем расширьте UserDetailsService , чтобы получить дополнительную информацию о пользователе, включая флаг «заблокирован». И снова используйте защитный EL для фильтрации методов, которые не позволяют заблокированным пользователям выполнять их:

@PreAuthorize("!principal.blocked")
public void secureMethod();

ОБНОВЛЕНИЕ :

К проблеме, о которой вы упоминали в комментариях, можно подходить аналогичным образом:

@PreAuthorize("!#photo.owner.blockedUsers.contains(principal.name)")
public void likePhoto(Photo photo);

Для более сложных и / или общих правил я бы посоветовал использовать аспекты АОП, чтобы сохранить ваш код в чистоте от слишком большого числа ifs.

...