成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenHarmony源碼解析之安全子系統 (應用權限管理)

開發
本文將介紹標準系統下安全子系統應用權限管理部分如何在系統內適配及實現,盡力深入細節部分。

[[435507]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

1.簡介

安全子系統為OpenHarmony提供有效保護應用和用戶數據的能力。

主要功能: 系統安全、數據安全、應用安全等;

目前開源功能: 應用完整性保護、應用權限管理、設備認證、密鑰管理服務、數據分級保護;

應用權限管理: 為程序框架子系統提供權限管理功能,并且為上層應用提供權限申請和授權狀態查詢接口。

本文將介紹標準系統下安全子系統應用權限管理部分如何在系統內適配及實現,盡力深入細節部分。

1.1 OpenHarmony 架構圖

OpenHarmony 源碼解析之安全子系統 (應用權限管理) -鴻蒙HarmonyOS技術社區

1.2 安全子系統

OpenHarmony 源碼解析之安全子系統 (應用權限管理) -鴻蒙HarmonyOS技術社區

1.3 應用權限管理

OpenHarmony中應用和系統服務均運行在獨立的沙箱中,進程空間和程序數據都是相互隔離的,以保護應用數據的安全性;但是運行在獨立沙箱中的服務或應用同時需要對外提供一些API以實現所需功能,其他獨立沙箱中的應用在跨進程訪問這些API時,需要系統提供一種權限管理機制對這些API的訪問者進行授權。

應用權限管理提供了權限定義機制,允許系統服務和應用為自己的敏感API定義新的權限,其他應用必須申請此權限才能訪問此敏感API;

應用權限管理提供了權限申請機制,允許應用申請權限,這些權限由系統或者其他應用定義,權限申請通過后就能訪問這個權限相關的系統或其他應用提供的敏感API;

應用權限管理也為用戶提供了一些必須的功能,方便用戶查看和管理權限授予情況。

OpenHarmony 源碼解析之安全子系統 (應用權限管理) -鴻蒙HarmonyOS技術社區

2.基礎知識

2.1 代碼結構

  1. /base/security/permission 
  2. ├── frameworks # 基礎設施層 
  3. │ └── permission_standard # 標準系統權限管理基礎設施層 
  4. ├── interfaces # 接口層 
  5. │ ├── innerkits # 內部接口層 
  6. │ │ ├── permission_lite # 輕量系統、小型系統權限管理內部接口層 
  7. │ │ └── permission_standard # 標準系統權限管理內部接口層 
  8. │ └── kits # 外部接口層 
  9. │ ├── permission_lite # 輕量系統、小型系統權限管理外部接口層 
  10. │ └── permission_standard # 標準系統權限管理外部接口層 
  11. └── services # 服務層 
  12. ├── permission_lite # 輕量系統、小型系統權限管理服務層 
  13. └── permission_standard # 標準系統權限管理服務層 

2.2 SystemAbility

應用權限管理模塊是以SystemAbility的形式對外提供能力的,在分布式任務調度子系統中safwk組件定義OpenHarmony中SystemAbility的實現方法,并提供啟動、注冊等接口實現。

實現一個SystemAbility需要六個步驟:

1)定義該服務對外提供的能力集合函數

  1. namespace OHOS { 
  2. class IListenAbility : public IRemoteBroker { 
  3. public
  4.     virtual int AddVolume(int volume) = 0; 
  5.  
  6. public
  7.     enum { 
  8.         ADD_VOLUME = 1, 
  9.     }; 
  10. public
  11.     DECLARE_INTERFACE_DESCRIPTOR(u"OHOS.test.IListenAbility"); 
  12. }; 

 2) 定義客戶端通信代碼XXXProxy

  1. namespace OHOS { 
  2. class ListenAbilityProxy : public IRemoteProxy<IListenAbility> { 
  3. public
  4.     int AddVolume(int volume); 
  5.  
  6.     explicit ListenAbilityProxy(const sptr<IRemoteObject>& impl) 
  7.         : IRemoteProxy<IListenAbility>(impl) 
  8.     { 
  9.     } 
  10.  
  11. private: 
  12.     static inline BrokerDelegator<ListenAbilityProxy> delegator_; 
  13. }; 
  14. } // namespace OHOS 

 3) 定義服務端通信代碼XXXStub

  1. namespace OHOS { 
  2. int32_t ListenAbilityStub::OnRemoteRequest(uint32_t code, 
  3.     MessageParcel& data, MessageParcel &reply, MessageOption &option
  4.     switch (code) { 
  5.         case ADD_VOLUME: { 
  6.             return reply.WriteInt32(AddVolume(data.ReadInt32())); 
  7.         } 
  8.         default
  9.             return IPCObjectStub::OnRemoteRequest(code, data, reply, option); 
  10.     } 

 4)SystemAbility的實現類 

  1. namespace { 
  2. constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0xD001800, "SA_TST"}; 
  3.  
  4. REGISTER_SYSTEM_ABILITY_BY_ID(ListenAbility, DISTRIBUTED_SCHED_TEST_LISTEN_ID, true); 
  5.  
  6. ListenAbility::ListenAbility(int32_t saId, bool runOnCreate) : SystemAbility(saId, runOnCreate) 
  7.     HiLog::Info(LABEL, ":%s called", __func__); 
  8.     HiLog::Info(LABEL, "ListenAbility()"); 
  9.  
  10. ListenAbility::~ListenAbility() 
  11.     HiLog::Info(LABEL, "~ListenAbility()"); 
  12.  
  13. int ListenAbility::AddVolume(int volume) 
  14.     pid_t current = getpid(); 
  15.     HiLog::Info(LABEL, "ListenAbility::AddVolume volume = %d, pid = %d.", volume, current); 
  16.     return (volume + 1); 
  17.  
  18. void ListenAbility::OnDump() 
  19.  
  20. void ListenAbility::OnStart() 
  21.     HiLog::Info(LABEL, "ListenAbility::OnStart()"); 
  22.     HiLog::Info(LABEL, "ListenAbility:%s called:-----Publish------", __func__); 
  23.     bool res = Publish(this); 
  24.     if (res) { 
  25.         HiLog::Error(LABEL, "ListenAbility: res == false"); 
  26.     } 
  27.     HiLog::Info(LABEL, "ListenAbility:%s called:AddAbilityListener_OS_TST----beg-----", __func__); 
  28.     AddSystemAbilityListener(DISTRIBUTED_SCHED_TEST_OS_ID); 
  29.     HiLog::Info(LABEL, "ListenAbility:%s called:AddAbilityListener_OS_TST----end-----", __func__); 
  30.  
  31.     HiLog::Info(LABEL, "ListenAbility:%s called:StopAbility_OS_TST----beg-----", __func__); 
  32.     StopAbility(DISTRIBUTED_SCHED_TEST_OS_ID); 
  33.     HiLog::Info(LABEL, "ListenAbility:%s called:StopAbility_OS_TST----end-----", __func__); 
  34.     return
  35.  
  36. void ListenAbility::OnStop() 

5)SystemAbility配置

