2012/06/09

Android:Grant Permissionで権限付与できるパスを制御する

GrantPermissionでパーミッション付与できるコンテンツパスは制御することが可能です。
制御したい場合は、マニフェストファイルで<provider>のandroid:grantUriPermission
属性をfalseとして、子要素である<grant-uri-permission>で許可するパスを列挙します。
<provider
    android:authorities="yuki.test.provider"
    android:name="yuki.test.MyContentProvider"
    android:readPermission="yuki.test.signature"
    android:grantUriPermissions="false" >
    <grant-uri-permission
        android:path="/test/hoge/foo/lv5" />
</provider>
この例では下記の状態となります
  • データ参照にはyuki.test.signature権限が必要(android:readPermission)
  • 原則パーミッションの付与は許可しない(android:grantUriPermissions)
  • ただし下記パスに対するパーミッションの付与は可能(grant-uri-permission)
      - /test/hoge/foo/lv5
      - .allowで終わるパス(/yuki/hoge/foo.allow, /test/hoge.allowなど)

許可されていないURIに権限を付与した場合、下記例外が発生します。
java.lang.SecurityException: Provider yuki.test/yuki.test.MyContentProvider
    does not allow granting of permission to path
    of Uri content://yuki.test.provider/test/hoge/foo/lv5
アクセス許可するコンテンツパスを動的に変えたいような場合があります。
下記のように外部入力値をそのまま利用するコードは大変危険です。
grantUriPermission("yuki.client", getIntent().getData(),
        Intent.FLAG_GRANT_READ_URI_PERMISSION);
あらかじめ、パーミッション付与するコンテンツパスが決まっている場合は、
この仕組みを利用した方が安全です。

以上です。