当前位置: 首页 > 知识库问答 >
问题:

如何从angular localhost:4200调用spring security azure AD localhost:8080。azure调用出错

孟健
2023-03-14
import java.util.Arrays;
import java.util.Collections;

import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

private final OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService;

public SecurityConfiguration(OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService) {
    System.out.println("loading user:" + oidcUserService);
    this.oidcUserService = oidcUserService;
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors()
    .and().authorizeRequests()
    .anyRequest()
    .authenticated()
    .and()
    .oauth2Login()
    .userInfoEndpoint().oidcUserService(oidcUserService);
}

 @Bean
    CorsConfigurationSource corsConfigurationSource() 
    {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("*"));
    configuration.setAllowedMethods(Arrays.asList("*"));
    configuration.setAllowedHeaders(Arrays.asList("*"));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
    }
    package com.example.demo;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.CrossOrigin;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class AccountResource {
    
        @Autowired
        AdUserInfo adUserInfo;
    
        @CrossOrigin(origins = "http://localhost:4200")
        @GetMapping("/account")
        public AdInfo getAccount() {
            adUserInfo.setEmail("abc@gmail.com");
            return new AdInfo();
        }
    }
        import { Injectable } from '@angular/core';
        import { HttpClient } from '@angular/common/http';
        import { Observable, Subject } from 'rxjs';
        import { AdInfo } from './ad-info';
        @Injectable({
          providedIn: 'root'
        })
        export class LoginService {
          private loginUrl: string;
          constructor(private http: HttpClient) {
            this.loginUrl = 'http://localhost:8080/account';
          }
        
          public login(): Observable<AdInfo> {
            return this.http.get<AdInfo>(this.loginUrl);
          }
        
        }

角类:

            export class AdInfo {
                id: string;
                name: string;
                email: string;
            }

从http://localhost:8080调用正常工作。它将转到azure并登录。按照•https://docs.microsoft.com/en-us/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory。

现在我想从Angular UI调用它。所以localhost:4200。做了一个登录页面。Onlick登录按钮。它正在调用localhost:8080。但显示重定向到azure ad登录时出错。

CORS策略阻止了对“https://login.microsoftonline.com/common/oauth2/authorize?response_type=code&client_id=*****&scope=openid20https://graph.microsoft.com/user.read&state=du8jvhsegdd3xcbft6b683mdrw8zedppel1xz6lbzwy%3d&redirect_uri=http://localhost:4200/login/oauth2/code/azure”(从“http://localhost:4200/account”重定向)的XMLHttpRequest的访问:对preflight请求的响应未通过访问控制检查:请求的资源上没有“access-control-allow-origin”标头。

共有1个答案

海嘉赐
2023-03-14

您可能面临的问题是spring security不允许通过飞行前检查请求并使其失败。

添加

configuration.setAllowedHeaders(Arrays.asList("Origin", "Content-Type", "Accept","Authorization"));
configuration.setAllowedMethods(Arrays.asList("GET","POST"));

在Angular中尝试将代理添加到后端服务器

 类似资料:
  • 问题内容: 如何从Java调用GraphViz,以及如何使用Java调用GraphViz函数?为了访问用于构建点图的GraphViz库,必须包含哪些必需的jar文件?是否有用于生成点图的示例程序 问题答案: 检查此 API,它很简单,并且具有几种输出格式(即pdf gif ..etc)。 编辑2016年5月: 许多人评论说该API不再可用;这里是其源代码: 首先,您需要创建并复制以下文件,然后粘贴

  • 问题内容: 我们如何从Android调用javascript?我有一个我想使用的javascript库,我想调用javascript函数并将结果值传递给android java代码。从现在开始还没有找到答案。我设法从javascript调用android代码,但我想反过来。 问题答案: 有一个hack: 绑定一些Java对象,以便可以使用WebView从Javascript调用它: 通过以下方式强

  • 问题内容: 有没有办法从Swift调用C例程? 许多iOS / Apple库仅是C语言,我仍然希望能够调用它们。 例如,我希望能够从Swift调用objc运行时库。 特别是,如何桥接iOS C标头? 问题答案: 是的,您当然可以与Apples C库进行交互。这里说明了如何。 基本上,C型,C指针等被翻译成对象斯威夫特,例如C 在夫特是一个。 我为另一个问题构建了一个小例子,该例子可以作为对C和Sw

  • 问题内容: 我有一个想从Java使用的Perl模块。是否可以使用Windows上的ActiveState Perl或Linux随附的通用Perl来调用此代码?我找到了对JPL的引用,但似乎不再维护了。 问题答案: Inline-Java是从Perl调用Java的常用库,因此本文提出了 org.perl.java 模块,该模块应允许按要求从Java调用Perl。 但是,由于不同的JVM的JNI实现的

  • 问题内容: 我需要从我的C ++程序中运行以下行: java -jar test.jar text1 text2 Java应用程序将给出一个float值并将其提供给c ++程序。 我怎样才能做到这一点?我从未从ms visual studio C ++文件中调用过Java东西。 问题答案: 当我直接在命令提示符下运行java命令时,它可以工作。但是当我从c ++文件运行命令时,错误显示“系统无法执

  • 我正试图从我的android模拟器访问localhost上的API。我在API上有一个断点。Postman调用API时没有任何问题,但android模拟器没有激活API上的断点。 改装代码: 呼叫代码: 我的设置有什么问题吗?你能帮帮我吗。