Политика AccessEntity

Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X.
информация

Что

Извлекает указанные вами профили объектов из хранилища данных Apigee Edge. Политика помещает профиль в переменную, имя которой имеет формат AccessEntity.{policy_name} . Вы можете использовать AccessEntity для доступа к профилям следующих объектов:

  • Приложение
  • API-продукт
  • Компания
  • Компания-разработчик
  • Потребительский ключ
  • Разработчик

Политика AccessEntity функционирует как поиск в базе данных времени выполнения на основе политики. Вы можете использовать информацию профиля, возвращаемую этой политикой, для включения динамического поведения, такого как условная маршрутизация конечной точки, выполнение потока, применение политики.

Вы используете политику AccessEntity , чтобы получить данные профиля сущности в формате XML и поместить их в переменную. Вы идентифицируете сущность, которую хотите получить, указав тип сущности и один или несколько идентификаторов, которые определяют, какая сущность этого типа вам нужна. Позже, в другой политике, вы можете получить данные профиля сущности с помощью другой политики, например политики ExtractVariables или политики AssignMessage .

Образцы

В следующих примерах показано, AccessEntity используется в сочетании с политиками ExtractVariables и AssignMessage для извлечения электронного письма разработчика и добавления его в HTTP-заголовок.

Получение электронной почты разработчика для использования в других политиках

Настройте политику AccessEntity , чтобы указать, какой профиль объекта следует получать из Edge, а также куда поместить данные профиля.

В следующем примере политика получает профиль сущности developer , используя ключ API, переданный в качестве параметра запроса, для идентификации разработчика. Профиль помещается в переменную, имя которой имеет форму AccessEntity.{policy_name} . Таким образом, переменная, установленная этой политикой, будет AccessEntity.GetDeveloperProfile .

<AccessEntity name="GetDeveloperProfile">
  <!-- This is the type entity whose profile we need to pull from the Edge datastore. -->
  <EntityType  value="developer"/>
  <!-- We tell the policy to use the API key (presented as query parameter) to identify the developer. -->
  <EntityIdentifier ref="request.queryparam.apikey" type="consumerkey"/> 
</AccessEntity>

Используйте другую политику, чтобы получить значение профиля сущности из переменной, установленной AccessEntity .

В следующем примере политика ExtractVariables извлекает значение из переменной AccessEntity.GetDeveloperProfile , установленной ранее AccessEntity .

Обратите внимание, что полученное значение указывается как выражение XPath в элементе XMLPayload . Извлеченное значение помещается в переменную developer.email .

<ExtractVariables name="SetDeveloperProfile">
  <!-- The source element points to the variable populated by AccessEntity policy. 
  The format is <policy-type>.<policy-name>.
  In this case, the variable contains the whole developer profile. -->
  <Source>AccessEntity.GetDeveloperProfile</Source> 
  <VariablePrefix>developer</VariablePrefix>
  <XMLPayload>
    <Variable name="email" type="string"> 
        <!-- You parse elements from the developer profile using XPath. -->
      <XPath>/Developer/Email</XPath>
    </Variable>
  </XMLPayload>
</ExtractVariables>

Следующая политика AssignMessage извлекает адрес электронной почты разработчика, заданный политикой ExtractVariables .

<!-- We'll use this policy to return the variables set in the developer profile, 
just so that we can easily see them in the response. -->
<AssignMessage name="EchoVariables">
  <AssignTo createNew="false" type="response"></AssignTo>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <Set>
    <Headers>
      <Header name="X-Developer-email">{developer.email}</Header>
    </Headers>
  </Set>
</AssignMessage>

Ссылка на элемент

Основная структура политики AccessEntity :

<AccessEntity name="policy_name">
  <EntityType  value="entity_type"/>
  <EntityIdentifier ref="entity_identifier" type="identifier_type"/> 
  <SecondaryIdentifier ref="secondary_identifier" type="identifier_type"/>
</AccessEntity>

