【问题标题】:Spring Security Basic Authentication only happens onceSpring Security 基本身份验证只发生一次
【发布时间】:2014-11-17 09:15:13
【问题描述】:

最近我正在为我的 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 服务映射到前缀为“rest/”的 URL,当我第一次访问该 URL 时,浏览器会提示基本身份验证的用户名和密码字段。我用正确的凭据填充它,我的控制器成功访问。

但是如果我再次尝试使用浏览器访问相同的URL,它不会再次提示我基本认证的用户名和密码字段,而是直接访问该URL。

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

那么,我错过了什么吗?

【问题讨论】:

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


    【解决方案1】:

    浏览器缓存凭据。有时清除缓存无济于事。如何伪造它的唯一可靠方法是使用 Chrome 的隐身窗口 (Ctrl+N)。但是每个隐身窗口一个提示。所以当你想再次进入它们时,你需要新的隐身窗口。

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

    【讨论】:

    • 我尝试使用“从不”和“无状态”,但隐身窗口只提示一次这两个值。谢谢老兄。
    【解决方案2】:

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

    属性:create-session 控制 HTTP 的热切程度 session 由 Spring Security 类创建。如果未设置,则为默认值
    到“如果需要”。如果使用“无状态”,这意味着 应用程序保证它不会创建会话。这 不同于 Spring Security 将使用的“never” 不创建会话,但如果应用程序将使用一个会话 可以。

    数据类型:字符串枚举值: - 如果需要的话 - 总是 - 绝不 - 无状态

    你应该尝试使用

    “无状态”

    而不是

    从不

    【讨论】:

      猜你喜欢
      • 2011-02-11
      • 2016-03-20
      • 1970-01-01
      • 2016-04-30
      • 2013-01-11
      • 2015-07-22
      • 2013-05-13
      • 1970-01-01
      • 2012-08-15
      相关资源
      最近更新 更多