Аутентификация пользователя / роли Grails Shiro LDAP: как / что захватывать и хранить для повторного использования

Итак, мне нужна помощь с макетом / структурой моего проекта. Я создаю веб-сайт, и пока у меня есть рабочая страница входа в систему, которая аутентифицирует пользователя с помощью Apache Shiro на сервере LDAP и перенаправляет пользователя на страницу-заставку. В зависимости от разрешений, которые есть у пользователя, они должны / не должны иметь возможность просматривать определенные вещи на странице-заставке.

Что я хотел бы сделать, так это создать нового ShiroUser из информации о сеансе (т.е. пользователя, который только что вошел в систему) и назначить им некоторые роли. Так, например,

def shiroUser = new ShiroUser()
shiroUser.username = session.username
shiroUser.addToRoles(ShiroRole.findByName('ROLE_USER'))
shiroUser.save()

и ROLE_USER будет определяться

def shiroRole = new ShiroRole()
shiroRole.name='ROLE_USER'
shiroRole.save()

Прямо сейчас меня просто интересует его жесткое кодирование, а затем адаптация для поиска в таблице и назначения ролей на основе значений в этой таблице.

Что мне интересно, так это

  • Куда мне положить это?
  • Могу ли я создать для этого новый контроллер?
  • Где я могу определить shiroRoles?
  • Это вообще разумно? (Создание нового ShiroUser каждый раз, когда кто-то входит в систему)

Я никогда раньше не создавал веб-сайт, поэтому я не уверен, как мне структурировать код или где разместить материал. (Я, кстати, использую GGTS.) Буду очень признателен за некоторые указания / советы! Я использую множество книг, таких как Grails in Action, Making Java Groovy и The Definitive Guide to Grails 2, чтобы помочь, но большинство их примеров не соответствуют тому, что я хотел бы сделать. Если есть какие-то учебные пособия, которых я не нашел, мне интересно их увидеть. (Я просмотрел много, но у них есть просто фрагменты кода, как я перечислил, но не указываю, куда они на самом деле идут!)


person mjswartz    schedule 17.07.2015    source источник


Ответы (1)


Я сделал нечто подобное:

https://github.com/vahidhedayati/kchat/blob/master/grails-app/domain/kchat/UserDetails.groovy

но в моем случае я создавал пользователя в своем приложении и хранил различную информацию LDAP, которую я позже использовал свои собственные проверки фильтрации в securityFilters, чтобы убедиться, что их группа LDAP или идентификатор пользователя соответствуют моему внутреннему правилу прохождения / сбоя, которое давало истинный / ложный доступ через securityFilters для данное действие / вызов контроллера.

Также этот https://github.com/vahidhedayati/customshiro, вероятно, является лучшим объяснением вышеуказанной реализации.

Они могут помочь вам придумать лучший дизайн для ваших нужд:

как реализовать Shiro Security of Grails в моем проекте

Защитите некоторые, но не все страницы в приложении Grails с плагином Shiro

http://coderberry.me/blog/2012/04/26/grails-authentication-with-shiro/.

Вы должны либо использовать SecurityFilters (как показано в некоторых из приведенных выше ссылок), то есть:

browseStore(controller:"store", action:"(show|list)") {
before  = {
  // Ignore direct views (e.g. the default main index page).
                if (!controllerName) return true

                // Access control by convention. 
                accessControl() 
}
}

или более утомительно в контроллерах, чтобы сопоставить кредитные данные бэкэнда

SecurityUtils.subject.isPermitted("someController:someAction")
or
if (SecurityUtils.subject.isPermitted("printer:query:lp7200")) {
    // Return the current jobs on printer lp7200
}

Для дальнейших проверок внешнего интерфейса в вашем gsp: как определить, разрешен ли широ uri или извлечь имя контроллера из uri

<shiro:hasPermission permission="someController:someAction">
     <g:link...>
</shiro:hasPermission>
<shiro:lacksPermission permission="someController:someAction">
     No link
</shiro:lacksPermission> 

E2A. В моих первоначальных методах контроль над отделом пользователей / пользователей для данного вызова действия контроллера + даже дальнейшие внутренние проверки в этой среде приложения и appId (это внутренние передаваемые значения) являются динамическими и даже хотя SecurityFilters настроен, фактическое управление передается моей настраиваемой проверке, которая полагается на записи БД для проверки. Теперь это БД, что означает, что вы можете обновлять или добавлять разрешения для данной группы пользователей / подразделений без необходимости обновлять бэкэнд-контроллер / SecurityFilters. Я должен был изложить это по существу, иначе это будут главы, на которые стоит ответить

https://gist.github.com/vahidhedayati/71d92f8153ade5d732b3

еще кое-что, что может помочь: взгляните на арестованный плагин. Демо-сайт здесь, на котором есть скомпилированный вывод плагина на github.com/vahidhedayati/testingarhibited

person V H    schedule 18.07.2015
comment
Итак, обновленная версия моего вопроса такова: где мне создать нового ShiroUser с предоставленными учетными данными? Может быть, в файле AuthController после успешного входа в систему? Если да, как разрешить другим контроллерам доступ к информации shiroUser, такой как shiroUser.username? - person mjswartz; 20.07.2015
comment
если вы следуете моему дикому примеру, то обратитесь к session.user или session.username или, как всегда, когда вы сомневаетесь, shiro вернет фактического пользователя, запустив: def userid = SecurityUtils.subject.principal. Вы увидите, что он используется здесь github.com/vahidhedayati/customshiro/blob/master/grails-app/, и в этом случае я сохраняю пользователя shiro в session.user и далее называю его таковым .. - person V H; 20.07.2015