2017-01-04 7 views
0

現在アクティブなセッションがあるかどうかに基づいて、春のセキュリティ/春のセッションで権限を与える簡単な方法はありますか?私がしたいのは、一度に1つのアクティブなセッションにADMIN権限を制限することです。例えばアクティブなセッションに基づく春のセキュリティの権限の付与

  • ユーザーAとユーザーBの両方が潜在的にADMIN権限を付与することができます。
  • ユーザーAログはインチ
    • ユーザーAのセッションがまだアクティブである間に
    ユーザーBのログをセッションと助成金権限ADMINを作成します。
    • 権限ADMINを付与し、他のセッションがアクティブでないときでユーザBがログインした場合セッション、付与権限USER

を作成します。 ユーザーAに関連付けられたアクティブ・セッションがすでに存在する場合に、ユーザーAが再びログインする場合は、権限USERを新規セッションに関連付ける(ユーザーAの「古い」セッションに関連する権限ADMINを残す)。

答えて

1

次のように我々は、アクティブな管理セッションの存在を確認することができ、SessionRegistryHttpSessionEventPublisherがすでに設定されていると仮定:

public boolean adminActiveSessionExists() { 

    for(Object principal: sessionRegistry.getAllPrincipals()) { 
     /* write a method hasAdminAuthority to check if principal is admin */ 
     if (hasAdminAuthority(principal)) { 
      /* Check if there is any active admin session */ 
      if (sessionRegistry.getAllSessions(principal, false) 
        .stream().anyMatch(sessionInfo -> !sessionInfo.isExpired())) { 

       return true; 
      } 
     } 
    } 

    return false; 
} 

あなたはその後、権限を付与するために、あなたの認証ロジックでそれを使用することができます。これは、単一のサーバーでのみ機能することに注意してください。

+0

['getAllPrincipals'操作がサポートされていないため]これはSpringセッションでサポートされている' SessionRegistry'では機能しません。(https://github.com/spring-projects/spring-session/blob/master/spring-session/ src/main/java/org/springframework/session/security/SpringSessionBackedSessionRegistry.java#L55-L58)。興味深いのは –

0

要件は、ConcurrentSessionControlAuthenticationStrategyのように聞こえますが、プリンシパル(ユーザー名)ではなく付与された権限に基づいています。

セッションを取得するためのAPI(Spring SessionのFindByIndexNameSessionRepository)は、現在、そのような基準(許可された権限)によるセッションの取得、または基本セッションストアからのすべてのセッションの取得をサポートしていないため、このような機能を提供するには、セッションストアを拡張する必要があります。

また、あなたは別のアプローチを使用することができます - あなたはADMIN権限を付与された単一のユーザーを持っている可能性があるセッションにそのユーザの同時セッション数を制限し、必要なときにADMINユーザーに切り替えるには春のセッションのmultiple session supportを使用。それがあなたに受け入れられるかどうかは分かりませんが、それはオプションになる可能性があります。

+0

です。ユーザー名だけのセッションクエリは、API [Spring Session - ユーザー名で検索]で指定されているようです(http://docs.spring.io/spring-session/docs/current/reference/html5/guides/findbyusername.html )。 [GemFireOperationsSessionRepository](https://github.com/spring-projects/spring-session/blob/master/spring-session/src/main/java/org/springframework/session/data/gemfire/GemFireOperationsSessionRepository.java)の実装任意のセッション属性によってセッションクエリをサポートします。 – Ritesh

関連する問題