Spring Проверка загрузки isHttpOnly cookie не работаетJquery

Программирование на jquery
Ответить
Anonymous
 Spring Проверка загрузки isHttpOnly cookie не работает

Сообщение Anonymous »

Я храню свой токен аутентификации в файле cookie, предназначенном только для http. Когда пользователь входит в систему, будет установлен http-cookie, содержащий токен. Вот код для обработки входа:

Код: Выделить всё

@PostMapping("/processlogin")
@ResponseBody
public ResponseEntity processLogin(
@RequestBody SigninDataDto signinDataDto,
HttpServletResponse response
) {
if(signinDataDto.getUserName()!=null && signinDataDto.getPassword()!=null) {
String userName = signinDataDto.getUserName();
String password = Common.sha256Hash(signinDataDto.getPassword());
boolean rememberMe = signinDataDto.isRememberMe();
UserDetails customUserDetails = new UserService(userRepository).loadUserByUsername(userName);
if(password.equals(customUserDetails.getPassword())) {
//Authenticate by cookie
Cookie jwtCookie = new Cookie(Constants.JWT_NAME, jwtService.generateToken((CustomUserDetails) customUserDetails));
if(rememberMe) {
jwtCookie.setMaxAge(7*24*60*60);
}
jwtCookie.setPath("/");
jwtCookie.setHttpOnly(true);
response.addCookie(jwtCookie);
return ResponseEntity.ok("success");
}
}
log.error("Login failed!");
return ResponseEntity.badRequest().body("failed");
}
Затем я создал фильтр для аутентификации каждого запроса, получая файл cookie токена и проверяя его. Вот код фильтра:

Код: Выделить всё

package com.springdemo.library.security;

import com.springdemo.library.services.JwtService;
import com.springdemo.library.services.UserService;
import com.springdemo.library.utils.Common;
import com.springdemo.library.utils.Constants;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;

@Slf4j
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Autowired
private JwtService jwtService;
@Autowired
private UserService customUserDetailsService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
String jwt = getJwt(request);

if (StringUtils.hasText(jwt) && jwtService.validateToken(jwt)) {
String userName = jwtService.getUserNameFromJWT(jwt);
UserDetails userDetails = customUserDetailsService.loadUserByUsername(userName);
if(userDetails != null) {
UsernamePasswordAuthenticationToken
authentication = new UsernamePasswordAuthenticationToken(userDetails, null,
userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));

SecurityContextHolder.getContext().setAuthentication(authentication);
} else {
response.sendRedirect("/login");
}
}
} catch (Exception ex) {
log.error("failed on set user authentication", ex);
}

filterChain.doFilter(request, response);
}

private String getJwt(HttpServletRequest request) {
Cookie cookie = Common.getCookie(request, Constants.JWT_NAME);
if(cookie!=null) {
String token = cookie.getValue();
if(StringUtils.hasText(token)) {
return token;
}
}
return null;
}
}
Конфигурация безопасности:

Код: Выделить всё

@Bean
protected SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf(AbstractHttpConfigurer::disable)
.authorizeRequests(authorizeRequests ->
authorizeRequests
.requestMatchers("/login", "/processlogin").permitAll()
.anyRequest().authenticated()
);
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
return http.build();
}
Это работает нормально, если в фильтре я не проверяю isHttpOnly для файла cookie jwt, но если я это сделаю, браузер откажет в доступе к /Library/home. Может ли кто-нибудь объяснить, почему фильтр не может проверить isHttpOnly для файла cookie jwt, хотя я установил для файла cookie значение HttpOnly? И есть ли способ проверить, является ли файл cookie HttpOnly в Java/Spring Boot?
Вот код JavaScript, который я использовал для входа в систему

Код: Выделить всё

$('document').ready(function () {
$('#id-form-login').on('submit', function (e) {
e.preventDefault();
$.ajax({
url: '/Library/processlogin',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify({
userName: $("#login-username").val(),
password: $("#login-password").val(),
rememberMe: $("#rememberme").prop("checked")
}),
success: function () {
window.location.replace("/Library/home");
},
error: function (jqXHR, textStatus, errorThrown) {
console.warn('Error:', textStatus, errorThrown);
}
});
});
});
Ценим всех, кто помогает

Подробнее здесь: https://stackoverflow.com/questions/785 ... ot-working
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Jquery»