2015-01-20 1 views
0

У меня есть следующая проблема: у меня есть домены по умолчанию для пользователей и ролей, и я использую плагин Spring Security. Существует специальное требование, в котором говорится, что если администратор удаляет пользователя с USER_ROLE, и этот пользователь аутентифицируется в настоящий момент, то этот пользователь должен быть немедленно отключен от приложения. Можно ли программно сделать выход для пользователя, если у нас есть экземпляр объекта этого пользователя? Somethig likeпринудительный выход для аутентифицированного пользователя с использованием весеннего плагина безопасности

def(User user) { 

    someSpringService.forceLogout(user) 

} 

Спасибо!

+1

Посмотрите на некоторые ответы здесь, они приведут вас к тому, как это сделать: http://stackoverflow.com/questions/11247495/ra-authenticate-changed-user-in-grails-application –

+0

@JoshuaMoore спасибо, но, к сожалению, это не помогает: ((( –

+0

Почему бы и нет? Он четко показывает, как настроить реестр сеанса, найти сеанс для данного пользователя и аннулировать (например, выйти) пользователя. Чего не хватает? –

ответ

1

Я новичок в grails. Недавно у меня возникла задача заставить пользователя выставить пользователя на изменение его привилегий администратором. Итак, после некоторых исследований здесь мое решение. Я отслеживаю сеансы пользователей, и как только его сеанс изменен, я просто заканчиваю его активные сеансы.

В файле web.xml, добавьте слушателя

<listener> 
<listener-class>  
    org.springframework.security.web.session.HttpSessionEventPublisher 
</listener-class> 
</listener> 

В resources.groovy

import org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy 
import org.springframework.security.web.session.ConcurrentSessionFilter 
import org.springframework.security.core.session.SessionRegistryImpl 
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy 

beans = { 
// bind session registry 
    sessionRegistry(SessionRegistryImpl) 
    sessionAuthenticationStrategy(ConcurrentSessionControlStrategy,sessionRegistry){ 
     maximumSessions = -1 } 
    concurrentSessionFilter(ConcurrentSessionFilter){ 
    sessionRegistry = sessionRegistry 
    expiredUrl = '/login/auth?f=true' 
    } 
} 

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

def expireSession(User user) { 
    log.info("Process to expire session begins") 
    def orginalUser = springSecurityService?.principal.username 
    log.info("session infos for all principals: ${sessionRegistry.getAllPrincipals()}") 
    sessionRegistry.getAllPrincipals()?.each { princ -> 
     def allSessions = sessionRegistry.getAllSessions(princ, true); 
     log.info("all sessions: ${allSessions}") 
     log.info("principal: $princ; email: ${user?.email}; username: ${princ?.username}") 
     if(princ?.username?.equals(user?.email)) {  //killing sessions only for user ([email protected]) 
      sessionRegistry.getAllSessions(princ, true)?.each { sess -> 
       log.info("session: ${sess}; expiring it") 
       if(sess.expireNow()) 
        log.info("----session expired----") 
       springSecurityService?.reauthenticate(user?.email) 
       springSecurityService?.reauthenticate(orginalUser) 
      } 

     } 
    } 
} 

В RequestFilters.groovy, где по каждому запросу если сессия действительна или истек

class RequestFilters { 

def springSecurityService 
def sessionRegistry 

def filters = { 
    all(controller:'*', action:'*') { 
     before = { 
      log.info(controllerName + '/' + actionName + " : " + params) 
      log.info("request ${request}; session: ${request?.session}") 
      def sessInfo = sessionRegistry.getSessionInformation(request?.session?.id) 
      log.info("sessionRegistry: ${sessionRegistry}") 
      log.info("Session Id: ${request?.session?.id}") 
      log.info("session info: ${sessInfo}; is expired: ${sessInfo?.expired}") 
      if(sessInfo?.expired==true) 
       response.sendRedirect(grailsApplication.config.grails.serverURL+"/j_spring_security_logout"); 

     } 
     after = { Map model -> 

     } 
     afterView = { Exception e -> 

     } 
    }  
} 

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

  • Нет связанных вопросов^_^