我已经使用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")
;
}
答案 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应用程序的其余部分保持独立。