Вы можете получить доступ к нескольким объектам одного типа, сгруппировав их в элементе Identifiers :

<AccessEntity name="name_of_the_policy">
  <EntityType  value="type_of_entity"/>
  <Identifiers>
    <Identifier>
      <EntityIdentifier ref="reference_to_entity_identifier" type*="identifier_type"/> 
      <SecondaryIdentifier ref="reference_to_secondary_entity_identifier" type="identifier_type"/><!-- optional -->
    </Identifier >
    <Identifier>
      <EntityIdentifier ref="reference_to_entity_identifier" type*="identifier_type"/> 
      <SecondaryIdentifier ref="reference_to_secondary_entity_identifier" type="identifier_type"/><!-- optional -->
    </Identifier >
  </Identifiers>
</AccessEntity>

Атрибуты <AccessEntity>

<AccessEntity async="false" continueOnError="false" enabled="true" name="policy_name">

В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:

Атрибут Описание По умолчанию Присутствие
name

Внутреннее имя политики. Значение атрибута name может содержать буквы, цифры, пробелы, дефисы, подчеркивания и точки. Это значение не может превышать 255 символов.

При необходимости используйте элемент <DisplayName> , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

Н/Д Необходимый
continueOnError

Установите значение false , чтобы возвращать ошибку в случае сбоя политики. Это ожидаемое поведение для большинства политик.

Установите значение true , чтобы выполнение потока продолжалось даже после сбоя политики.

ЛОЖЬ Необязательный
enabled

Установите значение true , чтобы обеспечить соблюдение политики.

Установите значение false , чтобы отключить политику. Политика не будет применена, даже если она останется привязанной к потоку.

истинный Необязательный
async

Этот атрибут устарел.

ЛОЖЬ Устарело

Элемент <DisplayName>

Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

<DisplayName>Policy Display Name</DisplayName>
По умолчанию

Н/Д

Если вы опустите этот элемент, будет использовано значение атрибута name политики.

Присутствие Необязательный
Тип Нить

Элемент <EntityIdentifier>

Указывает конкретную сущность типа, указанного в EntityType, которую необходимо получить.

<EntityIdentifier ref="value_variable" type="identifier_type"/> 

По умолчанию

Н/Д

Присутствие

Необходимый

Тип

Нить

Атрибуты

Атрибут Описание По умолчанию Присутствие Тип
ссылка

Переменная, предоставляющая источник идентификатора, например request.queryparam.apikey .

Н/Д Необходимый. Нить
тип Тип, заполняемый переменной в атрибуте ref. например, consumerkey . Список значений см. в разделе Типы и идентификаторы сущностей . Необходимый. Нить

Пример

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AccessEntity async="false" continueOnError="false" enabled="true" name="GetCompany">
    <DisplayName>GetCompanyProfile</DisplayName>
    <EntityType value="company"></EntityType>
    <EntityIdentifier ref="request.queryparam.apikey" type="consumerkey"/>
</AccessEntity>

Элемент <EntityType>

Указывает тип объекта, который необходимо получить из хранилища данных.

<EntityType  value="entity_type"/>

По умолчанию

Н/Д

Присутствие

Необходимый

Тип

Нить

Используйте элемент EntityIdentifier чтобы указать, какая сущность данного типа вам нужна. Справочную информацию о типах сущностей см. в разделе Типы и идентификаторы сущностей .

Атрибуты

Атрибут Описание По умолчанию Присутствие Тип
ценить Один из поддерживаемых типов объектов. Список см. в разделе Типы и идентификаторы сущностей . Никто. Необходимый. Нить

Элемент <SecondaryIdentifier>

В сочетании с EntityIdentifier указывает значение для идентификации желаемого экземпляра данного EntityType .

<SecondaryIdentifier ref="value_variable" type="identifier_type"/>

По умолчанию

Н/Д

Присутствие

Необязательный

Тип

Нить

Использование SecondaryIdentifier при указании только EntityIdentifier не гарантирует получение одной сущности. Дополнительную информацию см. в разделе Сужение результатов с помощью вторичных идентификаторов .

