powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Проверка уровня доступа
5 сообщений из 5, страница 1 из 1
Java Проверка уровня доступа
    #38025390
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжаю свои разбирательства со Spring, но пока что не хочу использовать Spring Security в нашем проекте.

Хочу так сказать, пока что по-простому всё сделать.

Код: sql
1.
Задача: Сделать разграничение доступа и валидацию доступа к конкретным страницам.



Итак, допустим у меня есть два контроллера:

PublicPage.java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Controller
public class PublicPage {
...
    @RequestMapping(
       value = "/public",
       method = RequestMethod.GET
    )
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throw Exception {
    ...
    }
}



и SecretPage.java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Controller
public class SecretPage {
...
    @RequestMapping(
       value = "/secret",
       method = RequestMethod.GET
    )
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throw Exception {
    ...
    }
}



Ок. Контроллеры ловят запросы, их обрабатывают, все ок. Теперь нужно добавить проверку доступа.
Решил сделать интерфейс AccessControlStrategy , который выглядит вот так:

Код: java
1.
2.
3.
public interface AccessControlStrategy {
    public boolean isAccessible();
}



Идея в том, что если некий объект реализет этот интерфейс, то он должен возвращать true, если объект доступен, и false, если объект не доступен.

Далее делаю абстрактный класс WebAccessControlStrategy :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public abstract class WebAccessControlStrategy implements AccessControlStrategy {
    private HttpServletRequest httpServletRequest;
    private HttpServletResponse httpServletResponse;

    public WebAccessControlStrategy(HttpServletRequest request, HttpServletResponse response) {
        this.httpServletRequest = request;
        this.httpServletResponse = response;
    }

    protected HttpServletRequest getHttpServletRequest() {
        return httpServletRequest;
    }

    protected HttpServletResponse getHttpServletResponse() {
        return httpServletResponse;
    }

    protected HttpSession getHttpSession() {
        return getHttpServletRequest().getSession();
    }
}



и теперь определяем два типа доступа:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
/**
 * Определяем стратегию проверки доступа: Объект доступен, если есть пользователь в сессии
 */
public class UserAccessControlStrategy extends WebAccessControlStrategy {
    public UserAccessControlStrategy(HttpServletRequest request, HttpServletResponse response) {
        super(request, response);
    }

    @Override
    public boolean isAccessible() {
        return getHttpSession().getAttribute("user") != null;
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
/**
 * Определяем стратегию проверки доступа: Объект доступен всем
 */
public class PublicAccessControlStrategy extends WebAccessControlStrategy {
    public PublicAccessControlStrategy(HttpServletRequest request, HttpServletResponse response) {
        super(request, response);
    }

    @Override
    public boolean isAccessible() {
        return true;
    }
}



Вроде всё выглядит неплохо. Меняем контроллеры:

PublicPage.java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
@Controller
public class PublicPage {
...
    @RequestMapping(
       value = "/public",
       method = RequestMethod.GET
    )
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throw Exception {
        // Определяем стратегию проверки доступа
        AccessControlStrategy accessControlStrategy = new PublicAccessControlStrategy(request, response);
   
        // Проверяем, если что не так, то выбрасываем исключение
        if (!accessControlStrategy.isAccessible()) {
            throw new AccessDeniedException(...);
        }

    ...
    }
}



и SecretPage.java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
@Controller
public class SecretPage {
...
    @RequestMapping(
       value = "/secret",
       method = RequestMethod.GET
    )
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throw Exception {
        // Определяем стратегию проверки доступа
        AccessControlStrategy accessControlStrategy = new UserAccessControlStrategy(request, response);
   
        // Проверяем, если что не так, то выбрасываем исключение
        if (!accessControlStrategy.isAccessible()) {
            throw new AccessDeniedException(...);
        }
    ...
    }
}



Но вот нормален ли такой подход? В чем могут быть потенциальные грабли?
...
Рейтинг: 0 / 0
Java Проверка уровня доступа
    #38025443
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaksНо вот нормален ли такой подход? В чем могут быть потенциальные грабли?
ненормален, т.к. сначала не пишут своё, а делают обзор готового.
Причём, я совсем не про спринг. Или так....спринг, как _один из_ готового.
...
Рейтинг: 0 / 0
Java Проверка уровня доступа
    #38025491
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Ну я же в академических целях.

Знаю, что есть готовые компоненты. Но хочу так сказать сделать что-то очень простое и работающее, без дополнительных библиотек.
...
Рейтинг: 0 / 0
Java Проверка уровня доступа
    #38025496
organism
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaksНо вот нормален ли такой подход? В чем могут быть потенциальные грабли?

Во-первых, я бы вынес инстанцирование вашей конкретной стратегии из акшенов контроллера. Спринг он IoC контейнер, поэтому явное указание стратегии лучше вынести на уровень внедрения зависимостей.
Во-вторых, вместо "размазывания" логики проверки по всем экшенам всех контроллеров, лучше посмотреть в сторону интерцепторов и сделать проверку в одном месте, чем определять её в каждом экшене. Кстати, такой подход встречается в вумных книжках, и называют его защитой "для бедных".
В-третьих, почему "для бедных"? Потому что в этих вумных книжках рекомендуют использовать для целей аутентификации и авторизации Spring Security. Это не так сложно, как кажется.
...
Рейтинг: 0 / 0
Java Проверка уровня доступа
    #38025570
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaks,
в академических целях тоже делают обзор и поиск
http://www.sql.ru/forum/actualthread.aspx?tid=492719

а так, чем ближе к БД - тем лучше. Т.е. фильтры, и organism написал - интерцепторы
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Проверка уровня доступа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]