2012-05-04 2 views
1

Я использую Grails 2.0.3 и последний плагин Spring Security для защиты моих контроллеров.Почему @Secured в Grails Spring Security игнорируется?

Но почему-то контроллеры не защищены.

import grails.plugins.springsecurity.Secured 

@Secured("ROLE_USER") 
class SettingsController extends UtilController { 
    def index(){ 
    render "should not run while not logged in" 
    } 
} 

Когда я и не вошел в систему, я вижу сообщение. Если я вставляю SpringSecurityService, он показывает корректный статус в журнале (true/false), поэтому аннотация просто не обрабатывается.

Я попытался добавить требование «IS_AUTHENTICATED_FULLY» и переместить аннотацию в метод, это не поможет.

О чем это могло быть связано?

ответ

5

@Secured аннотация принимает список ролей (String[]), и у меня возникла проблема с преобразованием строки в массив строк.

Вы можете попробовать @Secured(["ROLE_USER"])?

+0

Я попытался '@Secured ([ "ROLE_USER", "IS_AUTHENTICATED_FULLY"])' и 'просто @Secured ([ "ROLE_UNEXISTENT"]) ', но это не помогает. Наверное, это не тот случай. –

+0

Вы уверены, что не настроили его на использование безопасности «resuestmap»? –

-2

Я думаю, что аннотация @secured работает только для методов внутри контроллера, а не для класса.

Попробуйте использовать его как это:

import grails.plugins.springsecurity.Secured 

class SettingsController extends UtilController { 
    @Secured(["ROLE_USER"]) 
    def index(){ 
    render "should not run while not logged in" 
    } 
} 
+0

Он работает для обоих, особенно хорошо, если вы используете иерархию типа ROLE_ADMIN> ROLE_USER. Уровень контроллера устанавливает самый низкий уровень, который может получить доступ к ЛЮБОЙ операции, а затем вы можете установить определенные действия для более высокого уровня. Или он может использоваться как дополнительный вид операции, например, если у вас есть ROLE_USER, вы можете получить доступ к индексу, но если у вас есть ROLE_USER AND ROLE_ADMIN, вы можете увидеть adminIndex ... – Kelly

5

Есть ли у вас что-то другое, чем

grails.plugins.springsecurity.securityConfigType = "Annotation" 

В конфигурационном файле?

+0

Вы только что спасли мой день :) – user666

0

Я нашел решение для своего дела. Убедитесь, что у вас есть filterInvocationInterceptor в вашем списке grails.plugins.springsecurity. filterNames в Config.groovy, как в примере:

grails.plugins.springsecurity.filterChain.filterNames = [ 
    'securityContextPersistenceFilter', 'logoutFilter', 
    'authenticationProcessingFilter', 'myCustomProcessingFilter', 
    'rememberMeAuthenticationFilter', 'anonymousAuthenticationFilter', 
    'exceptionTranslationFilter', 'filterInvocationInterceptor' 
] 
Смежные вопросы