Spring Security AngularJS 登录

Posted

技术标签:

【中文标题】Spring Security AngularJS 登录【英文标题】:Spring Security AngularJS Login 【发布时间】:2016-06-16 20:40:35 【问题描述】:

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

这是我的表格:

<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请求发送用户名和密码

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

【问题讨论】:

【参考方案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'
        
    );

这样它将是预期的内容类型,如果我没记错的话,它与表单正常发布的方式相匹配。抱歉没有详细说明。

【讨论】:

基本上是@ajaegle 在他引用的线程中所指的内容之一【参考方案2】:

似乎您将数据发布为 JSON 而不是 form_data(单参数用户名和密码)。详情请看这个答案:

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

【讨论】:

以上是关于Spring Security AngularJS 登录的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security AngularJS 登录

如何使用angularjs登录到spring security

使用 Spring Security 和 AngularJS 预防 CSRF

Spring Security 401 - 使用 / Angularjs 调用 restful 服务

将 Spring Security 添加到现有 Spring AngularJS 应用程序

如何使用 Spring Security 和 Angularjs 保护 Spring Rest 服务?