【问题标题】:Spring security: do not require authentication for local requestSpring security:本地请求不需要身份验证
【发布时间】:2017-09-14 03:34:21
【问题描述】:

我有一个带有几个 REST 控制器的 Spring Boot Web 应用程序。它使用 Spring Security 进行基于表单的身份验证 (1)

此外,应用程序正在读取存储的请求并将它们分派给自己。为此,我有一个自定义 Spring Dispatcher servlet 和一个用于存储请求的过滤器链。调用时,它让 Spring DispatcherServlet 将 HTTP 请求分派到正确的 REST 控制器 (2)

我想设置 Spring 安全性,使其不需要对 (2) 情况进行身份验证 - 即当 http 请求来自应用程序本身时。

有人知道如何实现这一目标吗?

【问题讨论】:

  • 是的,我想在第二种情况下完全禁用 Spring Security。不幸的是,没有起始路径,它可以是任何资源。
  • 由于我正在构建请求然后将其传递回 Spring DispatcherServlet,我想我可以设置一个属性 - javax.servlet.ServletRequest.setAttribute。另一种选择是使用动态值(令牌?)设置某个请求标头,然后允许具有有效令牌的请求。
  • 我写了一个答案,但它只是从技术上解决问题。你需要保护这个请求,因为你不想让每个人都绕过 Spring Security。您可以使用令牌(如您所述),但您也可以使用 Spring Secrity 进行检查。也许更好的方法是使用转发而不是重定向。 Spring Security 不会再次检查它。

标签: java spring spring-security


【解决方案1】:

您可以创建一个自定义RequestMatcher

匹配HttpServletRequest 的简单策略。

用你的逻辑来决定是否应该忽略请求。

然后添加自定义RequestMatcherAbstractRequestMatcherRegistry#requestMatchers

将 RequestMatcher 实例列表与 AbstractConfigAttributeRequestMatcherRegistry 关联

到被忽略的RequestMatcherWebSecurity#ignoring 列表:

允许添加 Spring Security 应该忽略的 RequestMatcher 实例。

在您的 WebSecurityConfigurerAdapter#configure 方法中:

重写此方法以配置WebSecurity。例如,如果您希望忽略某些请求。

例如:

public void configure(WebSecurity web) throws Exception {
    web
       .ignoring()
           .requestMatchers(new MyInternalRequestMatcher());
}

【讨论】:

    【解决方案2】:

    为来自应用程序的路径添加下面的 url 拦截。

        <security:intercept-url pattern="path" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    

    【讨论】:

      猜你喜欢
      • 2014-03-21
      • 1970-01-01
      • 2011-09-18
      • 2013-03-31
      • 1970-01-01
      • 2011-02-11
      • 2016-03-20
      • 1970-01-01
      • 2017-05-10
      相关资源
      最近更新 更多