Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 88d84f9

Browse files
Added Authorization folder in the MVCPracticeAdvanced section of a small course on Java EE
1 parent 1761ca8 commit 88d84f9

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /