Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Javaポケットリファレンス 改訂版

Javaポケットリファレンス改訂版を頂いたので書評です。Azure界隈にいますが、Azure Java SDKとか追っかけてますし Java > NET な感じの最近です。ポケットリファレンスとは名乗っていますが、順調にポケットに入らないサイズに育っているような気がします。

http://ecx.images-amazon.com/images/I/51bGuMwMu3L.SL75.jpg

[改訂新版]Javaポケットリファレンス

[改訂新版]Javaポケットリファレンス

  • 作者: WINGSプロジェクト,?江賢,山田祥寛
  • 出版社/メーカー: 技術評論社
  • 発売日: 2016/03/18
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

改訂版ですので、Java 8 の範囲までサポートされています。ライブラリのリファレンスメインですが、1章に簡単なJavaの歴史やEclipseの話、2章でも文法的な話が逆引きリファレンスとして掲載されていて一読をお勧めします。

目次はざっと以下の通りですが、

  1. Javaを始めるために
  2. 基本文法
  3. 基本API
  4. コレクション
  5. 入出力(I/O)
  6. ネットワーク
  7. データベース
  8. ユーティリティ

細かい目次は以下のURLで紹介されています。

http://gihyo.jp/book/2016/978-4-7741-8030-4

自分なりの読み方

リファレンスというと、分からないときに逆引きするイメージで机の上に置いておくことが多いかと思いますが、まずはざっと目を通して頭のなかに本の内容のインデックスを作成しておくことをお勧めします。意外と知らない発見があったりしたり、そんな機能があったなと復習にもなったりします。

標準ライブラリを知らないと損することも多いです。よくあるのは、そのAPIの存在を知らなかったばっかりに、よろしくないコードを書き散らすパターンとか。何度も目撃していますし、自分でも、こんなライブラリがあったんだと気づいたことが何度か。

現在でもグーグル先生とかピンポイントで知りたい情報にあたることもできますが、書籍としてまとまっているのはやはり強いです。こんな機能あったはずだという記憶さえ有ればポケリを当たればささっと解決することができると思います。

補足

Javaの場合標準ライブラリだけでは不足することもあるので、他の有用なライブラリとかにも目を通しておくとよいかもしれません(現場で使えないことも多いけどw)

Azure Active Directory で Spring Boot and OAuth2

追記 2017/07/12

少しきれいにしたサンプルを以下に置いてあります。

github.com

Sprint Boot and OAuth2 ということで、以下にチュートリアルがあったりするわけですが、チュートリアルには、FaceBookとGithubの例が載っていたので、ふと思い立ってAzure Active Directoryでも出来るのか試してみました。結論からいうとできたのですが、全てを理解してやっているわけではないのでご注意を。もっとスマートな方法があるのではないかと思ってます。

spring.io

チュートリアル内にはいくつかサンプルがありますが、基本同じ様なことをちょっとづつ変えて試すような流れになっているぽいです。

click: adds an explicit link that the user has to click to login.

の中で↑のようなやつを少し改変しようと思います。

準備

  1. 適当にGithubからサンプルをCloneして、Eclipseあたりに放り込んでください。
  2. Azure Active Directory で アプリの登録し、テナントID、クライアントID、クライアントシークレットを入手しておきます。

application.yaml

クライアントIDとかクライアントシークレットとか、認証のURIとかはapplication.yamlに記述します。 accessTokenUriとかには、TenantIdを埋め込んでおいてください。最後のuserInfoUriですが、最終的にフレームワーク側が、このURIをアクセスしてユーザ情報を引っ張ってくるみたいですので、自身の情報が取得できURIを設定しておきます。

security:
  oauth2:
    client:
      clientId: <<your client id>>
      clientSecret: <<your client secret>>
      accessTokenUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/token
      userAuthorizationUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/authorize
      clientAuthenticationScheme: form
      scope: openid
    resource:
      userInfoUri: https://graph.windows.net/me?api-version=1.6

このままでも実行してアクセスするとLogin画面にリダイレクトされて認証のことろまで進みますが、エラーがでてしまいます。

Enhancer

POSTするときに、一部情報が足りないようです。RequestEnhancer を実装して新しいクラスを作成し、

resource : https://graph.windows.net/

の情報が付加されるようにしておきます。これは、Graph API というリソースにアクセスしまうというものです。

package com.example;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails;
import org.springframework.security.oauth2.client.token.AccessTokenRequest;
import org.springframework.security.oauth2.client.token.RequestEnhancer;
import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;

@Component
public class AzureRequestEnhancerCustomizer {

    @Autowired
    private OAuth2RestTemplate userInfoRestTemplate;

    @PostConstruct
    public void testWiring() {
        AuthorizationCodeAccessTokenProvider authorizationCodeAccessTokenProvider = new AuthorizationCodeAccessTokenProvider();
        authorizationCodeAccessTokenProvider.setTokenRequestEnhancer(new AzureRequestEnhancer());
        userInfoRestTemplate.setAccessTokenProvider(authorizationCodeAccessTokenProvider);
    }
}

@Component
class AzureRequestEnhancer implements RequestEnhancer {

    public AzureRequestEnhancer() {
    }

    @Override
    public void enhance(AccessTokenRequest request, OAuth2ProtectedResourceDetails resource,
            MultiValueMap<String, String> form, HttpHeaders headers) {
        form.set("resource", "https://graph.windows.net");
    }
}

実行

実行してもそのままだと、名前が表示されません。とりえあず、

http://localhost:8080/user

をたたくと、JSONが返ってきますので、どんな情報が返ってくるか確認できるでしょう。

index.html を以下のように編集しておくと名前がでるかもしれません。

self.user = data.userAuthentication.details.displayName;

f:id:StateMachine:20160419155327p:plain

参考

世の中には大体やろうとしていることの先行者がいるわけでして、以下のあたりをだいぶ参考に動きを把握させてもらいました。 AzureRequestEnhancer とかは以下の部分からのコピペ&改変です。

あとは、

などです。

RBACのオペレーション一覧

RBACはカスタムロールを作ることができますが、それらの操作一覧を取得する備忘録です。

一覧表示

操作を表示するには、Get-AzureRmProviderOperation コマンドを使います。OperationSearchStringが必須引数なので、* とか指定すると全部でます。

Get-AzureRmProviderOperation -OperationSearchString "*"

VM系のを出したい場合、

Get-AzureRmProviderOperation -OperationSearchString "Microsoft.Compute/virtualMachines/*"

となります。

Out-GridViewとかで表示するとこんな感じです。

f:id:StateMachine:20160401111409p:plain

既定のVM管理者

プリセットされているVM管理者がいますが、その操作権限を表示させると以下となります。

> (Get-AzureRmRoleDefinition -Name "Virtual Machine Contributor").actions    

Microsoft.Authorization/*/read
Microsoft.Compute/availabilitySets/*
Microsoft.Compute/locations/*
Microsoft.Compute/virtualMachines/*
Microsoft.Compute/virtualMachineScaleSets/*
Microsoft.Insights/alertRules/*
Microsoft.Network/applicationGateways/backendAddressPools/join/action
Microsoft.Network/loadBalancers/backendAddressPools/join/action
Microsoft.Network/loadBalancers/inboundNatPools/join/action
Microsoft.Network/loadBalancers/inboundNatRules/join/action
Microsoft.Network/loadBalancers/read
Microsoft.Network/locations/*
Microsoft.Network/networkInterfaces/*
Microsoft.Network/networkSecurityGroups/join/action
Microsoft.Network/networkSecurityGroups/read
Microsoft.Network/publicIPAddresses/join/action
Microsoft.Network/publicIPAddresses/read
Microsoft.Network/virtualNetworks/read
Microsoft.Network/virtualNetworks/subnets/join/action
Microsoft.ResourceHealth/availabilityStatuses/read
Microsoft.Resources/deployments/*
Microsoft.Resources/subscriptions/resourceGroups/read
Microsoft.Storage/storageAccounts/listKeys/action
Microsoft.Storage/storageAccounts/read
Microsoft.Support/*

以上