Mein Interceptor läuft in allen Anfragen außer bei der Anmeldung.HandlerInterceptorAdapter läuft nicht bei der Anmeldung mit Spring Security
Interceptor:
public class MultitenantHandler extends HandlerInterceptorAdapter {
private static final Logger log = LoggerFactory.getLogger(MultitenantHandler.class);
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler){
String origin = req.getHeader("Origin");
log.debug("Origin: "+origin);
if (origin == null) {
origin = "localhost";
}
int indexDot = origin.indexOf(".");
int indexDash = origin.indexOf("://") + 3;
String tenant = "";
if (indexDot == -1) {
tenant = "experter";
log.warn("Using default tenant");
TenantContext.setCurrentTenant(tenant);
} else {
tenant = origin.substring(indexDash, indexDot);
log.info("Using tenant: " + tenant);
TenantContext.setCurrentTenant(tenant);
}
return true;
}
}
Auf WebMvcConfigurerAdapter
melde ich mich auf diese Weise:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MultitenantHandler());
}
Es Config meine Sicherheit ist:
@Configuration
@EnableWebSecurity
@Profile({"development", "demo", "default"})
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final Logger log = LoggerFactory.getLogger(SecurityConfig.class);
@Autowired
private CustomUserDetailsService customUserDetailsService;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private RESTAuthenticationEntryPoint authenticationEntryPoint;
@Autowired
private RESTLogoutSuccessHandler logoutSuccessHandler;
@Autowired
private JWTAuthenticationFailureHandler authenticationFailureHandler;
@Autowired
private JWTAuthenticationSuccessHandler authenticationSuccessHandler;
@Autowired
private StatelessAuthenticationFilter statelessAuthFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);
http.formLogin().permitAll()
.successHandler(authenticationSuccessHandler)
.failureHandler(authenticationFailureHandler);
http.logout().permitAll()
.logoutSuccessHandler(logoutSuccessHandler);
http.addFilterBefore(statelessAuthFilter, UsernamePasswordAuthenticationFilter.class);
http.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.antMatchers("/v2/api-docs").hasRole("ADMIN")
.antMatchers("/login").permitAll()
.antMatchers("/login/changePassword").permitAll()
.antMatchers("/user/image").permitAll()
.antMatchers("/social/login/facebook").permitAll()
.antMatchers("/actuator/**").hasRole("ADMIN")
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/**").hasRole("USER");
log.info("Configuration of http complete.");
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder);
}
Als ich /login
die Abfangjäger fordern nicht ausgeführt wird, in anderen Anfragen auch nicht protokolliert der Interceptor normal arbeiten.
Ich muss den Interzeptor vor jeder Anfrage ausführen, weil ich die Datenbank entsprechend URL-Anfrage einstellen muss.
Wenn Sie weitere Informationen benötigen, bitte sagen Sie mir, dass ich hier posten kann.
Spring Security wird mithilfe von Filtern implementiert, die vor dem 'DispatcherServlet' und allen Controllern/Handlern ausgeführt werden, die Sie haben. Also wird es natürlich nicht laufen. Implementieren Sie es mit einem Filter anstelle eines 'HandlerInterceptor'. –
Danke deine Antwort @ M.Deinum. Aber sobald ich den Filter kenne, ändert sich das Verhalten dieser Methode nicht. Laut http://stackoverflow.com/a/35856496/2463802 "Filter eignet sich gut für Anforderungsinhalt und Ansicht Inhaltsbehandlung, wie Multipart-Formulare und GZIP-Komprimierung. Dies zeigt in der Regel, wenn man den Filter auf bestimmte Inhaltstypen zuordnen muss (zB Bilder) oder auf alle Anfragen. " –
Ihr Verständnis von Filtern ist fehlerhaft. Was Sie erreichen wollen, erreichen Sie mit einem Handler Interceptor nicht, Sie müssen einen Filter verwenden. Ein Filter kann viel mehr als ein 'Handlerinterceptor'. Wie bereits erwähnt, wird Spring Security mit Filtern implementiert, und so ist ein' HandlerInterceptor' einfach keine Option. –