当用户访问没有权限的URL时,Spring Security的默认行为是跳转到登录页面。这是因为Spring Security会自动应用一个AccessDeniedHandler
,用于处理访问被拒绝的情况。
默认情况下,当用户访问受保护的URL但没有相应的权限时,会触发一个AccessDeniedException
,然后AccessDeniedHandler
将会被调用。默认的AccessDeniedHandler
实现是AccessDeniedHandlerImpl
,它会将用户重定向到登录页面。
如果你想自定义访问被拒绝时的处理行为,可以通过配置AccessDeniedHandler
来实现。你可以创建一个实现了AccessDeniedHandler
接口的自定义类,并通过ExceptionHandlingConfigurer
中的accessDeniedHandler()
方法来指定。
下面是一个示例,演示如何自定义访问被拒绝时的处理行为:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.antMatchers("/private/**").authenticated()
.and()
.exceptionHandling()
.accessDeniedHandler(customAccessDeniedHandler())
.and()
.formLogin()
.loginPage("/custom-login")
.loginProcessingUrl("/custom-login-processing")
.permitAll()
.and()
.logout()
.logoutUrl("/custom-logout")
.permitAll();
}
@Bean
public AccessDeniedHandler customAccessDeniedHandler() {
return new CustomAccessDeniedHandler();
}
// 其他配置方法...
private static class CustomAccessDeniedHandler implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
// 自定义处理逻辑
response.sendRedirect("/custom-access-denied");
}
}
}
在上面的示例中,我们通过.exceptionHandling().accessDeniedHandler(customAccessDeniedHandler())
来指定自定义的AccessDeniedHandler
。
在customAccessDeniedHandler()
方法中,我们返回了一个自定义的AccessDeniedHandler
实现类CustomAccessDeniedHandler
。在CustomAccessDeniedHandler
中,我们将访问被拒绝时,将用户重定向到/custom-access-denied
路径。
通过以上配置,当用户访问没有权限的URL时,会跳转到自定义的访问被拒绝处理页面。你可以根据自己的需求,实现不同的处理逻辑。