如果未经过身份验证,如何在zuul代理URL上恢复/登录

时间:2016-05-19 15:10:15

标签: spring-security spring-boot netflix-zuul

我有一个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();
        }

有人可以给我一些关于在哪里挖掘的建议吗?

1 个答案:

答案 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:/";
    }