以c++實現的SA必須配置相關System Ability的profile配置文件才會完成SA的加載注冊邏輯,否則沒有編寫profile配置的System Ability不會完成注冊。配置方法如下:

在子系統的根目錄新建一個以sa_profile為名的文件夾;然后在此文件夾中新建兩個文件:一個以serviceId為前綴的xml文件;另外一個為BUILD.gn文件

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <info> 
  3.     <process>listen_test</process> 
  4.     <systemability> 
  5.     <name>serviceid</name
  6.     <libpath>/system/lib64/liblistentest.z.so</libpath> 
  7.     <run-on-create>true</run-on-create
  8.     <distributed>false</distributed> 
  9.     <dump-level>1</dump-level
  10. </systemability> 
  11. </info> 

 BUILD.gn:

  1. import("//build/ohos/sa_profile/sa_profile.gni"
  2. ohos_sa_profile("xxx_sa_profile") { 
  3.     sources = [ 
  4.         "serviceid.xml" 
  5.     ] 
  6.     subsystem_name = "distributedschedule" 

6)rc配置文件

rc配置文件為linux提供的native進程拉起策略,為手機在開機啟動階段由init進程解析配置的rc文件進行拉起

  1. service listen_test /system/bin/sa_main /system/profile/listen_test.xml 
  2.     class z_core 
  3.     user system 
  4.     group system shell 
  5.     seclabel u:r:xxxx:s0 

2.3 接口說明

標準系統用戶程序框架子系統提供權限管理基礎校驗能力,不對三方app開放,并提供如下API。

3.內部實現

3.1 類間關系

IPermissionManager:內部接口類

PermissionManagerProxy:IPC請求的代理類

PermissionManagerStub:IPC請求服務類

PermissionManagerClient:應用權限管理客戶類

PermissionKit:組件對外接口類,真正對外提供STATIC接口函數

PermissionManagerService:應用權限功能服務類,調用PermissionStateManager和PermissionDefinitionManager

PermissionStateManager:真正的應用權限管理功能實現

PermissionDefinitionManager:真正的應用權限管理功能實現

3.2 內部邏輯

標準系統下應用權限管理功能是基于SAMgr管理框架實現,如何配置SAMgr框架見基礎知識介紹,如果想學習更多細節參見SAMgr相關學習,這里專注于應用權限管理功能部分,并對代碼邏輯關鍵節點進行分析和展示。

應用權限管理組件通過PermissionKit類以單例模式對外提供接口,PermissionKit類內部接口函數則調用PermissionManagerClient類,PermissionManagerClient則通過調用GetSystemAbility函數獲取向SAMgr注冊過的代理類單例PermissionManagerProxy。

代碼如下:

  1. sptr<IPermissionManager> PermissionManagerClient::GetProxy() const 
  2.     auto sam = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); 
  3.     if (sam == nullptr) { 
  4.         PERMISSION_LOG_DEBUG(LABEL, "%{public}s: GetSystemAbilityManager is null", __func__); 
  5.         return nullptr; 
  6.     } 
  7.     // 獲取Proxy 
  8.     auto permissionSa = sam->GetSystemAbility(IPermissionManager::SA_ID_PERMISSION_MANAGER_SERVICE); 
  9.     if (permissionSa == nullptr) { 
  10.         PERMISSION_LOG_DEBUG(LABEL, "%{public}s: GetSystemAbility %{public}d is null", __func__, 
  11.             IPermissionManager::SA_ID_PERMISSION_MANAGER_SERVICE); 
  12.         return nullptr; 
  13.     } 
  14.  
  15.     auto proxy = iface_cast<IPermissionManager>(permissionSa); 
  16.     if (proxy == nullptr) { 
  17.         PERMISSION_LOG_DEBUG(LABEL, "%{public}s: iface_cast get null", __func__); 
  18.         return nullptr; 
  19.     } 
  20.     return proxy; 

 在獲取代理類PermissionManagerProxy后,PermissionManagerProxy內部不同功能接口函數會調用SendRequest函數發起IPC請求服務。

