[SPRING] SessionRegistry로 사용자 로그인하기
SPRINGSessionRegistry로 사용자 로그인하기
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.위에서 언급 한 구성의 문제점은 콩이 SessionRegistry에 데이터를 넣을 책임이 없다는 것입니다. 세션 이벤트는 응용 프로그램에 게시되지만 인증서가 레지스트리에 저장되도록 더 많은 빈이 필요합니다. 예를 들어 AuthenticationManager를 구성해야합니다. 이것이 없으면 SessionRegistry는 항상 비어있게됩니다.
위에서 언급 한 구성의 문제점은 콩이 SessionRegistry에 데이터를 넣을 책임이 없다는 것입니다. 세션 이벤트는 응용 프로그램에 게시되지만 인증서가 레지스트리에 저장되도록 더 많은 빈이 필요합니다. 예를 들어 AuthenticationManager를 구성해야합니다. 이것이 없으면 SessionRegistry는 항상 비어있게됩니다.
-
==============================
2.이 작업은 http://krams915.blogspot.com/2010/12/spring-security-mvc-querying.html에서 수행 할 수 있습니다.
이 작업은 http://krams915.blogspot.com/2010/12/spring-security-mvc-querying.html에서 수행 할 수 있습니다.
즐겨 :)
from https://stackoverflow.com/questions/5912149/getting-logged-in-users-with-a-sessionregistry by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 봄 부팅시 Aop 관련 문제 (0) | 2019.04.10 |
---|---|
[SPRING] Spring 애플리케이션의 예외 처리 위치 (0) | 2019.04.10 |
[SPRING] 봄 부팅로드 orm.xml (0) | 2019.04.10 |
[SPRING] 스프링 부트 Autowired가 Configuration 클래스에서 작동하지 않습니다. (0) | 2019.04.10 |
[SPRING] 모든 프로 바이더의 후에 Spring Security java.lang.StackOverflowError 예외 (0) | 2019.04.10 |