具有隐含意图的自定义权限

Posted

技术标签:

【中文标题】具有隐含意图的自定义权限【英文标题】:Custom permission with implicit intent 【发布时间】:2016-03-09 05:14:28 【问题描述】:

鉴于 android 中的安全模型,我正在尝试对广播接收器使用自定义权限。

我做了什么

我已经为接收者声明了一个自定义权限,从而限制了它可以接收的广播。清单中的一些代码:

<permission android:name="abc"/>

<receiver android:name=".UpdateUserReceiver"
        android:permission="abc"
        android:enabled="true"
        android:exported="false">

        <intent-filter>
            <action android:name="android.intent.action.ACTION_UPDATE_USERNAME"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
</receiver>

现在我希望接收器 UpdateUserReceiver 只会接收来自使用权限“abc”的组件的广播。

广播发送代码:

// Update username. Invoke broadcast.
Intent updateUserBroadcast = new Intent();
updateUserBroadcast.putExtra("username", userName);
updateUserBroadcast.setAction("android.intent.action.ACTION_UPDATE_USERNAME");
sendBroadcast(updateUserBroadcast);

发送广播的活动:

<activity android:name=".UpdateUserNameActivity">

        <intent-filter>
            <action android:name="com.intent.action.UPDATE_USERNAME"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
</activity>

问题 1: 可以看出,活动在任何地方都没有使用接收者声明的权限,因此它可以接收来自活动的广播。但是仍然调用了接收器,我怀疑这是由于使用了隐式意图,尽管我不确定。有什么想法吗?

问题 2: 在应用程序级别声明的权限标记和接收器内部的 android:permission 标记有什么区别?我理解第二个的使用,它在任何人都可以期望接收者接收广播之前强制执行许可,但是为什么需要第一个。这种情况是否需要它,或者可以将其删除。无论哪种方式,我都检查了接收器是否接收到广播。

【问题讨论】:

minSdkVersion 是 19,targetSdkVersion 是 23,我的目标是 x86 Kitkat Android 模拟器。 据我了解,android系统会验证receiver是否有权限接收广播。但在你的情况下,你期望它以另一种方式工作,这就是我认为你的接收器被执行的原因。 如果您只想在受信任的应用程序发送广播时执行您的接收器,那么您可以进行定向广播。如果这是您正在寻找的内容,请告诉我,我会给您更多信息。 @7383,关于​​您的评论 1,如果我删除了外部权限,只保留接收器内部的权限,那么广播者必须拥有该权限才能向该接收器发送广播。但是该活动仍然能够在没有权限的情况下向该接收器发送广播。检查此链接:developer.android.com/guide/topics/manifest/… @7383,关于​​评论 2,这不是您会遇到的常见情况,因为这里我的活动和接收者在同一个应用程序中。我只想确认 Android 的权限模型是否仅适用于单独的应用程序。另外,我不介意您分享有关定向广播的信息。谢谢。 【参考方案1】:

但是接收器仍然被调用,我怀疑这是由于使用了隐式意图,虽然我不确定

没有。

有什么想法吗?

它们都在同一个应用程序中(“因为在这里我的活动和接收器在同一个应用程序中”)。权限在应用之间应用,作为进程间通信 (IPC) 的一部分,而不是在应用内。

在app层面声明的permission标签和receiver内部的android:permission标签有什么区别?

&lt;permission&gt; 定义权限。 android:permission 应用权限。打个 Java 类比,&lt;permission&gt; 定义一个字段,android:permission 使用该字段。

【讨论】:

【参考方案2】:

好的,明白了。您可能正在从同一个应用程序发送广播。您是否尝试过从不同的应用程序发送广播?看看这段代码。如果调用 PID 是同一个应用程序,则有一个 PID 检查,则默认情况下将授予权限。因此,您的接收器正在执行,没有任何问题。 http://androidxref.com/4.4.4_r1/xref/frameworks/base/core/java/android/app/ActivityManager.java#2109

【讨论】:

虽然你的回答似乎正确,但我会用不同的应用程序验证行为,并在完成后立即奖励赏金。谢谢。 同意。如果您参考上面的链接,代码就是这样编写的。谢谢。【参考方案3】:

答案 1&lt;manifest&gt; 中的 &lt;uses-permission&gt; 标记请求此应用程序中所有组件的权限,您不需要为单个活动请求权限。并且应用声明自定义权限使用&lt;permission&gt;会自动全部持有,无需再次请求。 我猜您的活动和接收者在同一个应用程序中。 “隐含意图”不能破坏“许可规则”。

答案 2&lt;application&gt; 中的 &lt;permission&gt; 将设置适用于所有应用程序组件的权限。 在这里检查: http://developer.android.com/guide/topics/manifest/application-element.html#prmsn

【讨论】:

感谢您的回复,但很抱歉您的回答与该问题有些误导。对于第一部分,您说“隐式意图”不能破坏“许可规则”。如果是这样,为什么活动能够突破并到达接收者。另外,我没有使用 任何地方,因此应用程序无权向接收者发送广播。是的,我的活动和接收者在同一个应用程序中。你的答案 2 对我来说似乎是正确的,所以 +1。 @gauravjain 可能是我的烂英文没让你看清楚,请再看一下答案1中的这句话:应用程序声明权限将自动持有,无需再次请求。 嗨 Swing,我明白你想说什么。如果是这种情况,则意味着权限模型仅适用于单独的应用程序。我知道上面提到的情况有点不寻常,在实践中可能不会发生,但我希望您引用一些可以验证您的陈述的参考资料。谢谢。 作为一个实验,我从清单的根节点中删除了 标签,因此它只在接收器中定义。然后我也看到了同样的行为。这可能是由于 Android 仅在不同应用程序之间创建 IPC 权限模型,而不是在同一应用程序的组件内创建权限模型,但我没有在文档中看到它。

以上是关于具有隐含意图的自定义权限的主要内容,如果未能解决你的问题,请参考以下文章

具有过滤查询集的组权限的自定义表单

从列表视图的自定义适配器内的意图服务接收结果

spring @Preauthorize 中的自定义方法

自定义 HTML 选项在带有 href 意图的 Mailchimp 中不起作用

Android 自定义启动器 startActivity() 阻止 BOOT_COMPLETED 意图

如何在针对旧 iOS 版本时添加需要 iOS 12 的自定义 Intent?