Использование нескольких элементов SecondaryIdentifier не поддерживается.

Атрибуты

Атрибут Описание По умолчанию Присутствие Тип
ссылка

Переменная, предоставляющая источник идентификатора, например request.queryparam.apikey .

Н/Д Необходимый. Нить
тип Тип, заполняемый переменной в атрибуте ref. например, consumerkey . Список значений см. в разделе Типы и идентификаторы сущностей . Необходимый. Нить

Пример

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AccessEntity async="false" continueOnError="false" enabled="true" name="GetAPIProduct">
    <DisplayName>GetAPIProduct</DisplayName>
    <EntityType value="apiproduct"></EntityType>
    <EntityIdentifier ref="developer.app.name" type="appname"/> 
    <SecondaryIdentifier ref="developer.id" type="developerid"/> 
</AccessEntity>

Примечания по использованию

Сужение результатов с помощью вторичных идентификаторов

Для некоторых сущностей указание одного идентификатора может быть недостаточно конкретным для получения нужной сущности. В таких случаях вы можете использовать вторичный идентификатор, чтобы сузить результаты.

Ваша первая, возможно, широкая конфигурация политики может выглядеть так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AccessEntity async="false" continueOnError="false" enabled="true" name="GetApp">
    <DisplayName>GetAppProfile</DisplayName>
    <EntityType value="apiproduct"></EntityType>
    <EntityIdentifier ref="request.queryparam.apikey" type="consumerkey"/>
</AccessEntity>

Поскольку приложение может быть связано с несколькими продуктами API, использование только идентификатора приложения может не вернуть нужный вам продукт API (вы можете получить только первый из нескольких соответствующих продуктов).

Вместо этого, чтобы получить более точный результат, вы можете использовать SecondaryIdentifier . Например, в потоке могут быть переменные appname и developerid , поскольку они заполняются по умолчанию во время обмена OAuth 2.0. Вы можете использовать значения этих переменных в политике AccessEntity , чтобы получить сведения о профиле запрашивающего приложения.

Более конкретная конфигурация политики может выглядеть так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AccessEntity async="false" continueOnError="false" enabled="true" name="GetApp">
    <DisplayName>GetAppProfile</DisplayName>
    <EntityType value="apiproduct"></EntityType>
    <EntityIdentifier ref="developer.app.name" type="appname"/> 
    <SecondaryIdentifier ref="developer.id" type="developerid"/> 
</AccessEntity>

Поддерживаемые типы и идентификаторы объектов

AccessEntity поддерживает следующие типы и идентификаторы объектов.

Значение типа сущности Типы идентификаторов объектов Типы вторичных идентификаторов
apiproduct appid apiresource
apiproductname
appname apiresource
developeremail
developerid
companyname
consumerkey apiresource
app appid
appname developeremail
developerid
companyname
consumerkey
authorizationcode authorizationcode
company appid
company
consumerkey
companydeveloper companyname
consumerkey consumerkey
consumerkey_scope consumerkey
developer appid
consumerkey
developeremail
developerid
requesttoken requesttoken consumerkey
verifier verifier

Пример XML-профиля объекта

Чтобы получить нужное значение профиля объекта с помощью XPath, вам необходимо кое-что знать о структуре XML профиля. В качестве примера структуры используйте вызов API управления, чтобы получить XML для нужной сущности. Подробную информацию см. в справочнике по API управления .

В следующих разделах приведен код для вызовов API, а также пример XML из вызова.

Приложения

$ curl -H "Accept:text/xml" -X GET \
https://api.enterprise.apigee.com/v1/o/{org_name}/apps/{app_id} \
-u email:password

См. также раздел «Получение приложения в организации по идентификатору приложения» в справочнике по API управления Edge.

Или:

$ curl -H "Accept:text/xml" -X GET \
https://api.enterprise.apigee.com/v1/o/{org_name}/developers/{developer_email}/apps/{app_name} \
-u email:password

