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

OpenHarmony源碼解析之安全子系統(tǒng) (應(yīng)用權(quán)限管理)

開發(fā)
本文將介紹標(biāo)準(zhǔn)系統(tǒng)下安全子系統(tǒng)應(yīng)用權(quán)限管理部分如何在系統(tǒng)內(nèi)適配及實(shí)現(xiàn),盡力深入細(xì)節(jié)部分。

[[435507]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

1.簡(jiǎn)介

安全子系統(tǒng)為OpenHarmony提供有效保護(hù)應(yīng)用和用戶數(shù)據(jù)的能力。

主要功能: 系統(tǒng)安全、數(shù)據(jù)安全、應(yīng)用安全等;

目前開源功能: 應(yīng)用完整性保護(hù)、應(yīng)用權(quán)限管理、設(shè)備認(rèn)證、密鑰管理服務(wù)、數(shù)據(jù)分級(jí)保護(hù);

應(yīng)用權(quán)限管理: 為程序框架子系統(tǒng)提供權(quán)限管理功能,并且為上層應(yīng)用提供權(quán)限申請(qǐng)和授權(quán)狀態(tài)查詢接口。

本文將介紹標(biāo)準(zhǔn)系統(tǒng)下安全子系統(tǒng)應(yīng)用權(quán)限管理部分如何在系統(tǒng)內(nèi)適配及實(shí)現(xiàn),盡力深入細(xì)節(jié)部分。

1.1 OpenHarmony 架構(gòu)圖

OpenHarmony 源碼解析之安全子系統(tǒng) (應(yīng)用權(quán)限管理) -鴻蒙HarmonyOS技術(shù)社區(qū)

1.2 安全子系統(tǒng)

OpenHarmony 源碼解析之安全子系統(tǒng) (應(yīng)用權(quán)限管理) -鴻蒙HarmonyOS技術(shù)社區(qū)

1.3 應(yīng)用權(quán)限管理

OpenHarmony中應(yīng)用和系統(tǒng)服務(wù)均運(yùn)行在獨(dú)立的沙箱中,進(jìn)程空間和程序數(shù)據(jù)都是相互隔離的,以保護(hù)應(yīng)用數(shù)據(jù)的安全性;但是運(yùn)行在獨(dú)立沙箱中的服務(wù)或應(yīng)用同時(shí)需要對(duì)外提供一些API以實(shí)現(xiàn)所需功能,其他獨(dú)立沙箱中的應(yīng)用在跨進(jìn)程訪問這些API時(shí),需要系統(tǒng)提供一種權(quán)限管理機(jī)制對(duì)這些API的訪問者進(jìn)行授權(quán)。

應(yīng)用權(quán)限管理提供了權(quán)限定義機(jī)制,允許系統(tǒng)服務(wù)和應(yīng)用為自己的敏感API定義新的權(quán)限,其他應(yīng)用必須申請(qǐng)此權(quán)限才能訪問此敏感API;

應(yīng)用權(quán)限管理提供了權(quán)限申請(qǐng)機(jī)制,允許應(yīng)用申請(qǐng)權(quán)限,這些權(quán)限由系統(tǒng)或者其他應(yīng)用定義,權(quán)限申請(qǐng)通過后就能訪問這個(gè)權(quán)限相關(guān)的系統(tǒng)或其他應(yīng)用提供的敏感API;

應(yīng)用權(quán)限管理也為用戶提供了一些必須的功能,方便用戶查看和管理權(quán)限授予情況。

OpenHarmony 源碼解析之安全子系統(tǒng) (應(yīng)用權(quán)限管理) -鴻蒙HarmonyOS技術(shù)社區(qū)

2.基礎(chǔ)知識(shí)

2.1 代碼結(jié)構(gòu)

  1. /base/security/permission 
  2. ├── frameworks # 基礎(chǔ)設(shè)施層 
  3. │ └── permission_standard # 標(biāo)準(zhǔn)系統(tǒng)權(quán)限管理基礎(chǔ)設(shè)施層 
  4. ├── interfaces # 接口層 
  5. │ ├── innerkits # 內(nèi)部接口層 
  6. │ │ ├── permission_lite # 輕量系統(tǒng)、小型系統(tǒng)權(quán)限管理內(nèi)部接口層 
  7. │ │ └── permission_standard # 標(biāo)準(zhǔn)系統(tǒng)權(quán)限管理內(nèi)部接口層 
  8. │ └── kits # 外部接口層 
  9. │ ├── permission_lite # 輕量系統(tǒng)、小型系統(tǒng)權(quán)限管理外部接口層 
  10. │ └── permission_standard # 標(biāo)準(zhǔn)系統(tǒng)權(quán)限管理外部接口層 
  11. └── services # 服務(wù)層 
  12. ├── permission_lite # 輕量系統(tǒng)、小型系統(tǒng)權(quán)限管理服務(wù)層 
  13. └── permission_standard # 標(biāo)準(zhǔn)系統(tǒng)權(quán)限管理服務(wù)層 

2.2 SystemAbility

應(yīng)用權(quán)限管理模塊是以SystemAbility的形式對(duì)外提供能力的,在分布式任務(wù)調(diào)度子系統(tǒng)中safwk組件定義OpenHarmony中SystemAbility的實(shí)現(xiàn)方法,并提供啟動(dòng)、注冊(cè)等接口實(shí)現(xiàn)。

實(shí)現(xiàn)一個(gè)SystemAbility需要六個(gè)步驟:

1)定義該服務(wù)對(duì)外提供的能力集合函數(shù)

  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) 定義服務(wù)端通信代碼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的實(shí)現(xiàn)類 

  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++實(shí)現(xiàn)的SA必須配置相關(guān)System Ability的profile配置文件才會(huì)完成SA的加載注冊(cè)邏輯,否則沒有編寫profile配置的System Ability不會(huì)完成注冊(cè)。配置方法如下:

