当前位置: 首页 > 知识库问答 >
问题:

Spring Security过滤器链不适用于转发的请求

冯福
2023-03-14

我的应用程序只需要支持一个URL。喜欢http://.../service/api.要执行的操作取决于“操作”请求参数

为了处理这个问题,我创建了以下控制器

@RestController
public class Controller {

@PostMapping(path = "/api", params = "ACTION=INIT")
 public String init() {
   return "Inside Initialize";
 }

 @PostMapping(path = "/api", params = "ACTION=FETCH")
 public String fetch() {
   return "Inside Fetch";
 }
 
 @PostMapping(path="/view", param = "!ACTION")
 public String view() {
   return "Inside View";
 }

缺少ACTION参数时将调用 /view。对于前两个请求,我配置了OAuth身份验证,后者即 /view将使用formlogin。

我已经创建了一个过滤器,在那里我检查ACTION参数,如果丢失,我将请求转发到 /view处理程序。

@Component
public class RouteFilter extends OncePerRequestFilter {

  @Override
  protected void doFilterInternal(HttpServletRequest httpServletRequest,
      HttpServletResponse httpServletResponse, FilterChain filterChain)
      throws ServletException, IOException {
    if(!StringUtils.hasText(httpServletRequest.getParameter("ACTION"))){
      httpServletRequest.getRequestDispatcher("/view").forward(httpServletRequest,httpServletResponse);
    }else {
      filterChain.doFilter(httpServletRequest,httpServletResponse);
    }
  }

下面是过滤器注册。我已确保在FilterChainProxy之前调用了我的筛选器

@Autowired
private RouteFilter routeFilter;

@Bean
public FilterRegistrationBean<RouteFilter> filter() {
  FilterRegistrationBean<RouteFilter> bean = new FilterRegistrationBean<>();
  bean.setFilter(routeFilter);
  bean.addUrlPatterns("/api");
  bean.setOrder(-100);
  return bean;
}

以下是安全配置

@Configuration
@Order(1)
public class Config extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/api")
        .hasAuthority("SCOPE_API")
        .anyRequest()
        .authenticated()
        .and()
        .oauth2ResourceServer()
        .opaqueToken();
  }
}

@Configuration
@Order(2)
public class Config2 extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/view")
        .permitAll()
        .and()
        .formLogin();
  }
}

当我调用/服务/api时,RouteFilter将请求转发给/视图处理程序,但与/视图相关的Spring Security性没有得到尊重。Spring Security过滤器链是否不适用于转发的请求,或者我在这里遗漏了什么。我使用的是spring boot 2.4.0版本

共有1个答案

郑卜鹰
2023-03-14

如这里所述,我们需要将DispatcherType. FORWARD添加到springFilterChain以拦截转发的请求。上面链接中描述的步骤不起作用,因为springFilterChain是由SecurityAutoConfiguration创建的。要在此添加转发调度程序,我们需要将属性设置为application.yml

security:
    filter:
      dispatcher-types:
        - request
        - async
        - error
        - forward 

设置此属性后,安全过滤器链会拦截请求。

 类似资料:
  • 我试图理解Hibernate过滤器,我认为即使查询不是从过滤的实体开始,也可以应用过滤器,如果我只是加入它。 我的实体: 过滤器通过拦截器启用,为了安全起见,从数据库中获取参数列表。 当我执行这样的查询时: 过滤器被应用了。但是我也希望当我的查询从模块部分开始时应用过滤器: 在上述查询中,没有应用筛选器。 ModuleSect实体中的学术类为null,但我也有其他实体不为空,其中上述情况不起作用。

  • 主要内容:FilterChain 接口,Filter 链的拦截过程,Filter 链中 Filter 的执行顺序,示例在 Web 应用中,可以部署多个 Filter,若这些 Filter 都拦截同一目标资源,则它们就组成了一个 Filter 链(也称过滤器链)。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到传递给目标资源。 FilterChain 接口 javax.servlet 包中提供了一个 FilterChain 接口,该接口由容器实现。容器将其实例对象

  • 我在使用带有“模式”标记器的“keep\u types”过滤器时遇到问题,下面是一个示例: 针对_analyze API的结果是: 如果我移除keep_types它按预期工作。 我还注意到,如果我使用“标准”分析器,它可以很好地工作,但在这种情况下,它不会以所需的方式标记文本。 我使用的是6.8版本,但在7.5版本中也尝试了相同的结果。。。 有什么想法吗?

  • 我试图通过使用Micrsoft图形按名称获取SharePoint库。 以下查询返回两个库(更准确地说,是驱动器)的名称:https://graph.microsoft.com/v1.0/sites/SiteID/drives?$select=name, id 结果: 为了只返回一个名称,我做了这样的$filter https://graph.microsoft.com/v1.0/sites/Sit

  • 问题内容: 据我了解,CSS过滤器应该可以在Chrome中的任何地方使用,但是我无法使它们适用于SVG元素。 在 所有 大多数浏览器中 都 可以正常工作: 但是,这在Chrome中不起作用: 这是一个例子: …这是一个小提琴:https : //jsfiddle.net/LtffLagn/2/ 问题答案: 所有归功于@Robert Longson,他给出了答案: CSS过滤器无法应用于Chrome