См. также раздел «Получение сведений о приложении разработчика» в справочнике по API управления Edge.

Пример профиля:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<App name="thomas-app">
    <AccessType>read</AccessType>
    <ApiProducts/>
    <Credentials>
        <Credential>
            <Attributes/>
            <ConsumerKey>wrqOOOiPArFI0WRoB1gAJMRbOguekJ5w</ConsumerKey>
            <ConsumerSecret>WvOhDrJ8m6kzz7Ni</ConsumerSecret>
            <ApiProducts>
                <ApiProduct>
                    <Name>FreeProduct</Name>
                    <Status>approved</Status>
                </ApiProduct>
            </ApiProducts>
            <Scopes/>
            <Status>approved</Status>
        </Credential>
    </Credentials>
    <AppFamily>default</AppFamily>
    <AppId>ab308c13-bc99-4c50-8434-0e0ed1b86075</AppId>
    <Attributes>
        <Attribute>
            <Name>DisplayName</Name>
            <Value>Tom's Weather App</Value>
        </Attribute>
    </Attributes>
    <CallbackUrl>http://tom.app/login</CallbackUrl>
    <CreatedAt>1362502872727</CreatedAt>
    <CreatedBy>admin@apigee.com</CreatedBy>
    <DeveloperId>PFK8IwOeAOW01JKA</DeveloperId>
    <LastModifiedAt>1362502872727</LastModifiedAt>
    <LastModifiedBy>admin@apigee.com</LastModifiedBy>
    <Scopes/>
    <Status>approved</Status>
</App>

API-продукт

$ curl  -H "Accept:text/xml" -X GET \
https://api.enterprise.apigee.com/v1/o/{org_name}/apiproducts/{apiproduct_name} \
-u email:password

См. также раздел «Получить продукт API» в справочнике по API управления Edge.

Пример XPath извлекает второй ресурс API (URI) из продукта API с именем weather_free :

/ApiProduct['@name=weather_free']/ApiResources/ApiResource[1]/text()

Пример профиля, возвращенного в формате XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ApiProduct name="weather_free">
    <ApiResources>
        <ApiResource>/forecastrss, /reports</ApiResource>
    </ApiResources>
    <ApprovalType>auto</ApprovalType>
    <Attributes>
        <Attribute>
            <Name>description</Name>
            <Value>Introductory API Product</Value>
        </Attribute>
        <Attribute>
            <Name>developer.quota.interval</Name>
            <Value>1</Value>
        </Attribute>
        <Attribute>
            <Name>developer.quota.limit</Name>
            <Value>1</Value>
        </Attribute>
        <Attribute>
            <Name>developer.quota.timeunit</Name>
            <Value>minute</Value>
        </Attribute>
        <Attribute>
            <Name>servicePlan</Name>
            <Value>Introductory</Value>
        </Attribute>
    </Attributes>
    <CreatedAt>1355847839224</CreatedAt>
    <CreatedBy>andrew@apigee.com</CreatedBy>
    <Description>Free API Product</Description>
    <DisplayName>Free API Product</DisplayName>
    <Environments/>
    <LastModifiedAt>1355847839224</LastModifiedAt>
    <LastModifiedBy>andrew@apigee.com</LastModifiedBy>
    <Proxies/>
    <Scopes/>
</ApiProduct>

Компания

$ curl   -H "Accept:text/xml" -X GET \
https://api.enterprise.apigee.com/v1/o/{org_name}/companies/{company_name} \
-u email:password

См. также раздел «Получение сведений о компании» в справочнике по API управления Edge.

Пример профиля:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Company name="theramin">
    <Apps/>
    <DisplayName>Theramin Corporation</DisplayName>
    <Organization>apigee-pm</Organization>
    <Status>active</Status>
    <Attributes>
        <Attribute>
            <Name>billing_code</Name>
            <Value>13648765</Value>
        </Attribute>
    </Attributes>
    <CreatedAt>1349208631291</CreatedAt>
    <CreatedBy>andrew@apigee.com</CreatedBy>
    <LastModifiedAt>1349208631291</LastModifiedAt>
    <LastModifiedBy>andrew@apigee.com</LastModifiedBy>
