Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
今さらきけない環境ハブ
株式会社セールスフォース・ドットコム
テクニカルエバンジェリスト 中嶋 一樹
環境ハブとは?
ISVはパートナー開発組織、ライセンス管理組織、Trialforceソース組織など多くの組織を活用してアプリを開発していきま
す。環境ハブはこれらの組織を作成し、シングルサインオンすることができる機能です。また、Usage Me...
• 環境ハブはCRM for ISV組織(または元来利用しているSales Cloud組織)で有効化します。パートナーコミュニティからCRM for ISV組織の組織
IDを指定して有効化申請のケースを発行します。
環境ハブのセットアップ
• ...
シングルサインオンを設定する
• 環境ハブ上のユーザーと、ログイン先組織のユーザー名を1対1で紐づける設定(ハブメンバーの関連リストにあるシングルサインオンユーザー
マッピングの作成)をおこなうことでマッピングを定義します。設定は簡単ですが、1...
ジャストインタイムプロビジョニングのセットアップ
ログイン先組織に対応するユーザーが存在しない場合に自動的にユーザーを作成する機能のことをJIT(ジャストインタイムプロビジョニン
グ)と呼んでいます。この機能を活用すれば、環境ハブ上のユーザーは...
ジャストインタイムプロビジョニングのセットアップ(続き)
• ログイン先組織で、管理 > セキュリティのコントロール > シングルサインオン設定で、該当する環境ハブの設定を選択します。
• 編集ボタンをクリックし、SAML ID種別で「アサーシ...
ジャストインタイムプロビジョニングのセットアップ(続き)
global class AutocreatedRegHandler[ランダム番号] implements Auth.SamlJitHandler {
private void hand...
ありがとうございました!
Upcoming SlideShare
Loading in …5
×

今さらきけない環境ハブ

25,221 views

Published on

環境ハブの速習ガイド

Published in: Technology

今さらきけない環境ハブ

  1. 1. 今さらきけない環境ハブ 株式会社セールスフォース・ドットコム テクニカルエバンジェリスト 中嶋 一樹
  2. 2. 環境ハブとは? ISVはパートナー開発組織、ライセンス管理組織、Trialforceソース組織など多くの組織を活用してアプリを開発していきま す。環境ハブはこれらの組織を作成し、シングルサインオンすることができる機能です。また、Usage Metricsといった他の ISV向け機能において環境ハブは必須となっており、appexchangeアプリを開発するにあたり欠かせない機能です。 環境 ハブ CRM for ISV組織 パートナー開発組織 テスト組織 Trialforceソース組織 組織を作成&シングルサインオン
  3. 3. • 環境ハブはCRM for ISV組織(または元来利用しているSales Cloud組織)で有効化します。パートナーコミュニティからCRM for ISV組織の組織 IDを指定して有効化申請のケースを発行します。 環境ハブのセットアップ • システム管理者以外で環境ハブを使うユーザーには適切な権限を付与する必要があります。例えば、組織の作成や接続はおこなわせたくない が、各組織へシングルサインオンすることを許可したい場合、次のように権限を付与します。 • アプリケーション > 割り当てられたアプリケーションに環境ハブを追加 • アプリケーション > オブジェクト設定 > ハブメンバーでタブの設定をデフォルトで表示に設定し、オブジェクトの参照権限を追加 • システム > サービスプロバイダでSSOを許可するサービスプロバイダを追加 • 環境ハブに関連する権限のさらなる詳細はISVforceガイドの環境ハブのセクションを参照してください。 • CRM for ISV組織でマイドメインを設定します。マイドメインは 環境ハブからシングルサインオン機能を利用するにあたり必要 になります。 • 有効化完了の連絡がきたら環境ハブは利用可能になっていま す。CRM for ISV組織にログインし、アプリケーションプルダウ ンメニューから「環境ハブ」を選択してください。
  4. 4. シングルサインオンを設定する • 環境ハブ上のユーザーと、ログイン先組織のユーザー名を1対1で紐づける設定(ハブメンバーの関連リストにあるシングルサインオンユーザー マッピングの作成)をおこなうことでマッピングを定義します。設定は簡単ですが、1ユーザーにつき必ず1つのマッピング設定が必要になる ため、ユーザー数が多い場合には不向きです。 環境ハブに接続された組織は、「SSOを有効化」ボタンをクリックするだけでシングルサインオンに必要な組織間の設定が自動的におこなわ れます。その上で各ユーザーがシングルサインオンするためには何らかの形で環境ハブ上のユーザーと、ログイン先組織のユーザーがマッピ ングされていなければなりません。マッピングには3つの方法があり、ここではそれぞれを説明します。 ユーザーの対応付け 統合ID • 全組織においてユーザーごとに一意なIDを付与し、そのIDによって組織間のユーザーをマッピングします。統合IDさえ各組織で設定されていれ ば、個別に紐付けをおこなう必要がないため大規模な環境にも対応でき、ログイン先に対応するユーザーが存在しない場合に自動的にユーザー を作成するジャストインタイムプロビジョニングが可能になります。 従来のユーザー名 • 環境ハブ上のユーザー情報を元にログイン先のユーザー名を動的に指定する形でマッピングをおこないます。ログイン先のユーザー名がある規 則に基づいて作成されている場合に活用できます。
  5. 5. ジャストインタイムプロビジョニングのセットアップ ログイン先組織に対応するユーザーが存在しない場合に自動的にユーザーを作成する機能のことをJIT(ジャストインタイムプロビジョニン グ)と呼んでいます。この機能を活用すれば、環境ハブ上のユーザーは事前に各ログイン先組織にユーザーを作成することなくログインする ことが可能になります。 • 環境ハブでJITを有効化したいハブメンバーを選択します。 • もしSSOがまだ有効でなければ、「SSOを有効化」ボタンをクリックして有効化します。 • SSO手法2 - 統合IDにチェックして保存します。 • サービスプロバイダの詳細リンクをクリックします。 • 編集ボタンをクリックし、件名種別で「統合ID」を選択して保存します。 • サービスプロバイダSAML属性で下記の通り属性を作成します。 属性キー 属性値 User.Username $User.Username User.Email $User.Email User.LastName $User.LastName User.FirstName $User.FirstName User.CommunityNickname $User.CommunityNickname User.Alias $User.Alias User.ProfileName $Profile.Name
  6. 6. ジャストインタイムプロビジョニングのセットアップ(続き) • ログイン先組織で、管理 > セキュリティのコントロール > シングルサインオン設定で、該当する環境ハブの設定を選択します。 • 編集ボタンをクリックし、SAML ID種別で「アサーションにはユーザーオブジェクトの統合IDが含まれます」を選択、ユーザープロビジョニングの有効化にチェック、 ユーザープロビジョニングのタイプで「Apexハンドラを使用したカスタムSAML JIT」を選択、「SAML JITハンドラテンプレートを自動的に作成する」リンクをクリッ ク、他のアカウントでハンドラを実行にシステム管理者のユーザーを指定して保存します。 • 開発者コンソールでApexクラス:AutocreatedRegHandler[ランダム番号]を編集し、次ページのソースをペーストします。*クラス名は既存のクラス名に合わせてくださ い。
  7. 7. ジャストインタイムプロビジョニングのセットアップ(続き) global class AutocreatedRegHandler[ランダム番号] implements Auth.SamlJitHandler { private void handleUser(User u, Map<String, String> attributes, String federationIdentifier) { u.Username = attributes.get('User.Username') + '.' + UserInfo.getOrganizationId(); u.FederationIdentifier = federationIdentifier; u.Email = attributes.get('User.Email'); u.FirstName = attributes.get('User.FirstName'); u.LastName = attributes.get('User.LastName'); u.CommunityNickname = attributes.get('User.CommunityNickname'); u.Alias = attributes.get('User.Alias'); String profileName = attributes.get('User.ProfileName'); list<Profile> profileList = [SELECT Id FROM Profile WHERE Name=:profileName]; if (profileList.size() == 1){ u.ProfileId = profileList[0].Id; } String uid = UserInfo.getUserId(); User currentUser = [SELECT LocaleSidKey, LanguageLocaleKey, TimeZoneSidKey, EmailEncodingKey FROM User WHERE Id=:uid]; u.LocaleSidKey = currentUser.LocaleSidKey; u.LanguageLocaleKey = currentUser.LanguageLocaleKey; u.TimeZoneSidKey = currentUser.TimeZoneSidKey; u.EmailEncodingKey = currentUser.EmailEncodingKey; system.debug(u); } global void updateUser(Id userId, Id samlSsoProviderId, Id communityId, Id portalId, String federationIdentifier, Map<String, String> attributes, String assertion) { } global User createUser(Id samlSsoProviderId, Id communityId, Id portalId, String federationIdentifier, Map<String, String> attributes, String assertion) { User u = new User(); handleUser(u, attributes, federationIdentifier); return u; } }
  8. 8. ありがとうございました!

×