복붙노트

[SPRING] SessionRegistry로 사용자 로그인하기

SPRING

SessionRegistry로 사용자 로그인하기

Weblogic 컨테이너에 의해 완전히 보호되는 웹 응용 프로그램이 있습니다. 이제 현재 로그인 한 사용자를 나열해야합니다. 스프링 보안 2.0.4를 사용해야합니다.

web.xml에서 필자는 필요한 리스너와 필터를 정의했습니다.

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
    </listener>

    <filter>
        <filter-name>Spring Security Filter Chain Proxy</filter-name>
        <filter-class>org.springframework.security.util.FilterToBeanProxy</filter-class>
        <init-param>
            <param-name>targetClass</param-name>
            <param-value>org.springframework.security.util.FilterChainProxy</param-value>
        </init-param> 
    </filter>


    <filter-mapping>
        <filter-name>Spring Security Filter Chain Proxy</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

그 후 나는 이것을 이해하면서 콩을 정의했다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>

<bean id="filterChainProxy"
        class="org.springframework.security.util.FilterChainProxy">
        <property name="filterInvocationDefinitionSource">
            <value>
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                PATTERN_TYPE_APACHE_ANT
                /**=httpSessionIntegrationFilter,logoutFilter,exceptionTranslationFilter,concurrencyFilter
            </value>
        </property>
    </bean>

    <bean id="httpSessionIntegrationFilter"
        class="org.springframework.security.context.HttpSessionContextIntegrationFilter" />

    <bean id="logoutFilter"
        class="org.springframework.security.ui.logout.LogoutFilter">
        <constructor-arg value="/logout.html" />
        <!-- URL redirected to after logout -->
        <constructor-arg>
            <list>
                <bean
                    class="org.springframework.security.ui.logout.SecurityContextLogoutHandler" />
            </list>
        </constructor-arg>
        <property name="filterProcessesUrl" value="/j_acegi_logout" />
    </bean>

    <bean name="concurrencyFilter" class="org.springframework.security.concurrent.ConcurrentSessionFilter">
      <property name="sessionRegistry" ref="sessionRegistryBean"/>
      <property name="expiredUrl" value="/session-expired.htm"/>
    </bean>

    <bean id="authenticationEntryPoint"
        class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint">
        <property name="loginFormUrl">
            <value>/</value>
        </property>
    </bean>

    <bean id="exceptionTranslationFilter"
        class="org.springframework.security.ui.ExceptionTranslationFilter">
        <property name="authenticationEntryPoint"
            ref="authenticationEntryPoint" />
    </bean>

    <bean id="sessionRegistryBean" class="org.springframework.security.concurrent.SessionRegistryImpl">
    </bean>

</beans>

마지막으로 사용자를 나열하는 간단한 JSP 페이지를 작성했습니다.

  <body>
    <% 

    ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
    ActiveSessions as = new ActiveSessions(appContext);
    for(String u : as.getUsers()) {
      %>
        <ul><li><% out.println(u); %></li></ul>
        <% 
    }
    %>
  </body>

그리고 다음은 내 도우미 클래스가 사용자 목록을 얻는 방법입니다.

public List<String> getUsers() {
    SessionRegistry sr = (SessionRegistry) a.getBean("sessionRegistryBean");
    Object[] principals = sr.getAllPrincipals();

    List<String> result = new ArrayList<String>();

    for(int i = 0; i < principals.length; i++) {
      SessionInformation[] sis = sr.getAllSessions(principals[i], false);
      result.add(principals[i].toString());
      logger.info("Adding entry: " + principals[i].toString() + ", sessions: " + sis.length);
    }

    return result;
}

불행히도이 모든 것은 작동하지 않으며 디버깅하는 방법을 알지 못합니다. 내가하는 일은 (container-managed BASIC auth 뒤에) applicaton을 사용하고 jsp 페이지를 호출하는 것입니다. 목록은 항상 비어 있습니다.

해결법

  1. ==============================

    1.위에서 언급 한 구성의 문제점은 콩이 SessionRegistry에 데이터를 넣을 책임이 없다는 것입니다. 세션 이벤트는 응용 프로그램에 게시되지만 인증서가 레지스트리에 저장되도록 더 많은 빈이 필요합니다. 예를 들어 AuthenticationManager를 구성해야합니다. 이것이 없으면 SessionRegistry는 항상 비어있게됩니다.

    위에서 언급 한 구성의 문제점은 콩이 SessionRegistry에 데이터를 넣을 책임이 없다는 것입니다. 세션 이벤트는 응용 프로그램에 게시되지만 인증서가 레지스트리에 저장되도록 더 많은 빈이 필요합니다. 예를 들어 AuthenticationManager를 구성해야합니다. 이것이 없으면 SessionRegistry는 항상 비어있게됩니다.

  2. ==============================

    2.이 작업은 http://krams915.blogspot.com/2010/12/spring-security-mvc-querying.html에서 수행 할 수 있습니다.

    이 작업은 http://krams915.blogspot.com/2010/12/spring-security-mvc-querying.html에서 수행 할 수 있습니다.

    즐겨 :)

  3. from https://stackoverflow.com/questions/5912149/getting-logged-in-users-with-a-sessionregistry by cc-by-sa and MIT license