0

アプリケーション管理者として、たとえば、選択したユーザーにフラグ "enabled = false" を設定した後、任意のユーザーをログオフできるようにしたいと考えています。スプリングセキュリティで可能ですか?

私のアプリケーションでは、ユーザーが「remember Me」を使用できるようになっていることを付け加えておきます。

私が使用している: grails 2.2.1 プラグイン spring-security-core 1.2.7.3

spring-security-core の設定 (config.groovy):

grails.plugins.springsecurity.useHttpSessionEventP ublisher = true 
grails.plugins.springsecurity.useSessionFixationPr evention = true 
grails.plugins.springsecurity.userLookup.userDomai nClassName = 'com.app.User' 
grails.plugins.springsecurity.userLookup.authority JoinClassName = 'com.app.UserRole' 
grails.plugins.springsecurity.authority.className = 'com.app.Role' 
grails.plugins.springsecurity.userLookup.usernameP ropertyName = 'email' 

grails.plugins.springsecurity.securityConfigType = "Requestmap" 
grails.plugins.springsecurity.rejectIfNoRule = true 
grails.plugins.springsecurity.requestMap.className ='com.app.Requestmap' 
grails.plugins.springsecurity.requestMap.urlField= 'url' 
grails.plugins.springsecurity.requestMap.configAtt ributeField='configAttribute' 
grails.plugins.springsecurity.rememberMe.cookieNam e = 'remember_me' 
grails.plugins.springsecurity.cacheUsers = false 
grails.plugins.springsecurity.rememberMe.tokenVali ditySeconds=604800 

誰かが同様の問題を抱えている可能性がありますか?前もって感謝します :)

4

2 に答える 2

0

UserDetails.enabledフラグを false に設定するDisabledExceptionと、ユーザーの次のセキュア リクエストで a がスローされます。これにより、ユーザーをデフォルトauthfailハンドラーに送信するかUrlMappings、ユーザーをカスタム コントローラーまたはアクションに送信するように例外ハンドラーを構成できます。

enabledアプリケーションの他の場所でフラグを使用していない場合はDisabledException、認証セッション (および rememberMe) をクリアしてからenabledフラグをリセットするアクションを指定できます。

別の可能な方法は、カスタム フィルターを作成し、Bootstrap.

URL 例外マッピングとフィルター構成の両方については、Spring Security Plugin のドキュメントで説明されています。

于 2013-03-19T22:18:53.060 に答える
0

Codelark に感謝します。フィルターについて読んでいて、それらを使用しようとしています :) 残念ながら、選択したユーザー アプリケーションに対して enabled = false を設定すると、「/login /authfail」にリダイレクトされません。何よりも、変更 (有効 = false) はユーザー プロファイルに表示されますが、目的の効果が得られません。

追加しますが、「expireNow」をユーザーセッションに設定しようとしました:

def expireSession(User user) {          
    def orginalUser = springSecurityService?.principal.username
    springSecurityService?.reauthenticate(user?.email)  //modified user np: test@app.com
    springSecurityService?.reauthenticate(orginalUser)  //admin np: admin@app.com

    sessionRegistry.getAllPrincipals()?.each { princ ->         
        sessionRegistry.getAllSessions(princ, false);

        if(princ?.username?.equals(user?.email)) {      //killing sessions only for user (test@app.com) 
            sessionRegistry.getAllSessions(princ, false)?.each { sess ->
                sess.expireNow()                
            }
        }//if
    }//each
}//expireSession

つまり、sessionRegistry は実際には各ユーザーのアクティブなセッションを取得しますが、次のように呼び出します。

sess.expireNow()

その結果、同じユーザーに対して expireSession (ユーザー) を再度呼び出すと、セッションは表示されなくなります。有効期限が切れているため、これは理解できます。

しかし、期限切れのユーザーセッションにもかかわらず。彼はアプリケーションで作業を続ける可能性があります。アプリケーションはあなたをログオフしません

于 2013-03-21T22:56:05.280 に答える