Grails Acegi Плагин аннотации - PullRequest
       12

Grails Acegi Плагин аннотации

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

Я использую аннотации, предоставляемые плагином Spring Security (AKA Acegi). У меня есть действия контроллера, помеченные

@Secured(['ROLE_ADMIN', 'ROLE_USER'])

Чтобы указать, что они должны быть доступны администраторам и обычным пользователям. Но теперь мне нужно указать, что действие доступно администраторам и незарегистрированным пользователям. Можно ли использовать аннотации для обозначения пользователя без какой-либо роли, то есть незарегистрированного?

Спасибо, Дон

Ответы [ 2 ]

2 голосов
/ 26 января 2010

Вот решение, которое требует, чтобы вы не входили в систему, или у вас есть ROLE_ADMIN. Вам нужен пользовательский избиратель, который обрабатывает новый токен IS_NOT_AUTHENTICATED:

package com.burtbeckwith.grails.springsecurity

import org.springframework.security.Authentication
import org.springframework.security.AuthenticationTrustResolverImpl
import org.springframework.security.ConfigAttribute
import org.springframework.security.ConfigAttributeDefinition
import org.springframework.security.vote.AccessDecisionVoter

class NotLoggedInVoter implements AccessDecisionVoter {

   private authenticationTrustResolver = new AuthenticationTrustResolverImpl()

   int vote(Authentication authentication, object, ConfigAttributeDefinition config) {
      for (configAttribute in config.configAttributes) {
         if (supports(configAttribute)) {
            if (authenticationTrustResolver.isAnonymous(authentication)) {
               // allowed if not logged in
               return ACCESS_GRANTED
            }
            for (authority in authentication.authorities) {
               if ('ROLE_ADMIN' == authority.authority) {
                  // allowed if logged in as an admin
                  return ACCESS_GRANTED
               }
            }
         }
      }

      return ACCESS_DENIED
   }

   boolean supports(ConfigAttribute attribute) {
      'IS_NOT_AUTHENTICATED' == attribute?.attribute
   }

   boolean supports(Class clazz) {
      true
   }
}

Зарегистрируйте это как bean-компонент в resources.groovy:

beans = {
   notLoggedInVoter(com.burtbeckwith.grails.springsecurity.NotLoggedInVoter)
}

и добавьте его в список избирателей в SecurityConfig.groovy, установив свойство 'solutionVoterNames':

decisionVoterNames = ['notLoggedInVoter', 'authenticatedVoter', 'roleVoter']

и аннотируйте действие вашего контроллера следующим образом:

@Secured(['IS_NOT_AUTHENTICATED'])

и он разрешит только пользователям, не прошедшим проверку подлинности, и пользователям, прошедшим проверку подлинности с ROLE_ADMIN.

2 голосов
/ 26 января 2010

Маркер для этого IS_AUTHENTICATED_ANONYMOUSLY, что означает, что кто-либо вошел в систему или нет. IS_AUTHENTICATED_REMEMBERED означает, что кто-либо вошел в систему с помощью cookie-файла запомнить или через явный вход в систему, а IS_AUTHENTICATED_FULLY означает, что вошел в систему с помощью явного входа (без использования cookie).

Если вы аннотируете свое действие с помощью

@Secured(['IS_AUTHENTICATED_ANONYMOUSLY'])

тогда это позволит любому получить доступ к этому действию. Вы можете комбинировать эти специальные токены с ролями, например, чтобы разрешить только администратор, но принудительно вводить имя пользователя и пароль, даже если у пользователя есть cookie-файл запомнить меня, который вы будете использовать

@Secured(['ROLE_ADMIN', 'IS_AUTHENTICATED_FULLY'])
...