ADIL验证授权

来源:互联网 发布:北京市大兴区 阿里云 编辑:程序博客网 时间:2024/05/22 13:00

在项目中,我们编写了一个服务,通过AIDL对外提供接口,但是不是没一个调用者都可以调用我们的接口的,这时候,就需要对调用者的身份做授权验证了,验证方法有两种,第一种是权限验证(permission),第二种是包名验证(packageName)

一、权限验证:

在AIDL的响应方法中,添加以下代码,如果调用着没有声明这个权限,则直接返回null

private boolean verifyPermission() {    int permission = checkCallingOrSelfPermission("com.showmac.aidlservice.ACCESS_PLUS_MY_SERVICE");    if (permission != PackageManager.PERMISSION_DENIED) {        return true;    }    return false;}

ADIL服务中声明了以上权限后,需要调用者在mainfest中也做声明,才可以保证正常调用

<permission    android:name="com.showmac.aidlservice.ACCESS_PLUS_MY_SERVICE" android:protectionLevel="normal" /><uses-permission android:name="com.showmac.aidlservice.ACCESS_PLUS_MY_SERVICE" />


二、包名验证:

在AIDL的响应方法中,添加以下代码,如果调用者的包名不符合,则直接返回null

private boolean verifyPackage(int uid) {    String packageName = null;    String[] packages = getPackageManager().getPackagesForUid(uid);    if (packages != null && packages.length > 0) {        packageName = packages[0];    }    if (!"com.showmac.aidlclient".equals(packageName)) {        return false;    }    return true;}


************************************************************************************************************************************************************************************

AIDL服务的完整代码如下:

package com.showmac.aidlservice;import android.app.Service;import android.content.Intent;import android.content.pm.PackageManager;import android.os.IBinder;import android.os.RemoteException;public class PlusMyService extends Service {    @Override    public IBinder onBind(Intent intent) {        return mIIntPlusAidlInterface;    }    private final IIntPlusAidlInterface.Stub mIIntPlusAidlInterface = new IIntPlusAidlInterface.Stub() {        @Override        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {        }        @Override        public int getPlus(int a, int b) throws RemoteException {            if (!verifyPermission()) {                return -1;            }            if (!verifyPackage(getCallingUid())) {                return -1;            }            return a+b;        }    };    // 权限验证    private boolean verifyPermission() {        int permission = checkCallingOrSelfPermission("com.showmac.aidlservice.ACCESS_PLUS_MY_SERVICE");        if (permission != PackageManager.PERMISSION_DENIED) {            return true;        }        return false;    }        // 包名验证    private boolean verifyPackage(int uid) {        String packageName = null;        String[] packages = getPackageManager().getPackagesForUid(uid);        if (packages != null && packages.length > 0) {            packageName = packages[0];        }        if (!"com.showmac.aidlclient".equals(packageName)) {            return false;        }        return true;    }}


原创粉丝点击