AngularJS:如何解析302

时间:2016-05-03 14:04:15

标签: angularjs login spring-security httprequest

我正在使用AngularJS实现一个Login页面,以针对LDAP服务器进行身份验证。后端的身份验证由Spring Security完成。基本上,用户名和密码通过一个post请求发送到服务器,该请求由Spring处理,没有显式处理程序。

当我提交登录表单时,帖子请求返回302并根据凭据是否有效重定向到另一个URL。如果密码正确,它将向“http://localhost:8080/”发起GET请求。如果密码错误,则会重定向到“http://localhost:8080/login?error”。这是Spring Security的已知行为。根据{{​​3}},“Spring Security默认行为是成功和失败发送302,Angular将遵循重定向,因此我们必须实际解析响应”。在Dave的教程中,他使用辅助函数来验证一般情况下的身份验证。我认为它不适用于LDAP身份验证。

我找到了另一篇非常相似的帖子Dave Syer's article。虽然根据最后的评论它没有正式答案,但似乎修改Java配置中的.antMatchers中的路径可能已经解决了这个问题。然而,我来回使用我的安全配置(见下文),它似乎没有帮助。

protected void configure(HttpSecurity http) throws Exception {
    http
        .httpBasic().and()
        .addFilterBefore(new CORSFilter(), ChannelProcessingFilter.class)
        .csrf().disable()
        .authorizeRequests()
        .antMatchers("/login/", "/login","login/")
        .permitAll()
            .anyRequest()
            .authenticated()
        .and()
        .formLogin();
}

虽然302没有产生任何响应,但客户端根据凭证的有效性以某种方式知道要重定向到哪个URL。我的理解是服务器必须以“秘密”的方式告知客户端身份验证是否成功。如果我在客户端发送GET请求之前捕获并解析此隐藏信息,我可以使用Angular进行身份验证。像这样的东西(部分伪代码):

app.controller("LoginCtrl", ['$scope', '$location', 
function($scope, $location){
    $scope.authenticate = function() {
        loginFactory.login($scope.username, $scope.password) {
        // pseudo code starts
        if (redirect.path == 'localhost') {
             $location.path('/main');
        }
        else {
            $location.path('/loginfail');
            console.log("Login failed");
        }
    }
}]);

问题是如何在重定向发生之前诊断302并确定响应的性质?最糟糕的情况是,我可以让重定向开始,并从GET请求中获取response.path并确定登录是否成功。但我尽量不走那条路。需要严重的建议。

1 个答案:

答案 0 :(得分:0)

经过数小时的谷歌搜索,我找到了一种方法来抑制302,从而避免了基于此article的重定向。解决方案是在登录过滤器和SimpleUrlAuthenticationFailureHandler表单中注入自定义身份验证成功处理程序,以处理失败的身份验证。