Недавно я пытаюсь узнать Весну. Я создал простой веб-приложение, которое в основном должны иметь 2 типа пользователей:Spring MVC - Spring Security - Контроллеры Общая архитектура - Лучшие практики
- клиентов
- Админ
Вы можете представить себе приложение как классический торговый веб-приложение, где администраторы имеют привилегии, чтобы добавить новые предметы, а клиенты могут видеть перечисленные элементы и добавлять их в свои тележки. Теперь мой вопрос о общей архитектуре системы, который должен быть одним из примеров лучшей практики Spring Framework.
Я могу перечислить здесь пункты об этом архитектурных решениях, и вы можете сказать, будете ли вы сделать это по-другому:
1- У меня есть 2 разных диспетчерские сервлет. Таким образом, ссылки под публикой будут для клиентов, а администратор будет для админов.
<servlet-mapping>
<servlet-name>public-dispatcher</servlet-name>
<url-pattern>/public/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>admin-dispatcher</servlet-name>
<url-pattern>/admin/*</url-pattern>
</servlet-mapping>
2- Весной-security.xml у меня есть для аутентификации администратора, как это:
<intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
(Все действия в рамках URL/администратор/будет защищен паролем)
3- У каждого сервлета есть viewResolver, указывающий на другую папку, содержащую jsps:
/WEB-INF/admin-jsp/ (admin jsps)
/WEB-INF/public-jsp/ (customer jsps)
4- Допустим, у меня есть эти Объекты Домена: Товар, ShoppingCart, Клиент и т. Д. Для каждого объекта домена у меня есть ОДИН класс контроллера i.e ItemController, который обрабатывает целые запросы (клиенты и администраторы) об элементе.
@Controller
@RequestMapping("/item")
@SessionAttributes({"cart"})
public class ItemController { ...
Каждое из этих решений имеет смысл, когда я думаю о них один за другим. Но на самом деле ясно, что, поскольку я не видел никакого большого приложения Spring (интернет содержит множество небольших частей кода, которые не дают представления о целом), здесь что-то не так.
Для экземпляра: Я могу назвать этот url как client/public/item/addNewItem (который на самом деле существует для админов), и метод будет выполнен, поскольку ItemController (/ item) доступен для всех. Но так как у меня есть jsps в двух разных местах, весна будет вызывать ошибку, которой вид не существует. Аналогично администратору, когда я могу позвонить URL/admin/item/addToCart ....
Что такое лучшая арка. реализации целого? Должен ли я определить еще несколько URL-адресов в конфигурации безопасности? Например:
<intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
<intercept-url pattern="/admin/addNewItem" access="ROLE_ADMIN" />
ИЛИ
Если я определил различные контроллеры для различных ролей?
@RequestMapping("/public/item")
@SessionAttributes({"cart"})
public class PublicItemController { ...
@RequestMapping("/admin/item")
public class AdminItemController { ...
ИЛИ
Любой другой путь? Как это сделать в большой системе, где есть множество ролей, контроллеров и т. Д.
Спасибо. 4. точка на самом деле больше о объекте класса контроллера pro Domain Object, чем настройка на основе аннотации;) – akcasoy
Ах, ОК. В этом случае у меня, вероятно, были бы отдельные контроллеры для контроллеров admin и public item. – ashario