在项目中,我们编写了一个服务,通过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;
}
}