12

我已经在这里、google 和 springsource 进行了搜索,但找不到适合我的解决方案。我有以下 spring-security.xml 并且当我使用该模式时

<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />

当它重定向到登录页面时,这给了我一个 404 错误。但是,如果我使用,这不会发生

<intercept-url pattern="/index*" access="hasRole('ROLE_USER')" />

但显然这并不能保护应用程序的其余部分。

我确定这是我忽略的简单问题,但我能找到的最接近的是这个堆栈溢出问题,我已经将其合并到下面的 xml 文件中,但仍然存在同样的问题。我已经尝试过了,use-expressions="true"并且尝试过切换intercept-url' (我不是 100%,但我相当确定该/**模式应该是最后一个,因为我相信 url 的匹配顺序与声明的顺序相同)

任何建议/帮助都会很棒

弹簧安全.xml

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">

    <http auto-config="true" use-expressions="true">
        <intercept-url pattern="/login" filters="none" access="permitAll" />
        <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
        <form-login login-page="/login" default-target-url="/welcome"
            authentication-failure-url="/loginfailed" />
        <logout logout-success-url="/logout" />
    </http>

    <authentication-manager>
      <authentication-provider>
        <user-service>
            <user name="username" password="password" authorities="ROLE_USER" />
        </user-service>
      </authentication-provider>
    </authentication-manager>

</beans:beans>

更新

以防万一这是我使用 Spring 和 Spring security 3.0.4.RELEASE 的一个因素

回答

听从 Kris 的建议,我改变了

<intercept-url pattern="/login" filters="none" access="permitAll" />

到:

<intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" />

由于异常,这导致了 500 错误

    SpelEvaluationException: EL1008E:(pos 0): Field or property
     'IS_AUTHENTICATED_ANONYMOUSLY' cannot be found on object of 
type'org.springframework.security.web.access.expression.WebSecurityExpressionRoot

我通过更改IS_AUTHENTICATED_ANONYMOUSLY来解决了这个问题isAnonymous()

<intercept-url pattern="/login" access="isAnonymous()" />
4

4 回答 4

9

为了完整起见,这是需要更改为isAnonymous().

<http>元素有一个use-expressions默认为的属性true。在默认情况下,您需要使用“安全表达式”而不是角色名称。如果您希望在access=声明中仅使用角色名称,则需要关闭表达式

<http use-expressions="false"> ... </http>
于 2015-10-30T19:05:14.517 回答
8

添加一个AnonymousAuthenticationFilter到堆栈和一个AnonymousAuthenticationProvider. 如果您使用该IS_AUTHENTICATED_ANONYMOUSLY属性,则为必需。 春季证券

isAnonymous()改用。

于 2014-05-14T18:06:10.320 回答
3

改变这个<intercept-url pattern="/login" filters="none" access="permitAll" />

<intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" />
于 2013-03-01T12:23:47.007 回答
0

配置对我来说看起来不错。难道/login页面实际上不存在?第二个配置(带有/index*)可能只起作用,因为那时您发出的请求没有被拦截,因此没有被重新定向到不存在的/login页面。如果配置有问题,Spring Security 会响应 403 而不是 404。

/login如果url 有效,请在没有配置任何 Spring Security 的情况下仔细检查。

于 2013-03-01T12:12:50.267 回答