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

Spring Security未正确拦截?[副本]

慕迪
2023-03-14

我有如下Spring Boot配置

http
    .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
    .addFilterBefore( new Filter(), UsernamePasswordAuthenticationFilter.class)
    .csrf().disable() // Disabled, cause enabling it will cause sessions
    .headers()
        .frameOptions()
        .sameOrigin()
        .addHeaderWriter(new XXssProtectionHeaderWriter())
        .and()
    .authorizeRequests()
        .antMatchers("/app/**", "/rest/**").hasAuthority(DefaultPrivileges.ACCESS_TASK)
        .anyRequest().permitAll();

我的理解是,只有以app或rest开头的请求才会被我的自定义过滤器截获,但结果是请求到根(http://localhost:8080/context/也会被截获。

我有多种Spring Security配置,其他配置如下:

http
    .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
    .csrf().disable();

if (taskAppProperties.isRestEnabled()) {
    if (restAppProperties.isVerifyRestApiPrivilege()) {
        http
            .antMatcher("/*-api/**")
            .authorizeRequests()
                .antMatchers("/*-api/**").hasAuthority(DefaultPrivileges.ACCESS_REST_API)
                .and()
            .httpBasic();
    } else {
        http
            .antMatcher("/*-api/**")
            .authorizeRequests()
                .antMatchers("/*-api/**").authenticated()
                .and()
            .httpBasic();
    }
} else {
    http
        .antMatcher("/*-api/**")
        .authorizeRequests()
            .antMatchers("/*-api/**").denyAll();
}

有人能帮忙吗?


共有2个答案

张成济
2023-03-14

HttpSecurity。authorizeRequests-返回设置匹配器和角色条件的ExpressionInterceptUrlRegistry,该条件将使用ExpressionInterceptUrlRegistry方法添加。getRegistry,如果您仅在实际进行身份验证的存根处检查此方法的其他用法,则返回。

我们使用HttpSecurity添加的过滤器。addFilterBefore不会检查任何请求匹配。如果需要,可以在自定义过滤器中再执行一次检查,以避免其他URI

http
  .sessionManagement()
  .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
  .and()
  .addFilterAfter( new Filter() {
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {

      }

      @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
          HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
          if(httpServletRequest.getRequestURI().startsWith("/app/") || httpServletRequest.getRequestURI().startsWith("/rest/")) {
              // Do you secured filter computations

          } 
          chain.doFilter(request, response);
      }

      @Override
      public void destroy() {

      }}, UsernamePasswordAuthenticationFilter.class)
  .csrf()
  .disable() // Disabled, cause enabling it will cause sessions
  .headers()
  .frameOptions()
  .sameOrigin()
  .addHeaderWriter(new XXssProtectionHeaderWriter())
  .and()
  .authorizeRequests()
  .antMatchers("/app/**", "/rest/**")
  .hasAuthority(DefaultPrivileges.ACCESS_TASK)
  .anyRequest()
  .permitAll();
阎阎宝
2023-03-14

我意识到这有点令人困惑,但实际上有两种antMatchers方法,一种是从authorizedRequests分支出来的,另一种是从requestMatchers分支出来的。

让我们看看以下声明:

http
    .requestMatchers()
        .antMatchers("/app/**", "/api/**")
        .and()
    .authorizeRequests()
        .antMatchers("...").authenticated()
    ...

在DSL中,您可以描述对Spring Security过滤器链的实例很重要的endpoint。因此,此过滤器链仅适用于以/app/api开头的URI。

让我们看看另一个:

http
    .authorizeRequests()
    .antMatchers("/app/**", "/api/**")
    .authenticated();

虽然这似乎在做同样的事情,但事实并非如此。这是因为您正在调用属于authorizeRequests()的antMatchers方法。

这就是为什么缩进对于Spring Security DSL很重要的原因。因为DSL中有一个层次结构,所以您想要缩进,就像您想要缩进您的if语句一样。

在Spring Security 5.2中,新的lambda DSL简化了这一点:

http
    .requestMatchers(r -> r.antMatchers("/app/**", "/api/**"))
    .authorizeRequests(a -> a.antMatchers("...").authenticated());
 类似资料:
  • 问题很简单 在这里打破头! 编辑:一个小突破。我打印了目标,它返回的是SimpleJPrepository,而不是实际的存储库。

  • 问题内容: 我正在使用Java EE 6和Jboss AS7.1,并尝试使用拦截器绑定(来自jboss网站的示例)。 我有一个InterceptorBinding注解: 拦截器: 还有一个豆: 但是拦截器没有被称为。。。 在编写此代码时将调用拦截器: 谢谢你的帮助。 问题答案: 您是否按照参考示例中的说明启用了拦截器? 缺省情况下,bean档案没有通过拦截器绑定绑定的已启用拦截器。必须通过将侦听器

  • 问题内容: 我创建了一个RestEASY拦截器,以允许我在Web服务调用完成后在HTTP响应上设置标头值。我的代码看起来像这样… 但是,当我调用服务时,永远不会调用拦截器。我看到webservice调用成功完成,但是拦截器中的任何代码都没有执行过。除了注册拦截器,我还需要做些其他事情吗?是否必须在其他任何地方声明?是否需要包含任何特殊的web.xml参数? 问题答案: 您必须在web.xml的re

  • 我正在尝试做一个基本的Spring SecurityD/B身份验证程序。我试过两种方法。 方法1:使用自定义表进行Spring Security验证<方法2:使用特定于Spring security的数据库表进行用户身份验证和授权。 文件位置: 1.index.jsp- 对于方法1,Spring security并没有拦截请求,我在控制台中也并没有看到错误。我没有截获这个请求,而是直接接受了邀请。

  • 拦截文件 bp CreateFileA 创建或打开文件 (32位) bp OpenFile 打开文件 (32位) bp ReadFile 读文件 (32位) bp WriteFile 写文件 (32位) bp GetPrivateProfileStringA (ini文件)

  • 拦截时间 bp GetLocalTime 获取本地时间 bp GetSystemTime 获取系统时间 bp GetFileTime 获取文件时间 bp GetTickCount 获得自系统成功启动以来所经历的毫秒数 bp GetCurrentTime 获取当前时间(16位) bp SetTimer 创建定时器 bp TimerProc 定时器超时回调函数