доступ к приложению grails после аутентификации с помощью авторизации на основе ролей ldap

#grails

#grails

Вопрос:

Наше приложение grails использует аутентификацию ldap без каких-либо проблем, теперь мне нужно запретить доступ ко всему приложению, если у пользователя нет определенной роли ldap.

Я могу увидеть роль и использовать ее в своих аннотациях Config.groovy или защитить действия в контроллерах, но вместо этого мне нужен сценарий / способ просто показать сообщение «Отказано …» и выйти из системы. (СООБЩЕНИЕ запрещено 403).

 def filters = {
    loginFilter(controller:'login', action:'ajaxSuccessSproutcore') {
        before = {
            switch(Environment.current.name) {
                case { it == 'development' || it == 'hrm'}:
                    if (springSecurityService.isLoggedIn() amp;amp; grails.plugin.springsecurity.SpringSecurityUtils.ifAnyGranted("ROLE_ADMIN, ROLE_SEA_HRM_LOGIN")){
                    } else {
                        if (springSecurityService.isLoggedIn()) {
                            render ([msg:''] as JSON)
                            session.invalidate()
                            return false
                        }
                    }
                    break

                default:
                    if (springSecurityService.isLoggedIn() amp;amp; grails.plugin.springsecurity.SpringSecurityUtils.ifAnyGranted("ROLE_ADMIN , ROLE_USER")){
                    } else {
                        if (springSecurityService.isLoggedIn()) {
                            render ([msg:''] as JSON)
                            session.invalidate()
                            return false
                        }
                    }
                    break
            }
        }
        after = { Map model ->
        }
        afterView = { Exception e ->
        }
    }
}
  

Ответ №1:

В grails 3 вы можете настроить перехватчик для проверки каждого запроса и выполнения соответствующих действий. В вашем случае вы бы хотели добавить проверку в before блок.

Редактировать: Как отмечает Джефф Браун в комментариях, grails 2 использовал фильтры, а не перехватчики.

Редактировать: что-то вроде этого в вашей логике выхода из системы:

 ...
        else {                
           if (springSecurityService.isLoggedIn()) {
               session.invalidate()
               redirect action:'youShallNotPass'
               return false
           }
        }
  

Комментарии:

1. «В grails 3 вы можете настроить перехватчик для проверки каждого запроса …» — Это правда, но поскольку в исходном вопросе упоминается Config.groovy , разумно ожидать, что они не используют Grails 3. В Grails 2 ближайшей вещью к перехватчику был бы фильтр.

2. Правильно, я использую grails 2.3.11, спасибо за ваш ответ, я посмотрю документацию по фильтру. В моем случае у нас есть новая роль ldap для пользователей HRM, и только эти пользователи могут получить доступ к приложению. (У нас есть 4 варианта приложения, у каждого своя база данных). Например. база данных HRM должна быть доступна только для пользователей HRM.

3. запущен с контроллером beforeInterceptor, но не может найти способ показать запрещенное сообщение / просмотреть и выйти из системы программно.

4. Джефф имеет в виду использование фильтров ( grails.github.io/grails2-doc/2.3.11/guide/single.html#filters ) для выполнения функциональности перехватчика. Не специфичные для домена методы перехватчика «до / после». Вы можете использовать их для перехвата всех запросов и можете session.invalidate() , если пользователь не соответствует вашим критериям.

5. Думал, что фильтры устарели, но я попробую, спасибо. Возможно ли отобразить соответствующее сообщение пользователю перед аннулированием сеанса?