Angular2,ionic2,Spring security:“;代码";:&引用;401「&引用;“讯息”:&引用;访问此资源需要完全身份验证”;
我正在尝试为我正在开发的移动应用程序进行登录验证 Angular2(最终版)、rc6和ionic2,使用RESTAPI 我有两个API 一个用于发送登录id和密码 另一个是在成功的身份验证时获取用户的详细信息 我使用SpringSecurity来实现这个目的 我收到一个错误,上面写着“code”:“401”,“message”:“访问此资源需要完全身份验证” 我知道stackoverflow上有很多基于此的帖子,但我无法使用它们,因为它们要么不推荐使用,要么不是用typescript编写的。此外,所有这些帖子都基于单个HTTP调用,但我必须进行两次调用。我不知道我哪里出错了。我知道这应该是我一个非常简单的错误 这是login.ts页面,我从用户那里获取输入的参数。然后我进行两次http调用Angular2,ionic2,Spring security:“;代码";:&引用;401「&引用;“讯息”:&引用;访问此资源需要完全身份验证”;,angular,typescript,login,spring-security,ionic2,Angular,Typescript,Login,Spring Security,Ionic2,我正在尝试为我正在开发的移动应用程序进行登录验证 Angular2(最终版)、rc6和ionic2,使用RESTAPI 我有两个API 一个用于发送登录id和密码 另一个是在成功的身份验证时获取用户的详细信息 我使用SpringSecurity来实现这个目的 我收到一个错误,上面写着“code”:“401”,“message”:“访问此资源需要完全身份验证” 我知道stackoverflow上有很多基于此的帖子,但我无法使用它们,因为它们要么不推荐使用,要么不是用typescript编写的。此外
import { Component } from '@angular/core';
import { NavController, NavParams } from 'ionic-angular';
import { FormBuilder, FormGroup, Validators, AbstractControl } from '@angular/forms';
import { checkFirstCharacterValidator } from '../Validators/customvalidator';
import { EmailValidator } from '../Validators/emailvalidator';
import { Http, Headers, Response, RequestOptions, BaseRequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/catch';
declare var sha256_digest: any;
@Component({
selector: 'page-login',
templateUrl: 'login.html'
})
export class LoginPage
{
loginform : FormGroup;
constructor(public navCtrl: NavController, public navParams: NavParams, fb: FormBuilder,public http:Http)
{
this.loginform = fb.group
({
'email' : [null, Validators.compose([Validators.required, Validators.minLength(5), Validators.maxLength(40),checkFirstCharacterValidator(/^\d/),
EmailValidator.isValidMailFormat])],
'password': [null, Validators.compose([Validators.required, Validators.maxLength(25),])]
})
}
private extractData(res: Response) {
let body = res.json();
console.log(body);
return body || {};
}
submitForm(value: any):void
{
console.log('Form submited!');
value.password = sha256_digest(value.password);
console.log(value);
var userdata =
{
login:value.email,
password:value.password
};
let headers = new Headers({'Content-Type': 'application/json'});
headers.append('Authorization','Basic ');
let options = new RequestOptions({headers: headers});
this.http.post('dummy/api/login',userdata,options).map(res=>res.json()).subscribe(resp=>
{
console.log(resp.data);
if(resp.code === 200)
{
return this.http.get('dummy/api/auth/registration/success',options)
.subscribe(resp=>{
console.log(resp);
});
}
},
err=>{console.log(err);},
()=>{});
}
ionViewDidLoad() {
console.log('ionViewDidLoad LoginPage');
}
}
我甚至尝试了这个版本的标题:
let headers = new Headers();
headers.append("Authorization", "Basic " + btoa(userdata.login + ":" + userdata.password));
headers.append("Content-Type", "application/x-www-form-urlencoded");
请帮助我纠正此错误。以下是我尝试的所有来源:
我也犯了同样的错误。除了一个方案外,所有的方案都不适合我。问题在于,我是从位于另一个端口的UI/客户端访问后端服务的,它不是整个Spring(在我的例子中是microservices)设置的一部分。最后,一切都归结于科尔斯 下面建议的解决方案必须在后端服务(具有Spring安全性)中实现,该服务由UI或其他服务从另一个端口访问 希望有帮助
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCorsFilter implements Filter {
Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void init(FilterConfig fc) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) resp;
HttpServletRequest request = (HttpServletRequest) req;
// FIXME: this is a temp solution for CORS
response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, Content-Type, Authorization, credential, X-XSRF-TOKEN");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, resp);
}
}
@Override
public void destroy() {
}
}
我也犯了同样的错误。除了一个方案外,所有的方案都不适合我。问题在于,我是从位于另一个端口的UI/客户端访问后端服务的,它不是整个Spring(在我的例子中是microservices)设置的一部分。最后,一切都归结于科尔斯 下面建议的解决方案必须在后端服务(具有Spring安全性)中实现,该服务由UI或其他服务从另一个端口访问 希望有帮助
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCorsFilter implements Filter {
Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void init(FilterConfig fc) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) resp;
HttpServletRequest request = (HttpServletRequest) req;
// FIXME: this is a temp solution for CORS
response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, Content-Type, Authorization, credential, X-XSRF-TOKEN");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, resp);
}
}
@Override
public void destroy() {
}
}
你好你解决了这个问题吗?不,我解决不了。感谢您的帮助。谢谢:)我写了一个适合我的解决方案。嗨!你解决了这个问题吗?不,我解决不了。感谢您的帮助。谢谢:)我写了一个适合我的解决方案。