Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Access Control, c++

Семён Чиников Ученик (106), открыт 1 неделю назад
Access Control
Предисловие
У вас есть приложение, а в нем есть пользователи. Каждый пользователь характеризуется своим
уникальным номером - id. А еще в приложении есть роли. Каждая роль характеризуется строкой.
Например, 4 пользователя с номерами 2, 101, 567, 1023 и 3 роли ADMIN, MODERATOR, BANNED.
Так вот, роли выдают пользователям, причем у одного пользователя может быть как 0, так и
несколько различных ролей.
Напишите класс, который будет управлять ролями, а именно, выдавать и проверять их наличие.
Задача
Напишите класс
class AccessControl {
public:
bool HasRole(int id, const std::string& roleName) const;
bool GrantRole(int id, const std::string& roleName);
bool RemoveRole(int id, const std::string& roleName);
void RegisterRole(const std::string& roleName);
};
Изначально класс хранит 0 доступных ролей.
Чтобы класс начал работать с ролью с названием roleName, эту роль нужно в нем зарегистрировать
с помощью метода RegisterRole. По сути, этот метод должен
добавлять название роли в список известных ролей.
После этого, roleName можно выдавать пользователям, а также забирать у них.
Выдавать такую роль, которая еще не зарегистрирована в классе - нельзя.
HasRole: проверяет, что у пользователя есть данная роль
GrantRole: выдает пользователю роль
RemoveRole: забирает у пользователя роль
RegisterRole: регистрирует роль в классе
Иногда этот класс может использоваться неправильно, поэтому все методы, кроме RegisterRole,
возвращают bool
Если классом пользуются некорректно, то эти методы должны вернуть false. Например, пытаются
выдать незарегистрированную роль, выдать роль дважды, дважды забрать и тп.
В противном случае, необходимо вернуть true
Для метода HasRole, есть небольшое исключение, если им пользуется некорректно, то возвращать
он должен false, однако, если роли у пользователя и правда нет, то он тоже должен вернуть false.
И только если роль действительно есть, то возвращаемое значение -- true
Реализуйте этот класс. В систему отправляйте только код класса.
Пример использования:
AccessControl control;
control.RegisterRole("ADMIN");
control.GrantRole(1, "ADMIN"); // 1
control.GrantRole(1, "BANNED"); // 0
control.RegisterRole("BANNED");
control.GrantRole(1, "BANNED"); // 1
control.HasRole(1, "BANNED"); // 1
control.HasRole(1, "MODERATOR"); // 0
control.HasRole(2, "ADMIN"); // 0
1 ответ
Сергей Гений (56639) 1 неделю назад
 #include  
#include
#include
#include

class AccessControl
{
std::unordered_set known_roles;
std::unordered_map> users;
public:
void RegisterRole(const std::string& roleName)
{
known_roles.insert(roleName);
}
bool GrantRole(int id, const std::string& roleName)
{
return known_roles.contains(roleName) && users[id].insert(roleName).second;
}
bool HasRole(int id, const std::string& roleName) const
{
return users.contains(id) && users.at(id).contains(roleName);
}
bool RemoveRole(int id, const std::string& roleName)
{
bool ok = HasRole(id, roleName);
if (ok)
{
if (users[id].size() == 1) users.erase(id);
else users[id].erase(roleName);
}
return ok;
}
};
Семён ЧиниковУченик (106) 1 неделю назад
Выдает такую ошибку:
stdout:


stderr
Похожие вопросы