无法使身份验证工作

时间:2015-10-13 19:46:11

标签: java angularjs spring rest spring-security

我正在努力使用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,但仍未获得所需的结果。

有什么建议吗?谢谢!

1 个答案:

答案 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
        });
    }

如果上面没有编译,因为我根本无法测试/验证它,请原谅。