#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. Думал, что фильтры устарели, но я попробую, спасибо. Возможно ли отобразить соответствующее сообщение пользователю перед аннулированием сеанса?