Конфигурация безопасности миграции Spring 3/6 с настраиваемым фильтром/токеном/провайдером — проблемы, сохраняющиеся у пJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Конфигурация безопасности миграции Spring 3/6 с настраиваемым фильтром/токеном/провайдером — проблемы, сохраняющиеся у п

Сообщение Anonymous »

У меня возникли некоторые проблемы после миграции с Spring 5 -> 6 (Spring Boot 3.3.4). Я могу войти на свой сайт, но последующие вызовы, запрашивающие поставщика, не работают (пользователь возвращает значение null, скажем, в следующем коде ниже из нашего AuthenticationController):

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

@RequestMapping(value = "/user", method = RequestMethod.GET)
public UserResponse user(Principal user) {
UserResponse response = new UserResponse();
response.setCode(CODE_SUCCESS);
response.setStatus(SUCCESS_STATUS);
response.setData(user);
return response;
}
Я подозреваю, что виновником является SecurityConfig, который претерпел множество изменений с Spring 5 по Spring 6, самое главное, я думаю, код вокруг .addFilterBefore(authenticationFilter(authenticationManager(http)), UsernamePasswordAuthenticationFilter .class) и компоненты AuthenticationFilter и AuthenticationManager являются наиболее важными здесь и претерпели наибольшее количество изменений со времен переопределений конфигурации Spring 5:

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

@Configuration
@EnableWebSecurity(debug = true)
public class XYZLibrarySecurityConfig {

private final XYZLibraryAuthenticationProvider authProvider;
private final XYZLibraryConfig properties;

public XYZLibrarySecurityConfig(@Lazy XYZLibraryAuthenticationProvider authProvider, XYZLibraryConfig properties) {
this.authProvider = authProvider;
this.properties = properties;
}

@Bean
public XYZLibraryAuthenticationFilter authenticationFilter(AuthenticationManager authenticationManager) {
XYZLibraryAuthenticationFilter filter = new XYZLibraryAuthenticationFilter();
filter.setAuthenticationManager(authenticationManager);
filter.setAuthenticationSuccessHandler(authenticationSuccessHandler());
filter.setAuthenticationFailureHandler(authenticationFailureHandler());
filter.setSessionAuthenticationStrategy(authStrategy());

return filter;
}

@Bean
public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
authenticationManagerBuilder.authenticationProvider(authProvider);
return authenticationManagerBuilder.build();
}

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authenticationProvider(authProvider)
.addFilterBefore(authenticationFilter(authenticationManager(http)), UsernamePasswordAuthenticationFilter.class)
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
.exceptionHandling(exceptionHandling -> exceptionHandling.authenticationEntryPoint(authenticationEntryPoint()))
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/rest/authentication/authenticate").permitAll()
.requestMatchers("/rest/authentication/user").permitAll()
.requestMatchers("/rest/authentication/forgotPassword").permitAll()
.requestMatchers("/rest/authentication/changePassword").permitAll()
.requestMatchers("/rest/authentication/passwordRules").permitAll()
.requestMatchers("/rest/authentication/helpContact").permitAll()
.requestMatchers("/rest/authentication/user-message").denyAll()
.requestMatchers("/rest/system-check/check").permitAll()
.requestMatchers("/rest/admin/**").hasAnyRole("Administrator", "XYZ Complete Editor")
.requestMatchers("/rest/**").hasAnyRole("User", "Administrator", "XYZ Limited User", "XYZ Limited Submitter", "XYZ Complete User", "XYZ Complete Editor")
.anyRequest().authenticated()
)
.formLogin(formLogin -> formLogin.permitAll())
.logout(logout -> logout
.deleteCookies("JSESSIONID")
.invalidateHttpSession(true)
.logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK))
)
.headers(headers -> headers
.contentSecurityPolicy(csp -> csp
.policyDirectives("default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self'; frame-ancestors 'self';  form-action 'self';")
)
.httpStrictTransportSecurity(hsts -> hsts
.includeSubDomains(true)
.maxAgeInSeconds(31536000)
)
)
.sessionManagement(sessionManagement -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.csrf(csrf -> {
if (properties.getCsrf().getEnabled().booleanValue()) {
if (properties.getCsrf().getUseCookie().booleanValue()) {
CookieCsrfTokenRepository trep = (CookieCsrfTokenRepository) XYZLibraryCookieRepository.withHttpOnlyFalse();
trep.setCookiePath("/");
csrf.csrfTokenRepository(trep);
}
} else {
csrf.disable();
}
});

http.addFilterBefore(expiredSessionFilter(), SessionManagementFilter.class);
//http.addFilterBefore(authenticationFilter(authenticationManager(http)), UsernamePasswordAuthenticationFilter.class);
http.addFilterAfter(new RequestAuditingFilter(), BasicAuthenticationFilter.class);

return http.build();
}

Короче говоря, запрос /login, который аутентифицирует пользователя, похоже, аутентифицирует нормально (возвращает 200 и действительный ответ, содержит данные пользователя и возвращает новый UsernamePasswordAuthenticationToken(p, пароль, полномочия) от пользовательского поставщика выглядит нормально. Однако /user (первый блок кода выше) и другие вызовы API, которые полагаются на возвращение принципала пользователя, имеют нулевые параметры пользователя и поэтому не работают, несмотря на предположительно успешную аутентификацию. Я слышал о необходимости переопределения опор, которое у нас тоже есть и выглядит так:

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

    @Override
public boolean supports(Class authentication) {
return authentication.equals(XYZLibraryAuthenticationToken.class);
}
Я могу предоставить другие фрагменты кода, например, пользовательский фильтр/токен/провайдеры, но этот пост уже несколько длинный - хотя мы создаем собственные фильтры/токены/провайдеры, в нем нет ничего необычного. здесь я думаю, и до перехода на Spring 3/6 он работал нормально, поэтому я думаю, что это как-то связано с тем, как сейчас настроена наша конфигурация безопасности, из-за того, сколько изменений ей потребовалось (мы также внесли несколько предложений по линтеру, пока были в здесь вроде замены на лямбды и т. д.). Я пробовал перемещать заказы в цепочке безопасности и бесчисленное множество других настроек методом проб и ошибок, но, похоже, ничего не помогает, поэтому я спрашиваю здесь, есть ли у кого-нибудь какие-нибудь идеи.

Подробнее здесь: https://stackoverflow.com/questions/791 ... der-issues
Ответить

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

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

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

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

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