Вопрос по spring-security, grails – Ra-authenticate измененного пользователя в приложении Grails

5

Я хотел бы немедленно распространять изменения пользователя (изменение ролей пользователя) в моем приложении Grails (я использую Spring Security Plugin).

Я нашел это:

springSecurityService.reauthenticate(userName)

но это работает для текущего зарегистрированного пользователя, а не для изменения!

Есть ли какое-то простое решение для этого (мне хватит даже принудительного выхода из системы измененных пользователей).

Вариант использования для этого - когда администратор меняет какую-то другую роль пользователя. Если измененный пользователь вошел в систему, изменение роли не сразу видно в контексте Spring Security.

Ваш Ответ

3   ответа
2

Я думаю, что вы должны объявить весеннюю безопасность SessionRegistry. Посмотрите здесьодновременный-сессий и здесьСписок прошедшей проверки подлинности-директора школы.

Затем вы можете перечислить и получить доступ к аутентифицированным пользователям и изменить их.

4

Благодаря Фабиано я пришел со следующим решением, которое работает:

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

// Place your Spring DSL code here
beans = {
    // bind session registry
    sessionRegistry(SessionRegistryImpl)

    sessionAuthenticationStrategy(ConcurrentSessionControlStrategy, sessionRegistry) {
        maximumSessions = -1
    }

    concurrentSessionFilter(ConcurrentSessionFilter){
        sessionRegistry = sessionRegistry
        expiredUrl = '/login/concurrentSession'
    }
}

MyService.groovy

def sessionRegistry

def expireSession(User user) {
        def userSessions = sessionRegistry.getAllSessions(user, false)
        // expire all registered sessions
        userSessions.each {
            log.debug "Expire session [$it] of the user [$user]"
            it.expireNow()
        }
}

Довольно легко :-)

Update:

Также не забудьте зарегистрировать HttpSessionEventPublisher и добавить concurrentSessionFilter в Config.groovy, используя различные способы в соответствии сФильтровать документацию.

web.xml

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

Долго провёл в интернете по той же проблеме. Предложенные решения не сработали (может быть, мне не повезло :). Так вот мой путь

Сначала мы создаем сервис Grails следующим образом:

class SecurityHelperService {
    final Set<String> userUpdates = new HashSet<String>()

    public void markUserUpdate(String username) {
        synchronized (userUpdates) {
            userUpdates.add(username)
        }
    }

    public boolean clearUserUpdate(String username) {
        synchronized (userUpdates) {
            return userUpdates.remove(username) != null
        }
    }

    public boolean checkUserUpdate() {
        def principal = springSecurityService.principal

        if (principal instanceof org.springframework.security.core.userdetails.User) {
            synchronized (userUpdates) {
                if (!userUpdates.remove(principal.username)) {
                    return true
                }
            }

            springSecurityService.reauthenticate(principal.username)

            return false
        }

        return true
    }
}

вgrails-app/conf каталог, в котором мы создаем фильтр Grails, чтобы проверить, были ли изменены текущие права пользователя, например

class MyFilters {
    SecurityHelperService securityHelper

    def filters = {
        userUpdateCheck(controller: '*', action: '*') {
            before = {
                if (!securityHelper.checkUserUpdate()) {
                    redirect url: '/'

                    return false
                }

                return true
            }
        }
    }
}

Вот и все. Каждый раз при обновлении прав пользователя в коде мы вызываем метод сервиса

securityHelper.markUserUpdate('username')

Когда в следующий раз пользователь онлайн посещает страницу, его / ее права автоматически проверяются и перезагружаются. Не требуется ручной выход.

При желании мы удаляем предыдущее обновление пользователя при новом входе в систему, чтобы избежать ненужного перенаправления в фильтре.

Надеюсь это поможет

Похожие вопросы