在子系統(tǒng)的根目錄新建一個(gè)以sa_profile為名的文件夾;然后在此文件夾中新建兩個(gè)文件:一個(gè)以serviceId為前綴的xml文件;另外一個(gè)為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進(jìn)程拉起策略,為手機(jī)在開機(jī)啟動(dòng)階段由init進(jìn)程解析配置的rc文件進(jìn)行拉起

  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 接口說明

標(biāo)準(zhǔn)系統(tǒng)用戶程序框架子系統(tǒng)提供權(quán)限管理基礎(chǔ)校驗(yàn)?zāi)芰Γ粚?duì)三方app開放,并提供如下API。

3.內(nèi)部實(shí)現(xiàn)

3.1 類間關(guān)系

IPermissionManager:內(nèi)部接口類

PermissionManagerProxy:IPC請(qǐng)求的代理類

PermissionManagerStub:IPC請(qǐng)求服務(wù)類

PermissionManagerClient:應(yīng)用權(quán)限管理客戶類

PermissionKit:組件對(duì)外接口類,真正對(duì)外提供STATIC接口函數(shù)

PermissionManagerService:應(yīng)用權(quán)限功能服務(wù)類,調(diào)用PermissionStateManager和PermissionDefinitionManager

PermissionStateManager:真正的應(yīng)用權(quán)限管理功能實(shí)現(xiàn)

PermissionDefinitionManager:真正的應(yīng)用權(quán)限管理功能實(shí)現(xiàn)

3.2 內(nèi)部邏輯

標(biāo)準(zhǔn)系統(tǒng)下應(yīng)用權(quán)限管理功能是基于SAMgr管理框架實(shí)現(xiàn),如何配置SAMgr框架見基礎(chǔ)知識(shí)介紹,如果想學(xué)習(xí)更多細(xì)節(jié)參見SAMgr相關(guān)學(xué)習(xí),這里專注于應(yīng)用權(quán)限管理功能部分,并對(duì)代碼邏輯關(guān)鍵節(jié)點(diǎn)進(jìn)行分析和展示。

應(yīng)用權(quán)限管理組件通過PermissionKit類以單例模式對(duì)外提供接口,PermissionKit類內(nèi)部接口函數(shù)則調(diào)用PermissionManagerClient類,PermissionManagerClient則通過調(diào)用GetSystemAbility函數(shù)獲取向SAMgr注冊(cè)過的代理類單例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內(nèi)部不同功能接口函數(shù)會(huì)調(diào)用SendRequest函數(shù)發(fā)起IPC請(qǐng)求服務(wù)。

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

  1. int PermissionManagerProxy::VerifyPermission( 
  2.     const std::string& bundleName, const std::string& permissionName, int userId) 
  3.     // 省略部分 
  4.     ..................... 
  5.     // 發(fā)送請(qǐng)求服務(wù) 
  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通信的請(qǐng)求碼。

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

  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.     // 請(qǐng)求碼 
  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,會(huì)在接口函數(shù)OnRemoteRequest函數(shù)接收到代理PermissionManagerProxy通過IPC通信發(fā)送的不同請(qǐng)求,進(jìn)而進(jìn)行處理。

