Angular2,ionic2,Spring security:“;代码";:&引用;401「&引用;“讯息”:&引用;访问此资源需要完全身份验证”;

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编写的。此外

我正在尝试为我正在开发的移动应用程序进行登录验证

Angular2(最终版)、rc6和ionic2,使用RESTAPI

我有两个API

一个用于发送登录id和密码

另一个是在成功的身份验证时获取用户的详细信息

我使用SpringSecurity来实现这个目的

我收到一个错误,上面写着“code”:“401”,“message”:“访问此资源需要完全身份验证”

我知道stackoverflow上有很多基于此的帖子,但我无法使用它们,因为它们要么不推荐使用,要么不是用typescript编写的。此外,所有这些帖子都基于单个HTTP调用,但我必须进行两次调用。我不知道我哪里出错了。我知道这应该是我一个非常简单的错误

这是login.ts页面,我从用户那里获取输入的参数。然后我进行两次http调用

  • 发送参数
  • 获取用户详细信息
  • 当用户通过身份验证且代码=200时,会生成一个“代码”。我的程序在这里运行良好,但我仍然无法检索用户详细信息,因为我得到了这个错误

     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() {
        }
    
    }
    

    你好你解决了这个问题吗?不,我解决不了。感谢您的帮助。谢谢:)我写了一个适合我的解决方案。嗨!你解决了这个问题吗?不,我解决不了。感谢您的帮助。谢谢:)我写了一个适合我的解决方案。