2017-03-28 3 views
0

Grails 3.2.8의 컨트롤러에서 springSecurityService.currentUser를 가져올 수 없습니다.Grails 3.2.8 컨트롤러에서 springSecurityService.currentUser를 가져올 수 없습니다.

Grails 3.2.8은 Spring Security Core를 위반하는 것으로 보이는 이전 버전과는 달리 성능이 향상되었습니다. Grails 3.2.8 dependency injection in domain classes에 따르면 grails.gorm.autowire = true로 설정하여 그 비 호환성을 수정했습니다.

단계 재현 :

  1. 은 역할 및 그룹을 사용하여 봄 보안 3.1.1 새로운 Grails의에게 3.2.8 웹 응용 프로그램을 만듭니다. 부트 스트랩에서 application.yml에서

  2. 설정 grails.gorm.autowire = 사실

  3. :

    def init = { servletContext -> 
        User user = new User(username: 'foo', password:'foo').save(flush: true) 
        Role role = new Role(authority: 'SomeRole').save(flush: true) 
        RoleGroup roleGroup = new RoleGroup(name: 'SomeRole').save(flush: true) 
        RoleGroupRole.create(roleGroup, role) 
        UserRoleGroup.create(user, roleGroup) 
    } 
    
  4. 는 컨트롤러 TestController 만들기 :

    @Secured(['SomeRole']) 
    class TestController { 
        def springSecurityService 
    
        def index() { 
         println "springSecurityService==null? ${(springSecurityService==null).toString()}" 
         println "SecurityContextHolder.context==null? ${(SecurityContextHolder.context==null).toString()}" 
         println "SecurityContextHolder.context?.authentication==null? ${(SecurityContextHolder.context?.authentication==null).toString()}" 
         println "springSecurityService.principal==null? ${(springSecurityService.principal==null).toString()}" 
         println "springSecurityService.currentUser==null? ${(springSecurityService.currentUser==null).toString()}" 
    
         render "1" //Render something so we don't get an exception. 
        } 
    } 
    
  5. 가 시작을 서버로 이동하여/test로 이동하십시오. 출력은 다음과 같습니다 좋은 해결 방법은

    springSecurityService==null? false 
    SecurityContextHolder.context==null? false 
    SecurityContextHolder.context?.authentication==null? true 
    springSecurityService.principal==null? true 
    springSecurityService.currentUser==null? true` 
    

있습니까?

답변

0

SecurityContextHolder.context가 null가 아닌 경우 (이 널 (null) 일 수 없습니다)하지만 SecurityContextHolder.context?.authentication 다음이 아마 Grails의 또는 플러그인 문제가되지 않습니다, 널 - 당신은 인증되지 않은 것입니다. 따라서 캐싱 된 사용자 ID를 가져 오는 데 사용할 주체가 없습니다 (즉, 출력이 표시 될 때 springSecurityService.principal이 null 임) 현재 사용자 인스턴스를 검색 할 수있는 방법이 없습니다.

0

변형 됨. 버전 3.2.8부터는 application.yml에 grails.gorm.autowire = false라는 기본 설정이 있습니다. 서비스를 항상 true로 설정해야합니다.