我正在努力使用Spring Security创建一个小型身份验证系统几个小时,但我还没有运气。
我想要的是一个登录表单,它通过AngularJS到达数据库并使用提供的数据进行搜索。为了使其工作,我尝试使用内存数据库。
以下是我使用的代码:
@RestController
@RequestMapping("/authentication")
public class AuthenticationController {
@RequestMapping("/user")
public Principal user(Principal user) {
return user;
}
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/index.html", "/home.html", "/login.html", "/lib/**", "/app/**", "/css/**", "/js/**").permitAll().anyRequest()
.authenticated();
http.formLogin().loginPage("/login.html").defaultSuccessUrl("/index.html")
.failureUrl("/login?error").permitAll();
// Logout
http.logout().logoutUrl("/logout").logoutSuccessUrl("/login?logout")
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
// Authorization
auth.inMemoryAuthentication().withUser("user").password("p1")
.roles("USER");
auth.inMemoryAuthentication().withUser("root").password("p2")
.roles("USER", "ADMIN");
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
}
}
这是Angular的身份验证功能:
function($rootScope, $scope, $http, $location) {
var authenticate = function(credentials, callback) {
var headers = credentials ? {
authorization : "Basic "
+ btoa(credentials.username + ":"
+ credentials.password)
} : {};
$http.get('authentication/user', {
headers : headers
}).success(function(data) {
console.log(data.name);
if (data.name) {
$rootScope.authenticated = true;
} else {
$rootScope.authenticated = false;
}
callback && callback();
}).error(function() {
$rootScope.authenticated = false;
callback && callback();
});
}
authenticate();
$scope.credentials = {};
$scope.login = function() {
authenticate($scope.credentials, function() {
if ($rootScope.authenticated) {
$location.path("/index.html");
$scope.error = false;
} else {
//$location.path("/login");
$scope.error = true;
}
});
};
});
你知道为什么这不起作用吗?我提供的代码来自一些非常相似的教程。我尝试了一种稍微不同的方法,使用httpBasic
,但仍未获得所需的结果。
有什么建议吗?谢谢!
答案 0 :(得分:0)
在我的时区已经很晚了,无法测试&执行您的代码:),但从我的角度来看,您没有机会正确运行代码。
您不恰当地将基本身份验证与表单登录身份验证混合在一起。您声明表单登录:
http.formLogin().loginPage("/login.html").defaultSuccessUrl("/index.html")
.failureUrl("/login?error").permitAll();
简要表示您需要使用POST登录到/login.html页面。
表单登录意味着您应该使用带有用户名&的角度发布表单。包含密码字段(就好像您使用POST方法发布了一个普通表单)。因此,您应该在身份验证功能中使用以下内容:
var authenticate = function(credentials, callback) {
$http.post('login.html', {username: username, password: password} ).success(function(data) {
// do something
}).error(function() {
// do something
});
}
如果上面没有编译,因为我根本无法测试/验证它,请原谅。