Статья опубликована в рамках: XXI Международной научно-практической конференции «Научное сообщество студентов: МЕЖДИСЦИПЛИНАРНЫЕ ИССЛЕДОВАНИЯ» (Россия, г. Новосибирск, 18 мая 2017 г.)
Наука: Информационные технологии
Скачать книгу(-и): Сборник статей конференции
дипломов
ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ ДОСТУПА К ДАННЫМ В WEB-ПРИЛОЖЕНИЯХ, РАЗРАБОТАННЫХ НА ОСНОВЕ SPRINGFRAMEWORK
Вопрос безопасности важен в приложениях, в которых предусматривается несколько ролей пользователей с разными пулами возможностей. В таких приложениях возникают ситуации, когда пользователям, обладающим ролью только из определенного набора ролей, нужно предоставить доступ к определенной функциональности. Остальным пользователям необходимо отказать в доступе. В web-приложениях очень важно предусматривать возможность подмены параметров в url-запросах. Подобные случаи разрешаются не логикой ограничения доступности определенных url-адресов, а внутренней логикой приложения. Качественно разработанное с точки зрения безопасности приложение не должно позволять посторонним лицам получать доступ к непредназначенному для них функционалу.
Для обеспечения безопасности в приложениях, разработанных на основе SpringFramework существует компонент SpringSecurity. Данный компонент предоставляет механизмы построения систем аутентификации и авторизации, а также другие возможности обеспечения безопасности для приложений, созданных с помощью SpringFramework. Для конфигурирования настроек безопасности используется файл securityContext.xml. Данный файл располагается в папке webapp/WEB-INF/spring вместе с файлом applicationContext.xml, конфигурирующим приложение.
Безопасность в системе на программном уровне осуществляется на 2 уровнях:
- При помощи фиксирования доступности определенных url-паттернов пользователям с определенными ролями в системе;
- При помощи использования директив для методов PreAuthorize.
В файл securityContext.xml необходимо добавить секцию security:http, в которой можно задавать доступность того или иного url-паттерна. Под url-паттернами подразумеваются регулярные выражения семейств url-запросов. Доступность url-паттернов задается путем добавления строки вида: <security:intercept-urlpattern="<url-паттерн>" access="<логическое выражение>"/>. [1]
Если логическое выражение ложно, то текущему пользователю запрещено просматривать web-страницу, доступную по url-адресу, соответствующему данному url-паттерну. Иначе - разрешено. Класс SecurityExpressionRoot из пространства имен org.springframework.security.access.expression предоставляет набор статических методов, возвращающих логическое значение, которые можно использовать при конфигурировании доступности url-паттернов. Наиболее используемые статические методы из класса SecurityExpressionRoot:
- permitAll – метод, возвращающий логическое значение, характеризующее, разрешен ли просмотр web-страницы, доступной по url-адресу, соответствующему данному url-паттерну, всем пользователям;
- denyAll - метод, возвращающий логическое значение, характеризующее, запрещен ли просмотр web-страницы, доступной по url-адресу, соответствующему данному url-паттерну, всем пользователям;
- isAnonymous - метод, возвращающий логическое значение, характеризующее, разрешен ли просмотр web-страницы, доступной по url-адресу, соответствующему данному url-паттерну, всем пользователям, не осуществившим вход в систему;
- hasRole - метод, принимающий в качестве параметра системное имя роли и возвращающий логическое значение, характеризующее, разрешен ли просмотр web-страницы, доступной по url-адресу, соответствующему данному url-паттерну, всем пользователям, имеющим роль, системное имя которой соответствует переданному в метод параметру;
- hasAnyRole - метод, принимающий в качестве параметра список системных имен роли и возвращающий логическое значение, характеризующее, разрешен ли просмотр web-страницы, доступной по url-адресу, соответствующему данному url-паттерну, всем пользователям, имеющим одну из ролей с системным именем из списка параметров метода.
Класс директивы PreAuthorize находится в пространстве имен org.springframework.security.access.prepost и позволяет отменить выполнение тела метода, если условие, передаваемое в качестве параметра директивы, ложно. [2, c. 656]
Для реализации более сложной логики ограничений доступа к web-страницам необходимо создать иерархию классов, изображенную на диаграмме классов на рисунке 1.
Все классы для ограничений реализуют интерфейс Permission. В интерфейсе объявлен один метод isAllowed, возвращающий логическое значение, характеризующее разрешен ли пользователю доступ к функционалу или нет. В классе PermissionResolver реализован метод hasPermission, который можно использовать в директиве PreAuthorize. Этот метод принимает 2 параметра: список параметров метода, к которому предоставляется доступ и строковый псевдоним ограничения. Пары «псевдоним ограничения – класс» фиксируются в файле securityContext.xml. Стоит отметить, что имя класса в данных парах должно начинаться с прописной буквы, а не с заглавной как это принято в именах классов с точки зрения языка программирования. Класс PermissionResolver имеет поле permissionNameToPermissionMap, которое является программным отображением пар «псевдоним ограничения – класс». Метод hasPermission возвращает итог выполнения метода isAllowed одного из классов, реализующих интерфейс Permission. Метод, к которому применяется директива будет выполняться только в том случае, если результат выполнения данного метода будет истинным. Пример использования директивы: @PreAuthorize("isAuthenticated() and hasPermission(#params, 'permissionAlias')"), при условии, что псевдоним «permissionAlias» в файле securityContext.xml ссылается на один из классов, реализующих интерфейс Permission.
Рисунок 1. Диаграмма классов, обеспечивающих безопасность доступа к данным
Список литературы:
- Spring MVC и Spring Security. Пример настройки страницы логина, настройка ролей [электронный ресурс] – Режим доступа - URL: http://javastudy.ru/spring-mvc/security/ (дата обращения 12.05.2017)
- Хо К. Spring 3 для профессионалов / К. Хо. – М.: ООО «И.Д. Вильямс», 2013 г. – 880 с.
дипломов
Оставить комментарий