5

Grailsアプリケーション(Spring Security Pluginを使用しています)でユーザーの変更(ユーザーロールの変更)をすぐに伝達したいと思います。

私はこれを見つけました:

springSecurityService.reauthenticate(userName)

ただし、これは現在ログに記録されているユーザーに対しては機能し、変更ユーザーに対しては機能しません。

これに対する簡単な解決策はありますか(変更されたユーザーの強制ログアウトでも十分です)。

このユースケースは、管理者が他のユーザーロールを変更する場合です。変更されたユーザーがログインしている場合、SpringSecurityのコンテキストでは役割の変更はすぐには表示されません。

4

3 に答える 3

4

Fabianoのおかげで、私は次の解決策を手に入れました。

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()
        }
}

とても簡単 :-)

アップデート:

また、HttpSessionEventPublisherを登録し、 Filter Documentationに従ってさまざまな方法を使用して、ConcurrentSessionFilterをConfig.groovyに追加することを忘れないでください。

web.xml

<listener>
    <listener-class>
       org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
</listener>
于 2012-06-29T13:49:17.463 に答える
2

春のセキュリティSessionRegistryを宣言する必要があると思います。ここでconcurrent-sessionsとここでlist-authenticated-principalsを見てください。

次に、認証されたユーザーを一覧表示してアクセスし、それらを変更できます。

于 2012-06-28T22:16:59.203 に答える
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フィルタを作成して、grails-app/conf現在のユーザー権限が変更されているかどうかを確認します。たとえば、

class MyFilters {
    SecurityHelperService securityHelper

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

                    return false
                }

                return true
            }
        }
    }
}

それで全部です。コードでユーザー権限を更新するたびに、サービスメソッドを呼び出します

securityHelper.markUserUpdate('username')

オンラインユーザーが次にページにアクセスすると、そのユーザーの権限が自動的にチェックされ、再ロードされます。手動でログアウトする必要はありません。

オプションで、新しいログイン時に以前のユーザー更新をクリアして、フィルターでの不要なリダイレクトを回避します

お役に立てれば

于 2013-03-29T07:55:06.590 に答える