Grails + Защитное приложение - PullRequest
       21

Grails + Защитное приложение

1 голос
/ 01 сентября 2010

Я работаю над устаревшим приложением Grails.

У меня есть пара таких таблиц

User ( id, name,enterprise_id)

Enterprise (id, name)

Asset (id,description, enterprise_id)

Я хочу подтвердить, что когда определенный пользователь хочет получить доступ к ресурсу, онимеет право enterprise_id (т. е. пользователь принадлежит тому же предприятию, что и актив).

Например, рассмотрим

только пользователя из Microsoft и Чарльза (из Oracle)Чарльз должен иметь доступ к виртуальной машине Java.

Enterprise
id,name
--------
1 Oracle
2 Microsoft

Asset
id,description,enterprise_id
----------------------------
1 Java VM     1
2 .NET        2

User
id name    enterprise_id
----------------------
1  John     2
2  Charles  1

Я читал о весенней безопасности , но, похоже, это не поможет мне.Я вижу только аутентификацию пользователя, пароли, роли и т. Д. (Конечно, я могу ошибаться).Эти вещи уже защищены и работают нормально.На данный момент я рассматриваю фильтры , но не могу заставить их работать и проверяю свою собственную безопасность (см. этот вопрос), что кажется неправильным.

Есть мысли?Spring Security - это путь?Широ?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 01 сентября 2010

Вы могли бы реализовать это с помощью spring-security-acl (который зависит от ядра-security-security)

В противном случае вы могли бы реализовать двухфазный подход (Аутентификация + Авторизация) снабор авторизации на уровне объекта фильтры .

1 голос
/ 02 сентября 2010

Я использую плагин Hibernate Filter для этого. Существует также плагин MultiTenant и его плагин Falcone.

То, что они делают, это в основном добавление ограничений ко всем запросам БД, чтобы сделать именно то, к чему, как я думаю, вы стремитесь. Типичным решением для вас (с Hibernate Filter) было бы добавить это в домен активов (изменить имя фильтра для каждого нового домена) ...

static hibernateFilters = {
  assetEnterpriseFilter(condition: ':enterpriseId=enterprise_id', types: 'integer', default: true)
}

... и извлеките HibernateFilterFilters из плагина для переопределения следующим образом (устанавливая переменную сеанса в качестве параметра) ...

class HibernateFilterFilters {

    def filters = {
        all(controller:'*', action:'*') {
            before = {
                    def hibernateSession = grailsApplication.mainContext.sessionFactory.currentSession
                    DefaultHibernateFiltersHolder.defaultFilters.each {name ->
                        hibernateSession.enableFilter(name).setParameter('enterpriseId', session?.enterpriseId ? session.enterpriseId.toInteger() : new Integer(0))
                    }
            }

            after = {

            }
            afterView = {

            }
        }
    }

}

... и убедитесь, что не используете enterprise_id = 0 в БД.

0 голосов
/ 24 сентября 2010

Apache Shiro имеет встроенный контроль доступа, и для него также есть плагин grails.

Аутентификация - это акт, подтверждающий, что кто-то является тем, кем, по его словам, он является, то есть выполняет вход в приложение. Авторизация - это процесс контроля доступа к определенным данным или функциям приложения (контроль «кто» может делать, «что»).

Shiro имеет обе эти концепции, встроенные в его API, и выполняет их довольно хорошо - вы даже можете контролировать доступ к отдельным экземплярам (например, «просматривать» пользователя с идентификатором 12345 и т. Д.). Я настоятельно рекомендую взглянуть на плагин Grails для Shiro, а также на дистрибутив Shiro - он включает в себя несколько примеров веб-приложений (с Spring и без Spring), и вы можете увидеть, как использовать его контроль доступа - либо с фильтрами сервлетов для ресурса на основе URL. контроль или аннотации для защиты отдельных методов.

НТН,

Les

...