spring - 如何拦截对休息控制器的未授权请求(方法级授权) - 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怎么办?!
解决方案
您可以覆盖 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。
推荐阅读
- c++ - LNK2019 使用 GLFW 无法解析的外部符号
- android - 每次单击底部导航视图时如何避免重新创建新活动
- variadic - 类中的 C++ 递归可变参数模板
- f# - 如何确定 F# 中的类型?
- java - android.view.InflateException 错误作为用户的崩溃报告。可能是什么原因?
- javascript - 出于某种原因,后台 iframe 重定向到与脚本中 src 中列出的 URL 不同的 URL
- node.js - 是否可以使用语义 UI 更改(html 和正文)背景颜色
- content-security-policy - 允许嵌入内容的 Content-Security-Policy 和实现
- python - 2个列表之间的区别
- javascript - 你如何使用 Ramda 对一组单词进行排序?