示例代碼如下(刪去省略部分):

  1. int PermissionManagerProxy::VerifyPermission( 
  2.     const std::string& bundleName, const std::string& permissionName, int userId) 
  3.     // 省略部分 
  4.     ..................... 
  5.     // 發送請求服務 
  6.     int32_t requestResult = remote->SendRequest( 
  7.         static_cast<uint32_t>(IPermissionManager::InterfaceCode::VERIFY_PERMISSION), data, reply, option); 
  8.     if (requestResult != NO_ERROR) { 
  9.         PERMISSION_LOG_ERROR(LABEL, "%{public}s send request fail, result: %{public}d", __func__, requestResult); 
  10.         return PERMISSION_NOT_GRANTED; 
  11.     } 
  12.  
  13.     int32_t result = reply.ReadInt32(); 
  14.     PERMISSION_LOG_DEBUG(LABEL, "%{public}s get result from server data = %{public}d", __func__, result); 
  15.     return result; 

 其中接口類IPermissionManager中定義了IPC通信的請求碼。

示例代碼如下(刪去省略部分):

  1. class IPermissionManager : public IRemoteBroker { 
  2. public
  3.     static const int SA_ID_PERMISSION_MANAGER_SERVICE = 3501; 
  4.  
  5.     DECLARE_INTERFACE_DESCRIPTOR(u"ohos.security.permission.IPermissionManager"); 
  6.  
  7.     virtual int VerifyPermission(const std::string& bundleName, const std::string& permissionName, int userId) = 0; 
  8.     // 省略部分 
  9.     ................................ 
  10.     // 請求碼 
  11.     enum class InterfaceCode { 
  12.         VERIFY_PERMISSION = 0xff01, 
  13.         CAN_REQUEST_PERMISSION = 0xff02, 
  14.         GRANT_USER_GRANTED_PERMISSION = 0xff03, 
  15.         GRANT_SYSTEM_GRANTED_PERMISSION = 0xff04, 
  16.         REVOKE_USER_GRANTED_PERMISSION = 0xff05, 
  17.         REVOKE_SYSTEM_GRANTED_PERMISSION = 0xff06, 
  18.         ADD_USER_GRANTED_REQ_PERMISSIONS = 0xff07, 
  19.         ADD_SYSTEM_GRANTED_REQ_PERMISSIONS = 0xff08, 
  20.         REMOVE_USER_GRANTED_REQ_PERMISSIONS = 0xff09, 
  21.         REMOVE_SYSTEM_GRANTED_REQ_PERMISSIONS = 0xff10, 
  22.         ADD_DEF_PERMISSIONS = 0xff11, 
  23.         REMOVE_DEF_PERMISSIONS = 0xff12, 
  24.         GET_DEF_PERMISSION = 0xff13, 
  25.     }; 
  26. }; 

PermissionManagerService類則由于繼承了PermissionManagerStub,會在接口函數OnRemoteRequest函數接收到代理PermissionManagerProxy通過IPC通信發送的不同請求,進而進行處理。

