Spring Security AngularJS登录

时间:2016-03-03 13:30:45

标签: angularjs spring-security spring-boot

我有一个Spring Boot应用程序并为其配置了spring安全性,它使用一个带有简单AngularJS表单的自定义登录页面,并且我试图通过它进行身份验证但是没有成功。在我的CurrentUserDetailsS​​ervice loadUserByUsername(String param)中,参数param每次都为空,有人可以帮助我吗?我错过了什么吗?

这是我的表格:

<form role="form" action="" name="form" class="">
        <fieldset class="pure-group">
            <legend>Log In</legend>
            <div class="form-group">
                <label for="username">Username:</label> 
                <input type="text" class="form-control" id="username" name="username" ng-model="credentials.username"/>
            </div>
            <div class="form-group">
                <label for="password">Password:</label> 
                <input type="password"  class="form-control" id="password" name="password" ng-model="credentials.password"/>
            </div>
            <button ng-click="onLogin($event)" type="submit" class="btn btn-primary">Submit</button>
        </fieldset>
    </form>

这是我的js:

$scope.onLogin = function($event){
     $event.preventDefault();
     $http({
         method: 'POST',
         url:'/login',
         data: $scope.credentials
     })  
}   

这是我的安全配置:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .antMatchers("/newuser","/create").permitAll()
        .antMatchers("/css/**").permitAll()
        .antMatchers("/js/**").permitAll()
        .antMatchers("/**").hasRole("USER").anyRequest().authenticated()
        .and()
        .formLogin()
        .loginProcessingUrl("/login")
        .usernameParameter("username")
        .passwordParameter("password")
        .defaultSuccessUrl("/index.html")
        .loginPage("/loginpage.html")
        .and()
        .httpBasic()
        .and()
        .logout()
        .logoutUrl("/logout")
        .logoutSuccessUrl("/loginpage.html")
        .permitAll()
        .and()
        .csrf().csrfTokenRepository(csrfTokenRepository())
        .and()
        .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);

    }

这是我每次都会遇到的例外情况:

org.springframework.security.authentication.InternalAuthenticationServiceException: Cannot pass null or empty values to constructor

还想提一下,通过我的POST请求用户名和密码被发送

enter image description here

我尝试使用j_username和j_password但没有尝试。

2 个答案:

答案 0 :(得分:1)

尝试构建这样的帖子数据:

$scope.onLogin = function($event){
    $event.preventDefault();
    var data = 'username=' + encodeURIComponent($scope.credentials.username) +
        '&password=' + encodeURIComponent($scope.credentials.password) +
        '&submit=Login';
    $http.post('/login', data, {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        }
    });
}

这样它就是预期的Content-Type,如果我没弄错的话,它会与表格正常发布的方式相匹配。很抱歉没有详细说明。

答案 1 :(得分:0)

好像您将数据发布为JSON而不是form_data(单个参数用户名和密码)。有关详细信息,请参阅此答案:

How do I POST urlencoded form data with $http in AngularJS?