Spring Security:如何排除某些资源?

Posted

技术标签:

【中文标题】Spring Security:如何排除某些资源?【英文标题】:Spring Security: how to exclude certain resources? 【发布时间】:2011-03-24 14:32:39 【问题描述】:

我有以下定义...

    <bean id="fsi" class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
    <property name="authenticationManager" ref="authenticationManager"/>
    <property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/>
    <property name="objectDefinitionSource">
      <sec:filter-invocation-definition-source >
            <sec:intercept-url pattern="/secure/css/**"        access="ROLE_TIER0"/>
            <sec:intercept-url pattern="/secure/images/**"     access="ROLE_TIER0"/>
            <sec:intercept-url pattern="/**"                   access="ROLE_TIER0"/>
      </sec:filter-invocation-definition-source>
    </property>
    </bean>

我想要这个网址上的资源...

"/nonSecure/**"

对所有呼叫开放,即周围没有安全措施。

我已经尝试添加...

<sec:intercept-url pattern="/nonsecure/**" access="permitAll" />

但这会导致 Websphere 抛出关于

的错误
Unsupported configuration attributes: [permitAll] 

谁能告诉我如何将此 URL 排除在安全之外?

【问题讨论】:

您应该考虑接受 enyo 答案,因为不再支持旧的 Gandalf 方法。 【参考方案1】:

在 spring security 3.1.x 中,不推荐使用 filters="none"。相反,您使用多个 &lt;http&gt; 标记,如下所示:

<http pattern="/nonsecure/**" security="none"/>

http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-form-and-basic

【讨论】:

这在次要版本中已被弃用?难以置信!【参考方案2】:

我认为您必须将 use-expressions 标记添加到安全 xml 中的 http 配置中,例如:

<http auto-config="true" use-expressions="true">
...
...
</http>

编辑: 好吧,我不确定您使用的是什么版本的 Spring Security。我知道这适用于 3.0,但对于旧版本我不确定。

【讨论】:

当心使用属性auto-config--我刚刚学会了这个艰难的方法。来自 Spring documentation:“不建议使用此属性。”【参考方案3】:
<security:http auto-config='true'>
    <security:intercept-url pattern="/getfeed/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    <security:intercept-url pattern="/**" access="ROLE_USER, ROLE_ADMIN" />
    <security:http-basic />
</security:http>

access="IS_AUTHENTICATED_ANONYMOUSLY" 是解决方案。 我在以下链接上找到了它http://syntx.io/adding-http-basic-auth-to-restful-services-in-java-and-spring/

拦截是自上而下评估的。如果您在 /getIntelFeed/** 之前编写此 /**,则所有服务都将通过 /** 并且安全性将应用于所有服务。在这种情况下 /getIntelFeed/** 将无效。

【讨论】:

我为我的intercept-url pattern 条目添加了access="IS_AUTHENTICATED_ANONYMOUSLY。但是,尝试访问模式 url 时出现 401 错误。为什么会这样?请注意,我遵循了您的“自上而下评估拦截”的警告。 详情请查看帖子中的链接。如果您在点击链接后仍遇到问题,请分享您的代码。 此答案中的链接已失效:/【参考方案4】:

试试:

<sec:intercept-url pattern="/nonsecure/**" filters="none" />

【讨论】:

我一般同意这个答案;然而,人们经常忽略的一个关于 filters="none" 的常见问题是,如果链中没有 Spring Security 过滤器,则没有 SecurityContext,因此不明显的安全检查(例如,服务层注释或引用 Spring Security 对象的 JSP 自定义标签) 可能会意外失败。如果您在包含动态内容的页面上使用过滤器 =“无”,请小心! filters="none" 在 Spring 3.1 中不再支持 filters="none" 是否也跳过自定义过滤器? org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: The use of "filters='none'" is no longer supported. Please define a separate &lt;http&gt; element for the pattern you want to exclude and use the attribute "security='none'" IntelliJ 也给出了一个错误,但是我们使用 spring-security 3.1 没有问题并且具有这个属性,根据docs.spring.io/autorepo/docs/spring-security/3.1.x/reference/…的官方文档,这仍然是正确的【参考方案5】:

为了能够使用 [permitAll] 等表达式,您必须添加 WebExpressionVoter to your AccessDecisionManager

【讨论】:

在 http 标记中指定 use-expressions 会为您做到这一点。【参考方案6】:

您没有指定其余的配置,而且由于看起来您有明确的 bean 配置,我们很难准确猜测您是如何配置的。我会说上述答案的某种组合是正确的。

    如果您使用的是 Spr Sec 3,如果您想启用 SpEL 表达式(并且还配置了可以评估它们的相应 bean),Gopi 的回答是正确的。如果您不使用 http 命名空间,这可能会很困难。 如果您配置了适当的过滤器来为未经身份验证的(匿名)用户设置 SecurityContext,那么设置 role="IS_AUTHENTICATED_ANONYMOUSLY,IS_AUTHENTICATED_FULLY,IS_AUTHENTICATED_REMEMBERED" 或它们的某种组合应该可以工作。 如果所有其他方法都失败了,正如一些人所建议的那样,filters="none" 会做你想做的事,但要注意你真的不需要与 Spring Security 中的任何关系您正在呈现的页面的底层代码,否则您以后可能会发现自己摸不着头脑。

祝你好运!

【讨论】:

以上是关于Spring Security:如何排除某些资源?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Spring Security 管理中排除特定资源并使未登录的用户也可以访问它?

基于某些标头值跳过 Spring Flux Security

Spring mvc / security:从spring security中排除登录页面

Spring Security permitAll()不匹配排除网址[重复]

spring security 判断用户是否登录 只要登录就可以访问资源

Spring security如何允许匿名访问大多数限制某些操作的站点