1+ package Authorization ;
2+ 3+ import AirportSimulatorTwo .DTO .ReadUserDto ;
4+ import jakarta .servlet .*;
5+ import jakarta .servlet .annotation .WebFilter ;
6+ import jakarta .servlet .http .HttpServletRequest ;
7+ import jakarta .servlet .http .HttpServletResponse ;
8+ 9+ import java .io .IOException ;
10+ import java .util .Set ;
11+ 12+ @ WebFilter ("/*" )
13+ public class AuthorizationFilter implements Filter {
14+ /*
15+ Данная переменная определяет список страниц, которые
16+ доступны пользователю без регистрации и аутентификации.
17+
18+ Данная строка используется без интернационализации и локализации:
19+ private static final Set<String> PUBLIC_PATH = Set.of("/login","/registration","/images");
20+
21+ строка ниже применяется для тестирования кода с интернационализацией:
22+ */
23+ private static final Set <String > PUBLIC_PATH = Set .of ("/international_login" ,
24+ "/registration" ,
25+ "/images" ,
26+ "/locale" );
27+ 28+ @ Override
29+ public void doFilter (ServletRequest servletRequest ,
30+ ServletResponse servletResponse ,
31+ FilterChain filterChain ) throws IOException , ServletException {
32+ 33+ String enterUri = ((HttpServletRequest ) servletRequest ).getRequestURI ();
34+ /*
35+ Если страница определена методом *.isPublicPath()
36+ как публичная, или пользователь 'залогинился', то
37+ страница пользователю отобразится.
38+ */
39+ if (isPublicPath (enterUri ) || isUserLoggedIn (servletRequest )) {
40+ /* В случае true в одном из вариантов запрос пройдет по цепочке фильтров */
41+ filterChain .doFilter (servletRequest , servletResponse );
42+ } else {
43+ /*
44+ В случае false запрос будет переброшен либо на предыдущую
45+ страницу (т.е. ту откуда пришел запрос), либо на страницу
46+ где будет предложено 'залогинится'.
47+
48+ Хедер 'referer' говорит нам с какой страницы пришел пользователь.
49+ */
50+ String prevPage = ((HttpServletRequest ) servletRequest ).getHeader ("referer" );
51+ ((HttpServletResponse ) servletResponse ).sendRedirect (prevPage != null ? prevPage : "/international_login" );
52+ /*
53+ В случае тестирования настроек без интернационализации и локализации применять текущую строку:
54+ ((HttpServletResponse) servletResponse).sendRedirect(prevPage != null ? prevPage : "/login");
55+ */
56+ }
57+ }
58+ /* Проверяем 'залогинился' ли пользователь */
59+ private boolean isUserLoggedIn (ServletRequest servletRequest ) {
60+ ReadUserDto loginUser = (ReadUserDto ) ((HttpServletRequest ) servletRequest ).
61+ getSession ().
62+ getAttribute ("user" );
63+ /*
64+ Можно усилить фильтрацию (аутентификацию) используя параметр Role:
65+ return loginUser != null && loginUser.getRole() == Role.ADMIN;
66+ и т.п.
67+ */
68+ return loginUser != null ;
69+ }
70+ /*
71+ Метод возвращающий true если запрошенная пользователем страница
72+ доступна без специального разрешения т.е. задана в переменной
73+ (в поле) PUBLIC_PATH как публичная.
74+ */
75+ private boolean isPublicPath (String enterUri ) {
76+ return PUBLIC_PATH .stream ().anyMatch (path -> enterUri .startsWith (path ));
77+ }
78+ }
0 commit comments