首页 > 解决方案 > 如何拦截对休息控制器的未授权请求(方法级授权) - Spring Boot

问题描述

在 REST 控制器中,我有以下方法。

@GetMapping("/activate_user")
@RolesAllowed({Role.ROLE_ADMIN})
public void activateUser() {
  // Some code here
}

如果用户ROLE_ADMIN调用此方法,它会正常工作。如果没有ROLE_ADMIN调用此方法的用户,则返回 Http-Status 403。这也可以,但我现在想拦截此调用以防用户未授权,运行一些自定义代码并将一些 JSON 数据返回给调用者.

不知道用Spring怎么办?!

标签: springspring-bootspring-securityspring-restcontroller

解决方案


您可以覆盖 accessdenied 异常,这样它只会在 403 未经授权的情况下执行。

@Override
public void handle(HttpServletRequest request, HttpServletResponse response, 
AccessDeniedException accessDeniedException) throws IOException, ServletException {
    response.getWriter().write("Custom Access Denied Message");
}

您可以使用MVC 拦截器配置来拦截特定的 URL/API

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleInterceptor());
        registry.addInterceptor(new ThemeInterceptor()).addPathPatterns("/**").excludePathPatterns("/adminRole/**");

        registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/auth/*", "/ui/**", "/xyz/**");
    }
}

您甚至可以排除特定的 URL。


推荐阅读