Sistema multinível de verificação de acesso com interfaces

Go Hard interfaces

Tarefa «Sistema multinível de verificação de acesso com interfaces»

Implemente um sistema de verificação de acesso a recursos utilizando interfaces. Defina a interface AccessChecker com os métodos CheckAccess(resource string, user string) bool e GetPermissions(resource string) []string. Implemente três estruturas: AdminAccess (sempre retorna true e uma lista de todas as permissões contendo 'admin'), UserAccess (verifica a presença do usuário na lista de autorizados para o recurso e retorna permissões que começam com 'user_'), GuestAccess (verifica se o recurso está na lista de públicos e retorna a permissão 'read' se estiver disponível). Em seguida, implemente a função CreateAccessChecker(accessType string, config map[string]interface{}) (AccessChecker, error), que, a partir da string accessType ('admin', 'user', 'guest') e da configuração, cria o objeto correspondente. Entrada: primeiro um número inteiro N (1..100) — quantidade de requisições. Depois, N linhas no formato: accessType resource user. Após isso, uma linha com a configuração: para admin — string vazia; para user — string no formato 'resource1:user1,user2;resource2:user3'; para guest — string no formato 'resource1;resource2'. Para cada requisição, exiba 'allowed' ou 'denied'. Se o accessType for desconhecido, exiba 'unknown type'.

Formato de Entrada

N (número inteiro)
N linhas: accessType resource user
linha de configuração

Formato de Saída

N linhas: 'allowed' ou 'denied' ou 'unknown type'

Exemplos

Exemplo 1

ENTRADA
3 admin secret admin user docs alice guest public bob
SAÍDA
allowed denied denied

Exemplo 2

ENTRADA
2 admin vault eve user reports john resource1:alice,bob;resource2:charlie
SAÍDA
allowed denied

Exemplo 3

ENTRADA
1 2 3 4 5 6 7 8 9 10
SAÍDA
unknown type

Exemplo 4

ENTRADA
1 superuser root root
SAÍDA
unknown type

Exemplo 5

ENTRADA
-1 2 3 -4 5 6 -7 8 -9 10
SAÍDA
unknown type
main.go