Ice是个好东西,希望国内能普及
我们在搭建Ice 注册中心后,使用图形工具 【IceGrid Admin】 或者命令行工具【icegridadmin】登录时,默认情况下,都是不需要账号密码,直接登录,这在线上运营时是无法接受的。
下面是原始配置(参数Ice 官方demo:Documents\ZeroC\Ice-3.6.4-demos\cpp\IceGrid\customLocator)
IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
IceGridAdmin.Username=foo
IceGridAdmin.Password=bar
虽然设置了账号密码,但是由于DemoIceGrid/NullPermissionsVerifier组件使用的是默认组件,组件内部没有判断逻辑,需要自己实现,所以就没有账号密码功能。只会在操作的配置时,留下必要的痕迹。
我们看下代码是如何实现
邪恶的分割线
==================================================================
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函数本身并未执行任何操作。在这样的配置下,需要使用自己开发的组件替换NullPermissionsVerifier,才能实现限制账号密码登录。
下一篇文章将介绍如何使用 AdminCryptPasswords 配置,实现Ice注册中心的账号密码登录。