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