2014-11-05 3 views
2

Я пишу этот вопрос, чтобы понять, как контролировать номер сеанса, который пользователь мог бы назвать Spring Security Весной я могу определить максимальное число сеанса, что все пользователи должны иметь т.е. корыта управления сеансами я определить, например, что все пользователи не должны иметь возможность иметь более 3 сессииКонтроль безопасности одновременной сессии Spring Security для каждой группы пользователей или для одного пользователя

.sessionManagement().maximumSessions(3) 

это само по себе не достаточно, то есть мы должны дать сервлет контейнер способ уведомлять весеннюю безопасность для обновления сеанса или удаления сеанса и т. д., поэтому нам нужно настроить HttpSessionEventPublishet

@Bean 
public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() { 
    return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher()); 
} 

Теперь вот вопрос как я настроить что-то вроде этого: административных пользователей должны иметь возможность иметь максимальное количество сессии, установленную на 8 сессии про пользователь с правами администратора, но обычные пользователи не должны иметь возможность иметь более один сеанс на пользователя.

+0

Реализовать свою собственную стратегию, основанную на классе 'ConcurrentSessionControlAuthenticationStrategy'. Вам нужно будет переопределить метод getMaximumSessionsForThisUser и реализовать свою логику там. Затем подключите свое пользовательское imlpementation с помощью 'sessionmanagement'. –

+0

Deinum спасибо за этот ответ, я возьму неделю, чтобы обработать эту информацию и сообщить, если это ответ, мне кажется правдоподобным. Снова благодарим за быструю обратную связь. – Tito

ответ

6

Стратегия по умолчанию позволяет устанавливать максимальный сеанс глобально независимо от пользователя. Свойство задано в классе ConcurrentSessionControlAuthenticationStrategy, который имеет простой сеттер для этого свойства.

Фактическое значение определяется в методе getMaximumSessionsForThisUser, который в реализации по умолчанию возвращает значение для свойства maximumSession.

Вы должны были бы реализовать свою собственную стратегию, либо ее реализации полностью самостоятельно, создав класс, который imlpements SessionAuthenticationStrategy или, проще, создав подкласс ConcurrentSessionControlAuthenticationStrategy, который просто переопределяет метод getMaximumSessionsForThisUser.

public class CustomConcurrentSessionControlAuthenticationStrategy extends ConcurrentSessionControlAuthenticationStrategy { 

    protected int getMaximumSessionsForThisUser(Authentication authentication) { 
     boolean admin = // Check authentication.getAuthorities() for the admin role 
     return admin ? 8 : 1; 

    } 
} 

Затем в конфигурации создать @Bean для него и провод, фасоль в sessionManagement разделе конфигурации.

@Bean 
public CustomConcurrentSessionControlAuthenticationStrategy sessionControlStrategy() { 
    return new CustomConcurrentSessionControlAuthenticationStrategy(new SessionRegistryImpl()); 
} 

Затем в коде конфигурации безопасности сделать что-то вроде

sessionManagement().sessionAuthenticationStrategy(sessionControlStrategy()); 
+0

M. Deinum завершил мой тест, он работает! Еще раз спасибо. – Tito

+0

Я хотел только добавить следующее: мне нужно было создать компонент SessionRegistryImpl и передать этот компонент в конструктор CustomConcurrentSessionControlAuthenticationStrategy, поскольку я не определил неявный конструктор по умолчанию, потому что у ConcurrentSessionControlAuthenticationStrategy также нет этого. – Tito

Смежные вопросы