Мой первый пользователь

Материал из ISPWiki
Перейти к: навигация, поиск

По умолчанию, панель разрешает доступ к панели управления локальному администратору сервера. В данной статье мы рассмотрим, как можно авторизовать собственного пользователя.

Предположим, что у вас есть файл etc/passwd, в котором хранятся имена пользователей и их пароли разделенные двоеточием (в данном примере для простоты пароли хранятся в открытом виде).

За авторизацию пользователей отвечает базовая функция authenticate. Нам необходимо создать обработчик события authenticate. Как это сделать, вы можете прочитать в статье: мой первый Event.

Но C++ CORE API представляет дополнительные инструменты, чтобы упростить создание собственного метода авториации - это класс isp_api::AuthMethod. В минимальном варианте, вам необходимо определить два виртуальных метода AuthenByName и AuthenByPassword.

Пример myauth.cpp (чтобы не загромождать пример, мы не делаем никаких дополнительных проверок):

#include <mgr/mgrstr.h>
#include <api/auth_method.h>
#include <api/module.h>
#include <fstream>
#include <sstream>
    
#define PASSWD  "etc/passwd"
namespace {
using namespace isp_api;
class MyAuth : public AuthMethod {
public:         
    MyAuth() : AuthMethod("myauth") {}
    string Lookup(const string &name) const {
        if (!name.empty()) {
            std::ifstream in(PASSWD);
            while (in.good()) {
                std::stringbuf buf; 
                in.get(buf);
                in.get();
                string pass = buf.str();
                string user = str::GetWord(pass, ':');
                if (user == name && !pass.empty())
                    return pass;
            }
        }
        return "";
    }

    void FillupParams(const string &user, mgr_xml::Xml &xml) const {
            xml.GetRoot().AppendChild("ok")
                .SetProp("level", str::Str(lvAdmin))
                .SetProp("name", user)
                .SetProp("method", "myauth");
    }

    virtual void AuthenByName(mgr_xml::Xml &res, const string &name) const {
        if (!Lookup(name).empty())
            FillupParams(name, res);
    }

    virtual void AuthenByPassword(mgr_xml::Xml &res, const string &name, const string &pass) const {
        string lppass = Lookup(name);
        if (!lppass.empty() && lppass == pass)
            FillupParams(name, res);
    }
};

MODULE_INIT(myauth, "") {
    new MyAuth();
}
} // end of private namespace

Теперь остается побеспокоится о загрузке и соборке библиотеки. Как это сделать, описано в статьях: Сборка собственных компонентов и Загрузка собственных библиотек.