Spring Security 3.0:基本身份验证提示消失

时间:2012-04-27 09:29:29

标签: spring spring-security basic-authentication

我在安全xml中使用spring基本身份验证并使用以下设置:

<http use-expressions="true" create-session="never" >
        <intercept-url pattern="/**" method="GET" access="isAuthenticated()" />
        <intercept-url pattern="/**" method="POST" access="isAuthenticated()" />
        <intercept-url pattern="/**" method="PUT" access="isAuthenticated()" />
        <intercept-url pattern="/**" method="DELETE" access="isAuthenticated()" />
        <http-basic />
    </http>

如果身份验证失败,浏览器会弹出一个提示窗口来管理用户名和密码。 有没有办法让这个提示根本没有弹出?

3 个答案:

答案 0 :(得分:1)

最有可能用于身份验证失败的页面也受到保护。您可以尝试手动将故障页面设置为未受保护的页面,如

 <access-denied-handler error-page="/login.jsp"/> 

一起
 <intercept-url pattern="/*login*" access="hasRole('ROLE_ANONYMOUS')"/>

<intercept-url pattern='/*login*' filters='none'/>  

或者您可以使用http元素的auto-config='true'属性来解决这个问题。查看更多here

答案 1 :(得分:0)

对于浏览器中的REST API抛出登录对话框,我也遇到了同样的问题。如您所知,当浏览器将响应标题视为

   WWW-Authenticate:Basic realm =&#34; Spring Security Application

它将使用基本身份验证对话框进行提示。对于基于REST API的登录,这并不理想。我是这样做的。定义一个自定义身份验证入口点并在开始 将标题设置为&#34; FormBased&#34;

  

response.setHeader(&#34; WWW-Authenticate&#34;,&#34; FormBased&#34;);

下面的application-context.xml配置

<security:http create-session="never" entry-point-ref="authenticationEntryPoint" authentication-manager-ref="authenticationManager">
    <security:custom-filter ref="customRestFilter" position="BASIC_AUTH_FILTER" />
    <security:intercept-url pattern="/api/**" access="ROLE_USER" />
</security:http>

<bean id="authenticationEntryPoint" class="com.tito.demo.workflow.security.RestAuthenticationEntryPoint">
</bean>

下面的自定义入口点类。

@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

    private static Logger logger = Logger.getLogger(RestAuthenticationEntryPoint.class);

    public void commence( HttpServletRequest request, HttpServletResponse response,
                          AuthenticationException authException ) throws IOException {
        logger.debug("<--- Inside authentication entry point --->");
        // this is very important for a REST based API login. 
        // WWW-Authenticate header should be set as FormBased , else browser will show login dialog with realm
        response.setHeader("WWW-Authenticate", "FormBased");
        response.setStatus( HttpServletResponse.SC_UNAUTHORIZED );
    }


}

注意:我使用过spring 3.2.5.Release

现在,当从像POSTMAN这样的restclient命中其他API时,服务器将返回401 Unauthorized。

答案 2 :(得分:0)

我遇到了同样的问题,我所做的是在资源服务器中创建自定义0 0。这可以防止 Outh2 发送RequestMatcher

示例:

WWW-Authenticate header