Spring 引导:accessDeniedHandler 不工作
Spring Boot: accessDeniedHandler does not work
我有以下 Spring 安全配置:
@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
但没有成功。
如何在访问失败时实现自定义逻辑?
AccessDeniedHandler 仅适用于经过身份验证的用户。未经身份验证的用户的默认行为是重定向到登录页面(或任何适用于正在使用的身份验证机制的行为)。
如果您想更改它,您需要配置一个 AuthenticationEntryPoint
,它会在未经身份验证的用户尝试访问受保护资源时调用。你应该可以使用
http.exceptionHandling().authenticationEntryPoint(...)
而不是你所拥有的。有关详细信息,请查看 API docs.
正常的 Spring 安全行为是将未经身份验证的用户重定向到您的登录页面,如下所示。对未经授权的用户(没有 ADMIN 角色)进行身份验证将被定向到访问被拒绝的页面:
http.authorizeRequests().antMatchers("/admin/**")
.access("hasRole('ADMIN')")
.and().formLogin().loginPage("/login")
.and().exceptionHandling().accessDeniedPage("/403");
如果您已经实施了自己的身份验证机制并且您不指望 Spring 安全配置将未经身份验证的用户传送到您的登录页面,您可以按如下方式使用 Spring 安全配置 -提供您的自定义 403 页面而不是真正的登录页面:
http.authorizeRequests().antMatchers("/admin/**")
.access("hasRole('ADMIN')")
.and().formLogin().loginPage("/403")
.and().exceptionHandling().accessDeniedPage("/403");
碰到这个问题,帮我解决了问题,下面是我的代码:
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());
}
希望对您有所帮助。
使用这个:-
@Configuration
public class ViewRegistryConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/403").setViewName("notAuth");
}
}
并在模板文件夹中创建 notAuth.html 页面
我有以下 Spring 安全配置:
@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
但没有成功。
如何在访问失败时实现自定义逻辑?
AccessDeniedHandler 仅适用于经过身份验证的用户。未经身份验证的用户的默认行为是重定向到登录页面(或任何适用于正在使用的身份验证机制的行为)。
如果您想更改它,您需要配置一个 AuthenticationEntryPoint
,它会在未经身份验证的用户尝试访问受保护资源时调用。你应该可以使用
http.exceptionHandling().authenticationEntryPoint(...)
而不是你所拥有的。有关详细信息,请查看 API docs.
正常的 Spring 安全行为是将未经身份验证的用户重定向到您的登录页面,如下所示。对未经授权的用户(没有 ADMIN 角色)进行身份验证将被定向到访问被拒绝的页面:
http.authorizeRequests().antMatchers("/admin/**")
.access("hasRole('ADMIN')")
.and().formLogin().loginPage("/login")
.and().exceptionHandling().accessDeniedPage("/403");
如果您已经实施了自己的身份验证机制并且您不指望 Spring 安全配置将未经身份验证的用户传送到您的登录页面,您可以按如下方式使用 Spring 安全配置 -提供您的自定义 403 页面而不是真正的登录页面:
http.authorizeRequests().antMatchers("/admin/**")
.access("hasRole('ADMIN')")
.and().formLogin().loginPage("/403")
.and().exceptionHandling().accessDeniedPage("/403");
碰到这个问题,帮我解决了问题,下面是我的代码:
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());
}
希望对您有所帮助。
使用这个:-
@Configuration
public class ViewRegistryConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/403").setViewName("notAuth");
}
}
并在模板文件夹中创建 notAuth.html 页面