Многоуровневая система проверки доступа с интерфейсами
Go
Сложный
interfaces
Задача «Многоуровневая система проверки доступа с интерфейсами»
Реализуйте систему проверки доступа к ресурсам с использованием интерфейсов. Определите интерфейс AccessChecker с методами CheckAccess(resource string, user string) bool и GetPermissions(resource string) []string. Реализуйте три структуры: AdminAccess (всегда возвращает true и список всех разрешений, содержащих 'admin'), UserAccess (проверяет наличие пользователя в списке допущенных для ресурса и возвращает разрешения, начинающиеся с 'user_'), GuestAccess (проверяет, что ресурс входит в список общедоступных, и возвращает разрешение 'read' если доступен). Далее реализуйте функцию CreateAccessChecker(accessType string, config map[string]interface{}) (AccessChecker, error), которая по строке accessType ('admin', 'user', 'guest') и конфигурации создает соответствующий объект. Ввод: сначала целое число N (1..100) — количество запросов. Затем N строк вида: accessType resource user. После этого строка с конфигурацией: для admin — пустая строка; для user — строка вида 'resource1:user1,user2;resource2:user3'; для guest — строка вида 'resource1;resource2'. Для каждого запроса выведите 'allowed' или 'denied'. Если accessType неизвестен, выведите 'unknown type'.
Формат ввода
N (целое число)
N строк: accessType resource user
строка конфигурации
Формат вывода
N строк: 'allowed' или 'denied' или 'unknown type'
Примеры
Пример 1
ВВОД
3
admin secret admin
user docs alice
guest public bob
ВЫВОД
allowed
denied
denied
Пример 2
ВВОД
2
admin vault eve
user reports john
resource1:alice,bob;resource2:charlie
ВЫВОД
allowed
denied
Пример 3
ВВОД
1 2 3 4 5
6 7 8 9 10
ВЫВОД
unknown type
Пример 4
ВВОД
1
superuser root root
ВЫВОД
unknown type
Пример 5
ВВОД
-1 2 3 -4 5
6 -7 8 -9 10
ВЫВОД
unknown type
main.go