[我希望我的spring Web应用程序将在用户试图访问资源而没有登录或没有正确权限的情况下仅返回状态代码403 UNAUTHORIZED
,而不重定向到/login
。
我目前使用oauth2
客户端登录名设置了我的spring security,但是我认为它与基本登录名也具有相同的行为。
@Override
protected void configure(HttpSecurity http) throws Exception
{
http.csrf().disable()
.authorizeRequests()
.antMatchers("/allowed").permitAll()
.anyRequest()
.authenticated()
.and()
.oauth2Login(this::configureOauthLogin) // sets up custom user services
.exceptionHandling()
.accessDeniedHandler((request, response, accessDeniedException) -> {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
});
}
我已经尝试通过提供accessDeniedHandler
来处理它,但我看不到它会改变任何东西,因为从未真正触发过此处理程序。
TLDR
在未经授权的请求下,将弹簧抛出403
而不是302
。>>
编辑
这里是我的过滤器链的转储
filters = {ArrayList@6668} size = 14
0 = {WebAsyncManagerIntegrationFilter@6635}
1 = {SecurityContextPersistenceFilter@6634}
2 = {HeaderWriterFilter@6633}
3 = {LogoutFilter@6632}
4 = {OAuth2AuthorizationRequestRedirectFilter@6631}
5 = {OAuth2LoginAuthenticationFilter@6630}
6 = {DefaultLoginPageGeneratingFilter@6629}
7 = {DefaultLogoutPageGeneratingFilter@6628}
8 = {RequestCacheAwareFilter@6627}
9 = {SecurityContextHolderAwareRequestFilter@6626}
10 = {AnonymousAuthenticationFilter@6625}
11 = {SessionManagementFilter@6624}
12 = {ExceptionTranslationFilter@6623}
13 = {FilterSecurityInterceptor@6622}
我希望我的spring Web应用程序将简单地返回状态代码403 UNAUTHORIZED,而不是在用户尝试访问未登录或没有... ...的资源时重定向到/ login]]
我想通了,原来这个控制流程是由安全配置中的authenticationEntryPoint
处理的。以下代码提供了所需的行为:
http
.exceptionHandling()
.authenticationEntryPoint(new Http403ForbiddenEntryPoint())