示例代碼如下:

  1. int32_t PermissionManagerStub::OnRemoteRequest( 
  2.     uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option
  3.     PERMISSION_LOG_INFO(LABEL, "%{public}s called, code: %{public}d", __func__, code); 
  4.     std::u16string descriptor = data.ReadInterfaceToken(); 
  5.     if (descriptor != IPermissionManager::GetDescriptor()) { 
  6.         PERMISSION_LOG_ERROR(LABEL, "get unexpect descriptor: %{public}s", Str16ToStr8(descriptor).c_str()); 
  7.         return RET_FAILED; 
  8.     } 
  9.     switch (code) { 
  10.         case static_cast<uint32_t>(IPermissionManager::InterfaceCode::VERIFY_PERMISSION): 
  11.             VerifyPermissionInner(data, reply); 
  12.             break; 
  13.         case static_cast<uint32_t>(IPermissionManager::InterfaceCode::CAN_REQUEST_PERMISSION): 
  14.             CanRequestPermissionInner(data, reply); 
  15.             break; 
  16.         case static_cast<uint32_t>(IPermissionManager::InterfaceCode::GRANT_USER_GRANTED_PERMISSION): 
  17.             GrantUserGrantedPermissionInner(data, reply); 
  18.             break; 
  19.         // 省略部分 
  20.         ....... 
  21.  
  22.         default
  23.             return IPCObjectStub::OnRemoteRequest(code, data, reply, option); 
  24.     } 
  25.     return NO_ERROR; 

最終PermissionManagerService則調用PermissionStateManager和PermissionDefinitionManager類所提供的函數做具體的功能實現。

4.總結

當今設備安全問題已經越來越引起不同行業的重視,OpenHarmney安全子系統作為系統基礎能力之一對開發設備的安全性尤為重要,對系統框架開發來說很有必要學習其內部原理并對代碼結構深入了解,本文檔拋磚引玉介紹了標準系統下應用權限管理的相關邏輯框架,后續隨著學習的深入將不斷完善對安全子系統的解讀。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2023-04-12 15:31:11

系統服務管理鴻蒙

2022-01-06 16:17:58

鴻蒙HarmonyOS應用

2021-11-08 15:04:47

鴻蒙HarmonyOS應用

2022-02-17 20:57:07

OpenHarmon操作系統鴻蒙

2021-12-17 16:42:09

鴻蒙HarmonyOS應用

2021-09-18 14:40:37

鴻蒙HarmonyOS應用

2022-01-10 15:30:11

鴻蒙HarmonyOS應用

2022-05-10 11:17:27

電話子系統數據服務模塊

2022-05-24 15:46:51

Wi-FiSTA模式

2021-09-13 15:15:18

鴻蒙HarmonyOS應用

2023-04-06 09:14:11

多模輸入子系統鴻蒙

2022-01-13 10:11:59

鴻蒙HarmonyOS應用

2023-06-28 15:00:02

開源鴻蒙輸入系統架構

2021-09-17 14:38:58

鴻蒙HarmonyOS應用

2021-11-25 09:54:54

鴻蒙HarmonyOS應用

2021-12-27 16:20:45

鴻蒙HarmonyOS應用

2022-01-20 14:33:29

openharmonwayland協議鴻蒙

2022-02-14 14:47:11

SystemUIOpenHarmon鴻蒙

2022-03-18 16:07:04

Graphic子系統鴻蒙

2021-12-14 14:45:38

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天堂中文资源在线 | 91在线观看 | 精品美女在线观看视频在线观看 | 国产精品一区网站 | 黄色国产区| 玩丰满女领导对白露脸hd | 免费视频一区 | 日韩一区二区三区精品 | 亚洲综合无码一区二区 | 日韩一区二区三区av | 亚洲逼院 | 欧美一区二区三区久久精品 | 青青草在线视频免费观看 | 精品福利在线视频 | 欧美久久久电影 | 日韩在线视频一区二区三区 | 欧美一区二区三区在线看 | 午夜在线| 亚洲系列第一页 | 国产视频二区在线观看 | 亚洲综合一区二区三区 | 日本在线视频一区二区 | 成人免费观看男女羞羞视频 | 综合色在线 | 久久精品久久精品 | 午夜国产 | a国产视频| 99亚洲精品视频 | 欧美日韩手机在线观看 | 国产91丝袜在线播放 | 能免费看的av | 欧美一区二区三区久久精品 | 欧美日韩在线视频一区二区 | 秋霞电影一区二区 | 天天玩夜夜操 | 国产激情免费视频 | 99久久国产综合精品麻豆 | 欧美亚洲国产日韩 | 91精品国产综合久久久动漫日韩 | 国产免费观看久久黄av片涩av | 一级在线毛片 |