Autorização por função
Checar acesso por lista de bloqueio, por método ou por grafia deixa funções de admin abertas para quem não devia.
Cada ação sensível (fechar a temporada, promover um usuário, exportar tudo) é uma função que deveria ser restrita a certos papéis. Autorização por função é decidir, antes de executar, se este usuário pode chamar esta função. Três erros comuns abrem buraco.
Lista de bloqueio em vez de permissão. Bloquear só o papel guest deixa passar member, staff e qualquer papel novo. O certo é liberar só quem pode (if role !== 'admin': deny) e negar o resto.
Checar só um método. Uma regra que barra só GET /admin ignora POST, PUT, DELETE. Se o app atende a ação em qualquer verbo, um POST passa reto.
Checar texto sem normalizar. Comparar o caminho byte a byte deixa /ADMIN escapar de um filtro que só casa /admin, enquanto o app roteia os dois para o mesmo lugar.
A defesa: negar por padrão, liberar por lista de permissão (de papéis e de métodos), e normalizar o caminho antes de checar. Em Python, troque if role == "guest": deny() por require_permission("season:close"), que vale para todo verbo e todo papel.