尝试访问网络的某些部分时提供简单的HTTP 401,而不是重定向到登录页面

时间:2019-02-05 16:10:34

标签: java spring spring-security

我已经使用Spring Security制作了一个Spring Page。当我尝试访问此页面内的任何URL时,如果未设置会话,它将把您重定向到登录页面:/ login。很好,但是现在我在此网络中制作了一个简单的http rest api。如果我尝试访问/ api / **中的任何URL,我想要的只是删除401,而不是发送HTTP重定向进行登录。

我用preHandle制作了一个过滤器:

公共类BusinessKeyInterceptor扩展了HandlerInterceptorAdapter {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    if (auth != null && auth.isAuthenticated()
            &&
            // when Anonymous Authentication is enabled
            !(auth instanceof AnonymousAuthenticationToken)) {
       // other stuf ....
        }
    } else {
        if (request.getRequestURI().startsWith("/api")) {
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            return false;
        }
    }
    return true;
}
}

但是在这种情况下,请求URI已经是 /登录

我的配置:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and().sessionManagement()
                .invalidSessionUrl("/login?invalid")
                .and().csrf().disable().formLogin()
                .loginPage("/login")
                .failureHandler(customAuthenticationFailureHandler)
                .defaultSuccessUrl("/loggedIn")
                .usernameParameter("email")
                .passwordParameter("password")
                .successHandler(authenticationSuccessHandler)
                .and().logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/").and().exceptionHandling()
                .accessDeniedPage("/access-denied")
        ;
    }

1 个答案:

答案 0 :(得分:0)

我建议不要将以前的安全配置与新的REST api配置混在一起。您可以执行以下操作:

@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Configuration
    @Order(1)
    public static class WebConfiguration extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.antMatchers("/web")
            ...
           /* Your previous config would go here */
        }
    }

    @Configuration
    @Order(2)
    public static class ApiConfiguration extends WebSecurityConfigurerAdapter {


        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.antMatchers("/web")

            ... /* Your /api configuration goes here */

                .exceptionHandling()
                  .authenticationEntryPoint(customAuthenticationEntryPoint)

        }

        @Bean
        AuthenticationEntryPoint customAuthenticationEntryPoint() {
            return new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED);
        }
    }
}

这样,您可以单独配置rest api。现在,您可以为rest api使用不同的身份验证入口点。事实是,您很可能还希望提供一个自定义的失败处理程序和成功处理程序,您现在可以轻松地进行这些操作,并且它们将与Web应用程序的其余部分保持独立。