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"。相反,您使用多个 <http>
标记,如下所示:
<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 <http> 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()不匹配排除网址[重复]