[spring] كيف يمكنني الحصول على قائمة بجميع المستخدمين الذين قاموا بتسجيل الدخول (عبر الأمن الربيعي) تطبيق الويب الخاص بي


Answers

في JavaConfig ، سيبدو الأمر كالتالي:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        // ...
        http.sessionManagement().maximumSessions(1).sessionRegistry(sessionRegistry());
    }

    @Bean
    public SessionRegistry sessionRegistry() {
        return new SessionRegistryImpl();
    }

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

مع رمز الاتصال تبدو كالتالي:

public class UserController {
    @Autowired
    private SessionRegistry sessionRegistry;

    public void listLoggedInUsers() {
        final List<Object> allPrincipals = sessionRegistry.getAllPrincipals();

        for(final Object principal : allPrincipals) {
            if(principal instanceof SecurityUser) {
                final SecurityUser user = (SecurityUser) principal;

                // Do something with user
                System.out.println(user);
            }
        }
    }
}

لاحظ أن SecurityUser هو صفي الخاص الذي ينفذ UserDetails .

Question

أستخدم أمان الربيع في تطبيق الويب الخاص بي ، والآن أريد الحصول على قائمة بجميع المستخدمين الذين قاموا بتسجيل الدخول إلى برنامجي.

كيف يمكنني الوصول إلى تلك القائمة؟ أليست محفوظة بالفعل في مكان ما في إطار الربيع؟ مثل SecurityContextHolder أو SecurityContextRepository ؟




أرجوا أن تصحح لي إذا كنت مخطئا.

أعتقد @Adam's إجابة @Adam's غير كاملة. لقد لاحظت أن الجلسات التي انتهت صلاحيتها بالفعل في القائمة كانت تظهر مرة أخرى.

public class UserController {
    @Autowired
    private SessionRegistry sessionRegistry;

    public void listLoggedInUsers() {
        final List<Object> allPrincipals = sessionRegistry.getAllPrincipals();

        for (final Object principal : allPrincipals) {
            if (principal instanceof SecurityUser) {
                final SecurityUser user = (SecurityUser) principal;

                List<SessionInformation> activeUserSessions =
                        sessionRegistry.getAllSessions(principal,
                                /* includeExpiredSessions */ false); // Should not return null;

                if (!activeUserSessions.isEmpty()) {
                    // Do something with user
                    System.out.println(user);
                }
            }
        }
    }
}

آمل أن يساعد.




Related