Я сделал так: В сессии хранится массив ролей, доступных юзеру. Этот массив создается в начале сессии. Он может быть изменен в случае авторизации юзера.
С определенных IP я запрещаю/разрешаю юзеру иметь те или иные роли. Соответственно, в начале сессии я проверяю, можно или нет дать юзеру с этим IP те или иные роли.
Отправить IP в бан - это для меня тоже самое, что запретить для данного IP все роли. Если массив ролей пуст, посетитель видит пустую страницу. Сколько бы он не шарился, в течении всей сессии я на него даже запроса не потрачу
Но в общем-то бан - очень редкое явление. Чаще этот механизм используется для того, чтобы ограничить права админа, если он заходит на сайт не с рабочего места.
Например, роль 'admin' запрещается для всех IP и разрешается только для конторского. После этого, в админку сайта можно зайти только с рабочего места.