Grails с SpringSecurity, проверьте, может ли текущий пользователь получить доступ к контроллеру / действию - PullRequest
7 голосов
/ 21 февраля 2010

В настоящее время я разрабатываю меню для своего приложения, которое должно отображать только те контроллеры, к которым у текущего пользователя есть доступ (карта запроса определена в базе данных).

Как я могу проверить, имеет ли текущий пользователь доступ к определенному контроллеру и действию?

Ответы [ 8 ]

6 голосов
/ 31 июля 2013

Для проверки ролей в поле зрения: Плагин безопасности Spring предоставляет теги ifAllGranted, ifAnyGranted, ifNoneGranted и т. Д. Для проверки ролей

Например, чтобы проверить роль администратора вошедшего в систему пользователя:

<sec:ifLoggedIn>
    <sec:ifAllGranted roles="ROLE_ADMIN">
        Admin resource
     </sec:ifAllGranted>
</sec:ifLoggedIn>

(протестировано в Grails-2.2.2 и springSecurityCorePlugin-1.2.7.3)

4 голосов
/ 20 мая 2011
org.grails.plugins.springsecurity.service.AuthenticateService authenticateService = new org.grails.plugins.springsecurity.service.AuthenticateService()
def isAdmin = authenticateService.ifAllGranted('ROLE_ADMIN')

if(isAdmin) {
   println 'I am Admin'
}
3 голосов
/ 13 марта 2012

Этот вопрос довольно старый, но я решил опубликовать хотя бы ответ, который, похоже, работает с Grails 2.0.Если вы используете подключаемый модуль безопасности Spring, есть библиотека lib, которая называется grails.plugins.springsecurity.SecurityTagLib .

. В теге lib есть защищенный метод hasAccess (), который может приниматьта же карта параметров, которую вы предоставляете тегу g: link .Итак, если вы расширяете SecurityTagLib, вы можете вызвать hasAccess () и получить желаемое поведение.Почему это не выводится в сервис, который может быть внедрен, мне не понятно, так как функциональность, кажется, удовлетворяет очевидную потребность.

Мы используем это, чтобы обернуть тег g: link и толькосгенерировать ссылку пользователя, имеющего доступ к целевой странице:

def link = { attrs, body ->
    if( hasAccess(attrs.clone(), "link") ) {
        out << g.link(attrs, body)
    }
    else {
        out << body()
    }
}
1 голос
/ 06 февраля 2014

Не уверен в ситуации, когда этот вопрос первоначально задавался, но теперь вы можете проверить, находится ли пользователь в определенной роли, с помощью SpringSecurityUtils.ifAllGranted(), который принимает одну строку, представляющую собой список ролей, разделенных запятыми. Он вернет true, если текущий пользователь принадлежит всем им.

if(SpringSecurityUtils.ifAllGranted('ROLE_ADMIN,ROLE_USER')) {

Очевидно, вы можете просто передать одну роль функции, если это все, что вам нужно. SpringSecurityUtils также имеет методы типа ifAnyGranted, ifNotGranted и т. Д., Поэтому он должен работать для всего, что вы пытаетесь достичь.

SpringSecurityUtils - это статический API, поэтому вам не нужно создавать закрытый член с именем springSecurityUtils или чем-то подобным.

1 голос
/ 22 февраля 2010

При работе с разрешениями в представлениях и метках тегов вы можете использовать AuthorizeTagLib , предоставляемый плагином.

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

<g:isLoggedIn>
  <li>Restricted Link</li>
</g:isLoggedIn>

Если у вас определены более конкретные роли, и эти роли связаны с вашим контроллером / отображением запроса действия, вы можете использовать другие теги, такие как:

<g:ifAllGranted role="ROLE_ADMINISTRATOR">
  <li>Administrator Link</li>
</g:ifAllGranted>

По моему опыту, пока нет хорошего способа привязать сопоставление запросов к вашей разметке - я думаю, вам придется использовать некоторые из перечисленных выше тегов, чтобы ограничить доступ к контенту в конкретном GSP.

Я думаю, что Burt Beckwith имеет будущую модификацию (и в настоящее время предоставляет бета-версию ) для плагина, который объединяет некоторые вещи ACL, которые могут решить эту проблему лучше в будущем, но сейчас я думаю, что лучший подход - это гибридная карта запросов + теги GSP один.

0 голосов
/ 26 февраля 2010

Я не уверен насчет Groovy, но в Java (поэтому я предполагаю, что Groovy тоже ...) вы могли бы сделать (за исключением проверок NPE):

GrantedAuthority[] authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
boolean isAdmin = false;
for(GrantedAuthority authority : authorities) {
    String role = authority.getAuthority();
    if(role != null && role.equals("ROLE_ADMIN")) {
        isAdmin = true;
        break;
    }
}

Что касается того, чтобы узнать, поддерживается ли действие, вам нужно будет вызвать службу RequestMap, чтобы получить роли для сопоставления, и посмотреть, содержит ли она найденную роль пользователя.

0 голосов
/ 23 февраля 2010

Насколько я могу судить, не похоже, что есть простой способ сделать это.

Вы можете внедрить экземпляр Grails AuthenticatedVetoableDecisionManager, который является конкретным классом SpringAccessDecisionManager, выполнив это:

def accessDecisionManager

Это метод "решить", который принимает 3 параметра

decide(Authentication authentication, Object object, ConfigAttributeDefinition config)

Это, вероятно, метод, который вам нужно будет вызвать и передать в нужных местах, чтобы выяснить, может ли пользователь с правами доступа auth получить доступ к этому "объекту" (который обычно выглядит как запрос / ответ). Некоторые дополнительные раскопки могут доказать что-то здесь подходящее.

В краткосрочной перспективе, вероятно, проще использовать тег тега ifAnyGranted, как упоминает другой автор.

0 голосов
/ 22 февраля 2010

Необходимо настроить файл config / SecurityConfig.groovy (если он не существует, создайте его, он переопределяет конфигурацию безопасности по умолчанию)

Добавить эту запись:

requestMapString = """\
            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
            PATTERN_TYPE_APACHE_ANT
            /=IS_AUTHENTICATED_REMEMBERED
            /login/auth=IS_AUTHENTICATED_ANONYMOUSLY
            /login/authajax=IS_AUTHENTICATED_ANONYMOUSLY
            /login/authfail=IS_AUTHENTICATED_ANONYMOUSLY 
            /js/**=IS_AUTHENTICATED_ANONYMOUSLY
            /css/**=IS_AUTHENTICATED_ANONYMOUSLY
            /images/**=IS_AUTHENTICATED_ANONYMOUSLY
            /plugins/**=IS_AUTHENTICATED_ANONYMOUSLY
            /**=IS_AUTHENTICATED_REMEMBERED
          """

Это означает, что вы должны войти в систему, чтобы войти на сайт. Но все ресурсы (CSS, JS, изображения и т. Д.) Доступны без аутентификации.

Если вы хотите определенную роль, введите только определенный контроллер: Например, для UserController:

    /user/**=ROLE_ADMIN
    /role/**=ROLE_ADMIN 

Для получения дополнительной информации: http://www.grails.org/AcegiSecurity+Plugin+-+Securing+URLs

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...