2017-01-04 1 views
0

현재 액티브 세션 여부에 따라 스프링 보안/스프링 세션에서 권한을 부여하는 간단한 방법이 있습니까? 내가 뭘하고 싶은건 ADMIN 권한을 한 번에 하나의 활성 세션으로 제한하는 것입니다. 예를 들어액티브 세션 기반의 스프링 보안 권한 부여

:

  • 사용자 A와 사용자 B 모두 잠재적으로 부여 할 수 ADMIN 권한. 사용자 A의 세션이 여전히 활성화되어있는 동안
  • 사용자 A 로그에.
    • 에 권한 ADMIN에게
  • 사용자 B 로그를 세션을 만들고 부여합니다. 다른 세션이 활성없는 경우에 사용자 B 로그, 권한 ADMIN을 부여하면
    • 권한 사용자

를 세션을 만들고 부여합니다. 사용자 A와 연관된 활성 세션이 이미있을 때 사용자 A가 다시 로그인하면 권한 USER를 새 세션에 연관시킵니다 (사용자 ADMIN은 사용자 A의 '이전'세션과 연관되어 있음).

답변

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의)는 현재 그러한 기준 (부여 된 권한)으로 세션을 검색하거나 기본 세션 저장소에서 모든 세션을 검색하는 것을 지원하지 않기 때문에 복잡합니다. 따라서 이러한 기능을 제공하려면 세션 저장소를 확장해야합니다. 하나 개의 세션에 해당 사용자에 대한 제한, 당신은 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

관련 문제