</Company>

Компания-разработчик

$ curl -H "Accept:text/xml" -X GET \
https://api.enterprise.apigee.com/v1/o/{org_name}/companies/{company_name}/developers/{developer_name} \
-u email:password

Пример профиля:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Developers>
    <Developer>
        <Email>ntesla@theramin.com</Email>
        <Role>developer</Role>
    </Developer>
</Developers>

Потребительский ключ

$ curl -H "Accept:text/xml" -X GET \
https://api.enterprise.apigee.com/v1/o/{org_name}/developers/{developer_email}/apps/{app_name}/keys/{consumer_key} \
-u email:password

См. также раздел «Получение ключевых сведений о приложении разработчика» в справочнике по API управления Edge.

Пример XPath:

/Credential/ApiProducts/ApiProduct[Name='weather_free']/Status/text()

Пример профиля:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Credential>
    <Attributes/>
    <ConsumerKey>XLotL3PRxNkUGXhGAFDPOr6fqtvAhuZe</ConsumerKey>
    <ConsumerSecret>iNUyEaOOh96KR3YL</ConsumerSecret>
    <ApiProducts>
        <ApiProduct>
            <Name>weather_free</Name>
            <Status>approved</Status>
        </ApiProduct>
    </ApiProducts>
    <Scopes/>
    <Status>approved</Status>
</Credential>

Разработчик

$ curl -H "Accept:text/xml" -X GET \
https://api.enterprise.apigee.com/v1/o/{org_name}/developers/{developer_email} \
-u email:password

См. также раздел «Получить разработчика» в справочнике по API управления Edge.

Пример XPath:

/Developer/Attributes/Attribute[Name='my_custom_attribute']/Value/text()
/Developer/Email/text()

Пример профиля:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Developer>
    <Apps>
        <App>weatherappx</App>
        <App>weatherapp</App>
    </Apps>
    <Email>ntesla@theramin.com</Email>
    <DeveloperId>4Y4xd0KRZ1wmHJqu</DeveloperId>
    <FirstName>Nikola</FirstName>
    <LastName>Tesla</LastName>
    <UserName>theramin</UserName>
    <OrganizationName>apigee-pm</OrganizationName>
    <Status>active</Status>
    <Attributes>
        <Attribute>
            <Name>project_type</Name>
            <Value>public</Value>
        </Attribute>
    </Attributes>
    <CreatedAt>1349797040634</CreatedAt>
    <CreatedBy>rsaha@apigee.com</CreatedBy>
    <LastModifiedAt>1349797040634</LastModifiedAt>
    <LastModifiedBy>rsaha@apigee.com</LastModifiedBy>
</Developer>

Переменные потока

При получении профиля сущности, указанного в политике AccessEntity, объект профиля в формате XML добавляется в контекст сообщения в качестве переменной. Доступ к ней можно получить, как и к любой другой переменной, со ссылкой на имя переменной. Предоставленное пользователем имя политики AccessEntity устанавливается в качестве префикса имени переменной.

Например, если выполняется политика AccessEntity с именем GetDeveloper , то профиль в формате XML сохраняется в переменной с именем AccessEntity.GetDeveloper . Затем профиль в формате XML можно проанализировать с использованием XPath, определенного в политике ExtractVariables, которая указывает AccessEntity.GetDeveloper в качестве источника.

Ссылка на ошибку

Дополнительную информацию см. в разделах «Что нужно знать об ошибках политики» и «Обработка ошибок» .

Ошибки выполнения

Никто.

Ошибки развертывания

Название ошибки Строка неисправности Статус HTTP Происходит, когда
InvalidEntityType Invalid type [entity_type] in ACCESSENTITYStepDefinition [policy_name] Н/Д Используемый тип объекта должен быть одним из поддерживаемых типов .

Связанные темы