示例代碼如下:

  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則調(diào)用PermissionStateManager和PermissionDefinitionManager類所提供的函數(shù)做具體的功能實(shí)現(xiàn)。

4.總結(jié)

當(dāng)今設(shè)備安全問題已經(jīng)越來越引起不同行業(yè)的重視,OpenHarmney安全子系統(tǒng)作為系統(tǒng)基礎(chǔ)能力之一對(duì)開發(fā)設(shè)備的安全性尤為重要,對(duì)系統(tǒng)框架開發(fā)來說很有必要學(xué)習(xí)其內(nèi)部原理并對(duì)代碼結(jié)構(gòu)深入了解,本文檔拋磚引玉介紹了標(biāo)準(zhǔn)系統(tǒng)下應(yīng)用權(quán)限管理的相關(guān)邏輯框架,后續(xù)隨著學(xué)習(xí)的深入將不斷完善對(duì)安全子系統(tǒng)的解讀。

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2023-04-12 15:31:11

系統(tǒng)服務(wù)管理鴻蒙

2022-02-17 20:57:07

OpenHarmon操作系統(tǒng)鴻蒙

2022-01-06 16:17:58

鴻蒙HarmonyOS應(yīng)用

2021-11-08 15:04:47

鴻蒙HarmonyOS應(yīng)用

2021-12-17 16:42:09

鴻蒙HarmonyOS應(yīng)用

2021-09-18 14:40:37

鴻蒙HarmonyOS應(yīng)用

2022-01-10 15:30:11

鴻蒙HarmonyOS應(yīng)用

2022-05-10 11:17:27

電話子系統(tǒng)數(shù)據(jù)服務(wù)模塊

2022-05-24 15:46:51

Wi-FiSTA模式

2021-09-13 15:15:18

鴻蒙HarmonyOS應(yīng)用

2023-04-06 09:14:11

多模輸入子系統(tǒng)鴻蒙

2022-01-13 10:11:59

鴻蒙HarmonyOS應(yīng)用

2023-06-28 15:00:02

開源鴻蒙輸入系統(tǒng)架構(gòu)

2021-09-17 14:38:58

鴻蒙HarmonyOS應(yīng)用

2021-11-25 09:54:54

鴻蒙HarmonyOS應(yīng)用

2021-12-27 16:20:45

鴻蒙HarmonyOS應(yīng)用

2022-01-20 14:33:29

openharmonwayland協(xié)議鴻蒙

2022-03-18 16:07:04

Graphic子系統(tǒng)鴻蒙

2022-02-14 14:47:11

SystemUIOpenHarmon鴻蒙

2021-12-14 14:45:38

鴻蒙HarmonyOS應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩毛片播放 | 精品在线观看入口 | 亚洲天堂一区 | 在线视频 亚洲 | 99re在线视频 | 亚洲 成人 在线 | 国产99热精品 | 欧美日韩a | 欧美成人一区二区三区 | 国产精品久久久久久久久久久久久久 | 久久中文免费视频 | 国产一区二区在线视频 | 天天操网 | 欧美日韩国产综合在线 | 国产成人精品视频 | 欧美夜夜| 国产精品国产三级国产aⅴ中文 | 992tv人人草 久久精品超碰 | 国产精品久久久久免费 | 精品伦精品一区二区三区视频 | 日韩免费中文字幕 | 欧美一区二区在线播放 | 久久久av| 亚洲欧洲中文日韩 | 国产91在线播放精品91 | 亚洲成年影院 | 羞羞视频网站免费看 | 伊人网91 | 欧美在线免费 | 91精品久久久 | 亚洲国产一区二区在线 | 红色av社区 | 亚洲一区二区免费视频 | 亚洲精品1 | 国产91丝袜在线播放 | 特黄级国产片 | 奇米在线| 免费观看黄a一级视频 | 福利视频网址 | 成人在线观看免费 | 欧美黄页 |