Spring Boot:accessDeniedHandler不起作用

时间:2015-01-21 00:21:08

标签: java spring spring-security spring-boot

我有以下Spring Security配置:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/api/private/**", "/app/**").authenticated();
        http.csrf().disable();
        http.logout().logoutSuccessUrl("/");
        http.exceptionHandling().accessDeniedPage("/403"); //.accessDeniedHandler(accessDeniedHandler);
    }
}

我希望以下逻辑:未经过身份验证的用户将被重定向到/403。而不是Spring显示默认的Tomcat 403页面。我也尝试了自定义accessDeniedHandler

如何在访问失败时实现自定义逻辑?

4 个答案:

答案 0 :(得分:25)

AccessDeniedHandler仅适用于经过身份验证的用户。未经身份验证的用户的默认行为是重定向到登录页面(或适用于正在使用的身份验证机制的任何内容)。

如果要更改,则需要配置AuthenticationEntryPoint,当未经身份验证的用户尝试访问受保护资源时调用该http.exceptionHandling().authenticationEntryPoint(...) 。你应该可以使用

{{1}}
而不是你拥有的。有关详细信息,请查看API docs

答案 1 :(得分:3)

遇到这个问题,它帮助我解决了问题,下面是我的代码:

public class CustomHttp403ForbiddenEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
            AuthenticationException authException) throws IOException, ServletException {
        response.getWriter().print("You need to login first in order to perform this action.");
    }

}

public class CustomAccessDeniedHandler implements AccessDeniedHandler {

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException arg2)
            throws IOException, ServletException {
        response.getWriter().print("You don't have required role to perform this action.");
    }

}

@Override
protected void configure(HttpSecurity http) throws Exception {

    http.exceptionHandling().accessDeniedHandler(new CustomAccessDeniedHandler()).and()
        .exceptionHandling().authenticationEntryPoint(new CustomHttp403ForbiddenEntryPoint());
}

希望这会有所帮助。

答案 2 :(得分:1)

正常的Spring Security行为是将未经身份验证的用户重定向到您的登录页面,如下所示。验证未经授权(没有ADMIN角色)的用户将被定向到拒绝访问页面:

http.authorizeRequests().antMatchers("/admin/**")
    .access("hasRole('ADMIN')")
    .and().formLogin().loginPage("/login")
    .and().exceptionHandling().accessDeniedPage("/403");

如果您已经实现了自己的身份验证机制,并且没有指望Spring Security配置将未经身份验证的用户提供给您的登录页面,那么您可以按照以下方式对Spring Security配置进行游戏 - 以提供自定义403页面而不是真实登录页面:

http.authorizeRequests().antMatchers("/admin/**")
    .access("hasRole('ADMIN')")
    .and().formLogin().loginPage("/403")
    .and().exceptionHandling().accessDeniedPage("/403");

答案 3 :(得分:0)

使用此:-

@Configuration
public class ViewRegistryConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/403").setViewName("notAuth");
    }

}

并在模板文件夹中创建notAuth.html页面