我有一个2个春季启动应用程序运行,其中一个应用程序用作管理身份验证和路由(使用zuul代理)的“网关”,另一个用作网关后面的UI(“/ admin”)。
当我点击“/ login”(或网关本身的任何其他端点)时,我会被路由到“login.html”页面,然后我可以输入我的凭据并获得正确的身份验证。之后我可以毫无问题地访问“/ admin”。
我的问题是,如果我在进行身份验证之前点击“/ admin”,我就不会被路由到“/login.html”,而只会获得“基本身份验证”弹出窗口,要求提供凭证,这就是我要做的事情。我想要。
这是我在网关服务器上的配置。
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.maximumSessions(1)
.expiredUrl("/login")
.maxSessionsPreventsLogin(false)
.sessionRegistry(sessionRegistry())
.and()
.sessionCreationPolicy( SessionCreationPolicy.ALWAYS)
.invalidSessionUrl( "/login" );
http.addFilterBefore(new ApiKeyAuthenticationFilter(macSigner()), BasicAuthenticationFilter.class);
http.httpBasic().and()
.authorizeRequests()
.antMatchers("/", "/home", "/index","/support.html", "/about.html","/features.html","/fonts/**","/ws/**",
"/contacts.html","/img/**","/logos/**","/docs/**").permitAll()
.antMatchers("/admin**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.csrf().ignoringAntMatchers("/resource/api/**","/api/**").csrfTokenRepository(csrfTokenRepository())
.and()
.addFilterAfter(csrfHeaderFilter(), SessionManagementFilter.class)
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/login")
.permitAll();
}
这是我的管理服务器上的配置
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().and().authorizeRequests().anyRequest().authenticated();
http.csrf().disable();
}
有人可以给我一些关于在哪里挖掘的建议吗?
答案 0 :(得分:1)
尝试使用authenticationEntryPoint以及LoginUrlAuthenticationEntryPoint。
例如
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.httpBasic().and().exceptionHandling()
.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login")).and()
.logout().and()
.authorizeRequests()
.antMatchers("/index.html", "/login", "/").permitAll()
.anyRequest().authenticated()
.and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
// @formatter:on
}
@RequestMapping("/login")
public String login() {
return "forward:/";
}