Части кода:
Угловой:
Перехватчик:
Код: Выделить всё
export const tokenInterceptor: HttpInterceptorFn = (req, next) => {
const authService = inject(AuthService);
if(authService.getToken()) {
const cloned = req.clone({
headers: req.headers.set('Authorization', 'Bearer ' + authService.getToken())
});
console.log('Headers: ', cloned.headers);
return next(cloned);
}
return next(req);
};
Код: Выделить всё
export class AccountComponent {
authService = inject(AuthService);
accountDetail$ = this.authService.getDetail();
}
Код: Выделить всё
login(data: LoginRequest): Observable{
var value = this.http.post(`${this.apiUrl}login`,data);
return value.pipe(
map((response) => {
if(response.success){
localStorage.setItem(this.tokenKey, response.token);
}
return response;
})
);
}
logout = (): void => {
localStorage.removeItem(this.tokenKey);
};
getDetail = (): Observable => {
return this.http.get(`${this.apiUrl}api/detail/1`);
}
Код: Выделить всё
export const appConfig: ApplicationConfig = {
providers: [provideRouter(routes), provideAnimationsAsync(), provideHttpClient(withInterceptors([tokenInterceptor]))]
};
Фильтр:
Код: Выделить всё
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http.csrf(AbstractHttpConfigurer::disable).cors(AbstractHttpConfigurer::disable).authorizeHttpRequests(
//ahr -> ahr.requestMatchers("/login", "/signup", "/signup/roles").permitAll().requestMatchers("/api/detail/1").authenticated())
ahr -> ahr.requestMatchers("/login", "/signup", "/signup/roles", "/api/detail/1").permitAll())
.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
Код: Выделить всё
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String authHeader = request.getHeader("authorization");
String token = null;
String username = null;
Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
System.out.println("Header " + headerName+": ");
var headers = request.getHeaders(headerName);
while (headers.hasMoreElements()) {
String headerValue = headers.nextElement();
System.out.println(headerValue);
}
}
if (Objects.nonNull(authHeader) && authHeader.startsWith("Bearer ")) {
token = authHeader.substring(7);
username = jwtUtil.extractUsername(token);
}
...
Этап 1:
< ul>
[*]В активной строке Java-фильтра:
Код: Выделить всё
ahr -> ahr.requestMatchers("/login", "/signup", "/signup/roles").permitAll().requestMatchers("/api/detail/1").authenticated())
- После входа в систему я вижу токен в локальном хранилище
- Когда я перехожу к деталям, я получаю сообщение об ошибке: «CORS Missing Allow Origin» — и я не получил «аутентификацию» заголовка — я вижу это в распечатках серверной части, поэтому это правильное поведение серверной части;
- Я выхожу из внешнего интерфейса -> localStorage пуст
- В активной строке Java-фильтра:
Код: Выделить всё
ahr -> ahr.requestMatchers("/login", "/signup", "/signup/roles", "/api/detail/1").permitAll())
- После входа в систему я вижу токен в локальном хранилище
- Когда я перехожу к деталям, я вижу подробности, а также вижу заголовок «аутентификация» в журналах серверной части
- Я выхожу из системы во внешнем интерфейсе -> localStorage пуст
- В фильтре Java снова активна строка:
Код: Выделить всё
ahr -> ahr.requestMatchers("/login", "/signup", "/signup/roles").permitAll().requestMatchers("/api/detail/1").authenticated())
- После входа в систему я вижу токен в локальном хранилище
- Я перехожу к деталям и... Я вижу детали и вижу заголовок «аутентификация» в журналах серверной части!?
- Теперь, когда я выхожу из системы и снова вхожу в систему или закрываю и снова открываю браузер, я все равно вижу детали, но если сначала я выхожу из системы, а затем закрываю браузер, то после входа в систему я получаю сообщение об ошибке.
Проверил серверную часть с помощью Postman - вроде работает, в том числе и с аутентификацией.
Подробнее здесь: https://stackoverflow.com/questions/792 ... va-backend