Ice是個(gè)好東西,希望國(guó)內(nèi)能普及
? ? ? ? 我們?cè)诖罱↖ce 注冊(cè)中心后,使用圖形工具 【IceGrid Admin】 或者命令行工具【icegridadmin】登錄時(shí),默認(rèn)情況下,都是不需要賬號(hào)密碼,直接登錄,這在線上運(yùn)營(yíng)時(shí)是無(wú)法接受的。
下面是原始配置(參數(shù)Ice 官方demo:Documents\ZeroC\Ice-3.6.4-demos\cpp\IceGrid\customLocator)


IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
IceGridAdmin.Username=foo
IceGridAdmin.Password=bar
雖然設(shè)置了賬號(hào)密碼,但是由于DemoIceGrid/NullPermissionsVerifier組件使用的是默認(rèn)組件,組件內(nèi)部沒(méi)有判斷邏輯,需要自己實(shí)現(xiàn),所以就沒(méi)有賬號(hào)密碼功能。只會(huì)在操作的配置時(shí),留下必要的痕跡。

我們看下代碼是如何實(shí)現(xiàn)

邪惡的分割線
==================================================================
class GLACIER2_API PermissionsVerifier : virtual public ::Ice::Object
{
? ? virtual bool checkPermissions(const ::std::string&, const ::std::string&, ::std::string&, const ::Ice::Current& = ::Ice::Current()) const = 0;
};
class NullPermissionsVerifier : public Glacier2::PermissionsVerifier
{
public:
? ? bool checkPermissions(const string&, const string&, string&, const Current&) const
? ? {
? ? ? ? return true;
? ? }
};
SessionPrx
RegistryI::createSession(const string& user, const string& password, const Current& current)
{
? ? try
? ? {
? ? ? ? string reason;
? ? ? ? if(!_clientVerifier->checkPermissions(user, password, reason, current.ctx))
? ? ? ? {
? ? ? ? ? ? PermissionDeniedException exc;
? ? ? ? ? ? exc.reason = reason;
? ? ? ? ? ? throw exc;
? ? ? ? }
? ? }
}
class RegistryI : public Registry
{
? ? Glacier2::PermissionsVerifierPrx _clientVerifier;
};
==================================================================
可以看到,checkPermissions函數(shù)本身并未執(zhí)行任何操作。在這樣的配置下,需要使用自己開(kāi)發(fā)的組件替換NullPermissionsVerifier,才能實(shí)現(xiàn)限制賬號(hào)密碼登錄。
下一篇文章將介紹如何使用?AdminCryptPasswords 配置,實(shí)現(xiàn)Ice注冊(cè)中心的賬號(hào)密碼登錄。