Spring Security Basic身份验证只发生一次

时间:2014-09-23 08:32:46

标签: java spring-mvc spring-security http-basic-authentication

最近,我正在为我的REST服务使用Spring Security基本身份验证。

以下是安全xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security.xsd">

    <security:http pattern="/rest/**" create-session="never" use-expressions="true">
        <security:http-basic />
        <security:intercept-url pattern="/rest/auth/**" access="isAuthenticated()"/>
    </security:http>

    <security:authentication-manager alias="authenticationManager">
        <security:authentication-provider>
            <security:user-service>
                <security:user name="admin" password="admin" authorities="ROLE_ADMIN"/>
            </security:user-service>
        </security:authentication-provider>
        <security:authentication-provider user-service-ref="userDetailsService">
            <security:password-encoder hash="sha-256" />
        </security:authentication-provider>
    </security:authentication-manager>

    <security:global-method-security jsr250-annotations="enabled" pre-post-annotations="enabled"/>
</beans>

我使用的Spring框架和Spring Security:

<springframework.version>4.1.0.RELEASE</springframework.version>
<spring.security.version>3.2.5.RELEASE</spring.security.version>

我将我的REST服务映射到前缀为&#34的URL; rest /&#34;当我第一次访问URL时,浏览器会提示基本身份验证的用户名和密码字段。我用正确的凭证填写它,并成功访问我的控制器。

但是,如果我再次尝试使用浏览器访问相同的URL,则不会再次提示我进行基本身份验证的用户名和密码字段,并直接访问该URL。

我希望浏览器总是提示我使用基本身份验证,因为我将create-session属性设置为never。

那么,我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

浏览器缓存凭据。有时清除缓存并没有帮助。如何伪造它的唯一可靠方法是使用Chrome的隐身窗口(Ctrl + N)。但每个隐身窗口有一个提示。因此,当您想再次输入时,需要新的隐身窗口。

这是我发现手动测试基本身份验证的唯一方法。

答案 1 :(得分:0)

来自javadoc for create-session。我认为您的应用程序正在创建会话并且正在使用该会话。

  

属性:create-session控制HTTP的急切性   会话由Spring Security类创建。如果未设置,则默认为
  到“ifRequired”。如果使用“无状态”,这意味着   应用程序保证它不会创建会话。这个   不同于使用“永不”,这是Spring Security将使用的   不创建会话,但如果应用程序将使用一个   确实

     

数据类型:字符串枚举值:     - 如果需要      - 永远      - 从来没有      - 无国籍

你应该尝试使用

  

“无状态”

而不是

  

从未