Spring Security AngularJS 登录
Posted
技术标签:
【中文标题】Spring Security AngularJS 登录【英文标题】:Spring Security AngularJS Login 【发布时间】:2016-06-16 20:40:35 【问题描述】:我有一个 Spring Boot 应用程序并为其配置了 spring 安全性,它使用一个带有简单 AngularJS 表单的自定义登录页面,我试图通过它进行身份验证但未成功。在我的 CurrentUserDetailsService loadUserByUsername(String param) 参数param
comes 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 登录的主要内容,如果未能解决你的问题,请参考以下文章
如何使用angularjs登录到spring security
使用 Spring Security 和 AngularJS 预防 CSRF
Spring Security 401 - 使用 / Angularjs 调用 restful 服务