dbus 和 policykit 原理篇
policykit 机制原理
使用 policykit 一般都有一个dbus daemon程序去管理对应一系列的操作,当有程序来请求这些操作(方法)时,这个daemon程序会根据预先设定好的配置来确定是否要求额外的权限,需要额外的权限会去向libpolkit验证当前操作是否获得了权限,如果当前调用已经取得权限了,则调用顺利通过,否则返回无权限的提示或异常。下面以mount()为例。
当文件管理器向org.freedesktop.Hal请求一个Mount()的方法调用时,
org.freedesktop.Hal 知道这是一个需要root privilege 操作(如果不需要,则直接调用通过),
通过libpolicykit 会向认证数据库(Authorization Database) 检测当前操作是否有足够的权限。
如果没有权限,org.freedesktop.Hal 拒绝执行请求操作并会通知程序没有权限。
这时程序应当通过 org.freedesktop.PolicyKit.AuthenticationAgent (一个dbus daemon)获取相应的权限,
当程序向org.freedesktop.PolicyKit.AuthenticationAgent請求时,这时就会弹出口令验证对话框,当程序通过验证时,org.freedesktop.PolicyKit.AuthenticationAgent会向 Authorization Database 写入cookie,而cookie的有效长短会根据.policy文件配置而变化。
当程序完成验证后,再去請求mount的操作时,org.freedesktop.Hal libpolkit 会再次向Authorization Database检测相应权限,
这时由于org.freedesktop.PolicyKit.AuthenticationAgent授于了当前操作的权限,
所以这次验证通过,这时org.freedesktop.Hal也会执行请求的操作,并返回成功。
原理也就这些了,下面通过来写一个使用policykit服务的实例来掌握一下。