我正在使用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
并确定登录是否成功。但我尽量不走那条路。需要严重的建议。
答案 0 :(得分:0)
经过数小时的谷歌搜索,我找到了一种方法来抑制302,从而避免了基于此article的重定向。解决方案是在登录过滤器和SimpleUrlAuthenticationFailureHandler
表单中注入自定义身份验证成功处理程序,以处理失败的身份验证。