2015-04-09 2 views
1

У меня есть этот класс обслуживания:Grails springSecurityService.currentUser возвращает нуль

class UserService { 

    def springSecurityService 

    @Listener(topic = 'currentUser', namespace = 'auth') 
    public User getCurrentUser(){ 
     return springSecurityService.currentUser 
    } 

    def authenticate(OAuthToken oAuthToken){ 
     SecurityContextHolder.context.authentication = oAuthToken 
     return springSecurityService.currentUser 
    } 
} 

Если я использую метод AUTHENTICATE, springSecurityService.currentUser возвращает текущий пользователь. Но если я уже зарегистрирован, я хочу получить текущего пользователя с помощью метода getCurrentUser и он возвращает null. Я отлаживал метод Springsecurityservice.getCurrentUser, и метод isLoggedIn возвращает false.

Но если я попытаюсь это на мой взгляд, это работает:

<sec:ifLoggedIn>Yeeees</sec:ifLoggedIn> 

UPDATE:

Когда я бегу UserService.getCurrentUser SCH.context.authentication в SecurityService возвращает нуль. После этого вызова визуализируется представление, и SCH.context.authentication возвращает правильную аутентификацию.

UPDATE 2:

Я проанализировал его и, кажется, только в том случае, если я использую его с шиной событий. Если я вызываю getCurrentUser непосредственно из контроллера, он работает нормально, но если я использую шину событий, это не так. Я использую Event Bus от плагинов платформы. Есть ли еще SCH.context для шины событий?

+0

Но в чем причина получения текущего пользователя, использующего событие? – Ramsharan

+0

Я просто хочу отделить мой контроллер/службы. – CyberAleks

ответ

4

Я нашел решение. Проблема заключалась в том, что Event Bus работает в потоке, а весенний контекст не будет доставляться в потоки по умолчанию.

Опция 'контекст держатель стратегии' в конфигурации решить эту проблему:

grails.plugin.springsecurity.sch.strategyName = org.springframework.security.core.context.SecurityContextHolder.MODE_INHERITABLETHREADLOCAL 

http://grails-plugins.github.io/grails-spring-security-core/latest/#miscProperties

0

Вы можете получить основную, а затем искать пользователя, в mycase области является AppUser

 def user = springSecurityService.getPrincipal() 
     def testUser =AppUser.findByUsername(user.username) 
Смежные вопросы