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

交叉源请求被阻止Symfony/ANGLARJS

孟哲
2023-03-14

当我试图从返回JSON的Symfony API获取Angular数据时,我目前面临一个错误:

“阻止跨源请求:同一源策略不允许读取位于的远程资源。”http://localhost:8000/customers. (原因:缺少CORS标头“访问控制允许原点”。)

以下是完整结果的截图:

我知道这个问题已经被问了很多次,但我找不到一个有效的答案。

当我不尝试在api控制器中检索$session时,它会工作,我会获得我需要的所有数据,但它不会,下面是我的api控制器:

/**
 * @Rest\View(statusCode=Response::HTTP_CREATED)
 * @Rest\Get("/customers")
 */

/**
 * @Rest\View(statusCode=Response::HTTP_CREATED)
 * @Rest\Get("/index")
 */
public function getIndexAction(Request $request)
{
    $loginad = $this->getUser()->getUsername();

    $nom_ad = "******";
    $port_ad = ******;
    $compte_ad = "*******";
    $password_ad = "******";
    //parcours de l'AD
    // Connexion LDAP
    $ldapconn = ldap_connect($nom_ad, $port_ad)
    or die("Impossible de se connecter au serveur LDAP $nom_ad");
    if ($ldapconn){
        $ldapbind = ldap_bind($ldapconn, $compte_ad, $password_ad)
        or die("Impossible de se binder au serveur LDAP $nom_ad");
        if($ldapbind){
            $employeeID = false;
            $dn = "OU=CER35,DC=CeRNum,DC=dom";
            $filter="(samAccountName=$loginad)";
            $justtheseattributes = array( "ou", "sn", "givenname", "mail", "employeeid", "samaccountname");
            $sr=ldap_search($ldapconn, $dn, $filter, $justtheseattributes);
            $info = ldap_get_entries($ldapconn, $sr);
            for ($i=0;$i<$info["count"];$i++) {
                $employeeID = $info[$i]["employeeid"][0];
            }
            if (!$employeeID) {
                $dn = "OU=CER56,DC=CeRNum,DC=dom";
                $filter="(samAccountName=$loginad)";
                $justtheseattributes = array( "ou", "sn", "givenname", "mail", "employeeid", "samaccountname");
                $sr=ldap_search($ldapconn, $dn, $filter, $justtheseattributes);
                $info = ldap_get_entries($ldapconn, $sr);
                for ($i=0;$i<$info["count"];$i++) {
                    $employeeID = $info[$i]["employeeid"][0];
                }
            }
        }
    }

    $agent = $this->get('doctrine')
        ->getRepository('CERAgentBundle:Agent', 'agent')
        ->findByCode($employeeID);

    $session = new Session();
    $session->set('agent', $agent);

    $formatted = [
        'civilite' => $agent[0]->getCivilite(),
        'prenom' => $agent[0]->getPrenom(),
        'nom' => $agent[0]->getNom()
        ];

    return new JsonResponse($formatted);
}

所以当我调用“localhost:8000/index”时,一个用于CAS服务器身份验证的捆绑包也调用了一个https URL,这样用户就可以向内部网的公司进行身份验证,完成后,他们最终可以从localhost:8000/index检索结果

这是我的角度控制器:

angular.module('frontProfilDeveloppementApp')
.controller('ClientsCtrl', function ($scope, $http){
    $http.get('http://localhost:8000/customers')
        .then(function (data) {
            $scope.result = data;
        });
});

nelmio_corsbundle配置:

nelmio_cors:
    defaults:
        allow_credentials: true
        allow_origin: ['*']
        allow_headers: ['*']
        allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
        max_age: 3600
        hosts: []
        origin_regex: false

CAS捆绑包配置:

p_rayno_cas_auth:
server_login_url: https://extranet-authentification-******/cas-a3net/
server_validation_url: https://extranet-authentification-*****/cas-a3net/serviceValidate
server_logout_url: https://extranet-authentification-****/cas-a3net/logout

(security.yml):

security:
providers:
    cas:
      id: prayno.cas_user_provider
role_hierarchy:
      ROLE_ADMIN:       ROLE_USER
      ROLE_SUPER_ADMIN: ROLE_ADMIN

firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main:
        anonymous: ~
        logout: ~
        guard:
            authenticators:
                - prayno.cas_authenticator

access_control:
    - { path: /index, roles: ROLE_USER}

我认为我的应用编程接口没有设置与角做相同的标题,所以浏览器不允许抓取。

是否可以直接从Angular controller设置headers选项,以便与api选项匹配?

共有2个答案

姬俊驰
2023-03-14

您可以禁用标题。解决之道在于https://www.youtube.com/watch?v=uDy_cvf4nDg

居乐池
2023-03-14

您应该始终返回Symfony的响应实例,而不是直接返回$customers结果集。

下面是一个如何实现的示例:返回新的JsonResponse($customers,200,array('Access-Control-Allow-Origin'=

你也可以在这里找到更多的细节。

symfony2上的AJAX跨域

 类似资料:
  • 我也在应用程序根目录中使用。htaccess文件。(waleedahmad.kd.io/node)。

  • 当我放入allog-same-orgin时,它可以工作,但当我移除它时,我有: 阻止来源为“http://localhost:****”的帧访问跨来源的帧。 iframe src: 端口是相同的,我需要避免允许cookie安全来源相同

  • 如何通过 ajax 从远程 url 获取内容? jQuery ajax请求被阻止,因为跨源 控制台日志 跨来源请求被阻止:同一来源策略不允许读取http://www.dailymotion.com/embed/video/x28j5hv.的远程资源(原因:CORS标头“Access-Control-Allow-Origin”缺失)。 已阻止跨源请求:同源策略不允许读取位于的远程资源http://w

  • 问题内容: 因此,我有了这个Go http处理程序,该处理程序将一些POST内容存储到数据存储中,并检索其他一些信息作为响应。在后端,我使用: 在我的firefox OS应用程序中,我使用: 传入的部分都一直如此。但是,我的回复被阻止了。给我以下信息: 我尝试了许多其他操作,但是无法从服务器获得响应。但是,当我将Go POST方法更改为GET并通过浏览器访问该页面时,我得到的数据太糟糕了。我无法真

  • 如何分享Cookie交叉起源?更具体地说,如何将头与头结合使用? 下面是对我的情况的解释: 我正在尝试为运行在上的web应用程序中的上的API设置cookie。 似乎我在浏览器中收到了正确的响应头,但不幸的是它们没有效果。这些是响应头: 此外,当我使用Chrome开发人员工具的Network选项卡检查流量时,我可以在下看到cookie。但是,我看不到在下的Application选项卡中设置了coo

  • 我正在尝试一些非常简单的方法,但由于某些原因它不起作用: 启动index.html时出现的错误: 无法加载文件:///e:/dev/eclipse/syrilab/pages/header.html:跨源请求仅支持协议方案:http、data、chrome、chrome-extension、HTTPS。 无法加载文件:///e:/dev/eclipse/syrilab/pages/home.htm