2014-02-04 2 views
1

Я пытаюсь отобразить некоторый контент для всех пользователей, а некоторые для ROLE_ADMIN. Я могу войти в обоих adminuser и useruser (authed через CAS), но увидеть то же содержание, как дляАннотации безопасности Grails, @Secured (['ROLE_ADMIN']) не отображает содержимое для роли

Вот контроллер

package college.infotech.edu 

    import java.awt.GraphicsConfiguration.DefaultBufferCapabilities; 
    import grails.plugin.springsecurity.annotation.Secured 

    class SecureController { 

     @Secured(['ROLE_ADMIN', 'ROLE_USER']) 
     def index() { 
      render 'All Users see this' 

     def showUserName 
      render "<br />" 
      render request.remoteUser 

      @Secured(['ROLE_ADMIN']) 
      def showAdmin = { 
      render "<br />" 
      render "admin users see this" 
      } 
     } 

Вот мой bootstrap.groovy (который работает и делает проверку подлинности с помощью CAS

....... 

def init = { servletContext -> 

     def adminRole = new Role(authority: 'ROLE_ADMIN').save(flush: true) 
     def userRole = new Role(authority: 'ROLE_USER').save(flush: true) 

     def testUser = new AppUser(username: 'adminuser', password:'password', enabled: true, accountExpired: false, accountLocked: false, passwordExpired: false) 
     testUser.save(flush: true) 

     def testUser2 = new AppUser(username: 'useruser', password:'password', enabled: true, accountExpired: false, accountLocked: false, passwordExpired: false) 
     testUser2.save(flush: true) 

     UserRole.create testUser, adminRole, true 
     UserRole.create testUser2, userRole, true 

     assert AppUser.count() == 2 
     assert Role.count() == 2 
     assert UserRole.count() == 2 
    } 

    ....... 

Вот некоторые соответствующие журналы записей

[http-bio-8080-exec-8] DEBUG intercept.FilterSecurityInterceptor - Secure object: FilterInvocation: URL: /secure/index; Attributes: [ROLE_ADMIN, ROLE_USER] 
[http-bio-8080-exec-8] DEBUG intercept.FilterSecurityInterceptor - Previously Authenticated: org.spr[email protected]5d4cb3a4: Principal: [email protected]: Username: adminuser; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_ADMIN; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframewo[email protected]: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: CCFEACE94A4EC5FFB3B13ACA0E06BB1A; Granted Authorities: ROLE_ADMIN Assertion: [email protected] [http-bio-8080-exec-8] DEBUG hierarchicalroles.RoleHierarchyImpl - getReachableGrantedAuthorities() - From the roles [ROLE_ADMIN] one can reach [ROLE_ADMIN] in zero or more steps. 
[http-bio-8080-exec-8] DEBUG intercept.FilterSecurityInterceptor - Authorization successful 

ответ

1

Это странно выглядящее действие контроллера. Это метод под названием index, защищенный либо ROLE_ADMIN, либо ROLE_USER, и несколько вызовов визуализации и загадочное аннотированное закрытие showAdmin. В общем случае у вас должен быть только один вызов render, и если Grails объединяет выводимый вывод из нескольких вызовов для вас, вы должны рассмотреть его как ошибку, которая будет исправлена ​​в какой-то момент.

Внутренний showAdmin Закрытие не делает ничего. Это просто закрытие в середине метода, и оно не называется Grails или вашим кодом. Поскольку это всего лишь объект внутри метода, он не рассматривается Grails как вызываемое действие, и Spring Security не видит в нем что-то, что нужно защитить или обработать.

+0

Спасибо, Берт, я grails noob. Это очевидно? Как только я убрал это, он начал работать. – Baci

+0

Прохладный. Не стесняйтесь принять ответ;) –

Смежные вопросы