Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring security 3.1.4多个http元素,表单登录';s_Java_Spring_Spring Security - Fatal编程技术网

Java Spring security 3.1.4多个http元素,表单登录';s

Java Spring security 3.1.4多个http元素,表单登录';s,java,spring,spring-security,Java,Spring,Spring Security,我完全知道这个问题已经被问了很多次,但我还没有找到答案。如果它是在那里,我道歉,并链接到它将非常感谢 当前工作配置 下面是我当前正在工作的配置的一个片段,它允许在没有任何安全性的情况下访问上面的元素块,但需要具有其中一个角色的经过身份验证的用户登录 <http pattern="/" security="none" disable-url-rewriting="true" /> <http pattern="/login" security="none" disable-url

我完全知道这个问题已经被问了很多次,但我还没有找到答案。如果它是在那里,我道歉,并链接到它将非常感谢

当前工作配置 下面是我当前正在工作的配置的一个片段,它允许在没有任何安全性的情况下访问上面的
元素块,但需要具有其中一个角色的经过身份验证的用户登录

<http pattern="/" security="none" disable-url-rewriting="true" />
<http pattern="/login" security="none" disable-url-rewriting="true" />
<http pattern="/cookieInfo" security="none" disable-url-rewriting="true" />
<http pattern="/error" security="none" disable-url-rewriting="true" />
<http pattern="/cookiesDisabled" security="none" disable-url-rewriting="true" />
<http pattern="/loginFailed" security="none" disable-url-rewriting="true" />
<http pattern="/static/**" security="none" disable-url-rewriting="true" />

<http access-decision-manager-ref="accessDecisionManager" disable-url-rewriting="true">
    <custom-filter before="FIRST" ref="cookiePresentFilter" />
    <intercept-url pattern="/**" access="ROLE_1,ROLE_2,ROLE_3" />
    <form-login login-page="/login" default-target-url='/loginSuccess' always-use-default-target='true' authentication-failure-url="/loginFailed" />
    <logout />
</http>

将配置文件更改为以下内容:

<http access-decision-manager-ref="accessDecisionManager" disable-url-rewriting="true">
    <intercept-url pattern="/foo/**" access="permitAll" />
    <intercept-url pattern="/**" access="ROLE_1,ROLE_2,ROLE_3" />
    <form-login login-page="/login" default-target-url='/loginSuccess' always-use-default-target='true' authentication-failure-url="/loginFailed" />
    <logout />
</http>
<http pattern="/foo/**" ...>
    <intercept-url pattern="/foo/login" access="ROLE_ANONYMOUS"/>
    <intercept-url pattern="/**" access="ROLE_1,ROLE_2,ROLE_3" />
    <form-login
        ... 
        default-target-url="/loginSuccess 
        login-page="/foo/login" 
        login-processing-url="/foo/authenticate" />
    ...
</http>

为什么这不起作用 这不起作用的原因是发生了以下情况:

  • 如果请求与/foo/**匹配的URL,则页面将缓存在中。默认实现是通过在HttpSession中缓存请求来实现的
  • 然后,Spring Security会将您发送到/login,其中可能有一个表单发布到/j_Spring_Security_check
  • 当用户进行身份验证时,请求是/j_spring_security_check,它与/foo/**不匹配,因此它由第二个元素进行身份验证。
    始终使用默认目标=“true”
    在身份验证时应用,而不是在发送到登录表单时应用。由于身份验证请求与/foo/**不匹配,用户将始终被发送到
    默认目标url
正在修复此设置 要解决此问题,您需要执行以下操作:

<http access-decision-manager-ref="accessDecisionManager" disable-url-rewriting="true">
    <intercept-url pattern="/foo/**" access="permitAll" />
    <intercept-url pattern="/**" access="ROLE_1,ROLE_2,ROLE_3" />
    <form-login login-page="/login" default-target-url='/loginSuccess' always-use-default-target='true' authentication-failure-url="/loginFailed" />
    <logout />
</http>
<http pattern="/foo/**" ...>
    <intercept-url pattern="/foo/login" access="ROLE_ANONYMOUS"/>
    <intercept-url pattern="/**" access="ROLE_1,ROLE_2,ROLE_3" />
    <form-login
        ... 
        default-target-url="/loginSuccess 
        login-page="/foo/login" 
        login-processing-url="/foo/authenticate" />
    ...
</http>
亮点:

  • 仅使用main(不要使用/foo/**块)
  • 更新块以使用元素
  • 创建HttpSessionRequestCache实例,该实例仅保存应重定向到的请求。换句话说,忽略应该始终发送到默认目标url的请求。示例配置将向默认目标url发送与/foo/**不匹配的任何请求

为了澄清。。。您希望模式“/foo/**”的url是公共的,并且不受spring security的保护?您好,如果不清楚,很抱歉,但是不,我希望它以相同的方式进行身份验证,只是不要传递给默认目标,我想看看这是否可以通过配置而不是通过java代码来实现。谢谢你非常详细的回答。现在我很清楚为什么我所尝试的不会奏效,所以谢谢你让我直截了当!关于更好的替代方案,我已经尝试过了,但它似乎没有起作用,因为在访问以/foo开头的url时,它仍然指向默认目标。我将在周末调试它,看看我是否做错了什么。例如,我的示例/foo将被缓存,因为它在模式中不是以/foo/第二个/开头的。对不起,我尝试了以/foo/开头的URL。。。无济于事。
<http access-decision-manager-ref="accessDecisionManager" disable-url-rewriting="true">
    <intercept-url pattern="/**" access="ROLE_1,ROLE_2,ROLE_3" />
    <form-login login-page="/login" default-target-url='/loginSuccess' always-use-default-target='true' authentication-failure-url="/loginFailed" />
    <logout />

    <request-cache ref="requestCache"/>
</http>

<bean:bean id="requestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache">
    <bean:property name="requestMatcher">
        <bean:bean class="org.springframework.security.web.util.RegexRequestMatcher">
            <bean:constructor-arg value="^(?!/foo/).+"/>
            <bean:constructor-arg><bean:null/></bean:constructor-arg>
            <bean:constructor-arg value="true"/>
        </bean:bean>
    </bean:property>
</bean:bean>