CloudDB操作权限不足问题分析

问题背景

最近在开发一个新的项目,需要使用到数据库。为了节省成本,关注到了最近大火的Serverless概念,对比了多家的Serverless服务后最终选择了华为的云数据库服务。

在接入云数据库的时候需要首先接入华为认证服务。认证服务可以为云数据库的操作进行鉴权。但是当我使用认证服务并成功登录后,准备进行数据库的插入操作时,遇到了如下的问题:

com.huawei.agconnect.cloud.database.exceptions.AGConnectCloudDBException: code: 15 message: permission denied. 

        at com.huawei.agconnect.cloud.database.CloudDBZone.nativeUpsert(Native Method) 

        at com.huawei.agconnect.cloud.database.CloudDBZone.access$400(CloudDBZone.java:1) 

        at com.huawei.agconnect.cloud.database.CloudDBZone$d.a(CloudDBZone.java:11) 

        at com.huawei.agconnect.cloud.database.CloudDBZone$d.call(CloudDBZone.java:1) 

        at com.huawei.hmf.tasks.a.j$1.run(Unknown Source:4) 

        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 

        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 

        at java.lang.Thread.run(Thread.java:920)

解决方法

一开始我以为是认证服务登录失败了,所以特地将云数据库的相关操作写在了认证服务登录的成功回调中。可是还是会报同样的错误。这让我感觉很不理解,难道还有其他权限没有通过吗?查询了官网的资料,发现了如下的权限表:

cke_316.png

所以通过认证服务登录的用户应该是可以进行upsert操作的。实在找不到问题原因就只好通过华为官网的在线提单系统向华为的专家求助。

专家在看了我的代码后发现了其中的原因。原来是在操作云数据库之前的初始化流程中我添加了如下的代码:

AGConnectOptions agcConnectOptions = new AGConnectOptionsBuilder().setRoutePolicy(AGCRoutePolicy.CHINA).build(mContext);
AGConnectInstance instance = AGConnectInstance.buildInstance(agcConnectOptions);

生成了一个AGC的instance后再去进行的云数据库实例的初始化:

mCloudDB = AGConnectCloudDB.getInstance(instance, AGConnectAuth.getInstance(instance));
mCloudDB.createObjectType(ObjectTypeInfoHelper.getObjectTypeInfo());

那么这样问题就来了,原本进行认证服务登录时使用的是SDK自己默认初始化的AGC实例,而这里我操作云数据库初始化又新增了一个instance。而新的instance并没有进行认证服务,所以导致了这个问题。

问题总结

经过上述分析,解决方法就是不重新初始化AGC的instance而是使用AGCInstance.getInstance来获取默认的instance。

欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

{{o.name}}
{{m.name}}

猜你喜欢

转载自my.oschina.net/u/4478396/blog/5552970