Я копирую SecurityConfiguration из приложения JHipster 4.14 в новое приложение 5.7, и я не ожидаю, что все это будет работать одинаково, но я обнаружил, что озадачен тем, как правильно подключить перезаписанные службы RememberMeServices к сетистек фильтрации.
AbstractAuthenticationProcessingFilter создает экземпляр NullRememberMeServices () с нулевым «параметром», который является строкой запоминания.У абстрактного класса есть метод для установки его на новый, но я не могу найти какую-либо документацию или руководства, которые показывают, где это должно быть сделано.Руководство Baeldung - это то, о чем я говорил, но я использую одно и то же исключение e3xception независимо от того, что я делаю, как если бы фильтр создавался заново при каждом запросе, а не один раз за сеанс.
Отладка и стекТрассировка:
Hibernate: insert into jhi_persistent_audit_event (event_date, event_type, principal, event_id) values (?, ?, ?, ?)
Hibernate: insert into jhi_persistent_audit_evt_data (event_id, name, value) values (?, ?, ?)
Hibernate: insert into jhi_persistent_audit_evt_data (event_id, name, value) values (?, ?, ?)
2019-02-12 17:10:42.990 ERROR 38052 --- [ XNIO-2 task-1] io.undertow.request : UT005023: Exception handling request to /api/authentication
java.lang.NullPointerException: null
at java.util.TreeMap.getEntry(TreeMap.java:347)
at java.util.TreeMap.get(TreeMap.java:278)
at io.undertow.servlet.spec.HttpServletRequestImpl.getParameter(HttpServletRequestImpl.java:663)
at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:194)
at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:194)
at org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices.rememberMeRequested(AbstractRememberMeServices.java:343)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:197)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.app.my.let.security.PersistentTokenRememberMeServices$$EnhancerBySpringCGLIB$$e1ef8f9a.rememberMeRequested(<generated>)
SecurityConfiguration.configure ()
@Override
protected void configure(HttpSecurity http) throws Exception {
if(jHipsterProperties.getSecurity().getRememberMe().getKey() == null) {
throw new Exception("Remember me key is null at startup.");
}
http
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
.addFilterBefore(corsFilter, CsrfFilter.class)
.exceptionHandling()
.authenticationEntryPoint(problemSupport)
.accessDeniedHandler(problemSupport)
.and()
.rememberMe()
.rememberMeServices(rememberMeServices)
.rememberMeParameter("remember-me")
.key(jHipsterProperties.getSecurity().getRememberMe().getKey())
.and()
.formLogin()
.loginProcessingUrl("/api/authentication")
.successHandler(ajaxAuthenticationSuccessHandler())
.failureHandler(ajaxAuthenticationFailureHandler())
.usernameParameter("j_username")
.passwordParameter("j_password")
.permitAll()
.and()
.logout()
.logoutUrl("/api/logout")
.logoutSuccessHandler(ajaxLogoutSuccessHandler())
.permitAll()
.and()
.headers()
.frameOptions()
.disable()
.and()
.authorizeRequests()
.antMatchers("/api/register").permitAll()
.antMatchers("/api/activate").permitAll()
.antMatchers("/api/people-hub/**").permitAll()
.antMatchers("/api/matrices/**").permitAll()
.antMatchers("/api/learning-contents/**").permitAll()
.antMatchers("/api/authenticate").permitAll()
.antMatchers("/api/account/reset-password/init").permitAll()
.antMatchers("/api/account/reset-password/finish").permitAll()
.antMatchers("/api/profile-info").permitAll()
.antMatchers("/api/**").authenticated()
.antMatchers("/management/health").permitAll()
.antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers("/v2/api-docs/**").permitAll()
.antMatchers("/swagger-resources/configuration/ui").permitAll()
.antMatchers("/swagger-ui/index.html").hasAuthority(AuthoritiesConstants.ADMIN);
}
Поставщик аутентификации для этой конфигурации безопасности.
@Bean
public CustomLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
CustomLdapAuthenticationProvider provider = new CustomLdapAuthenticationProvider(
myConfig.getLdap().getDomain(),
myConfig.getLdap().getUrl(),
myConfig.getLdap().getRootDN());
provider.setConvertSubErrorCodesToExceptions(true);
provider.setUseAuthenticationRequestCredentials(true);
provider.setUserDetailsContextMapper(userDetailsContextMapper());
return provider;
}