Многоуровневая система проверки доступа с интерфейсами

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