복붙노트

[SPRING] 스프링 보안 동시성 제어

SPRING

스프링 보안 동시성 제어

스프링 보안 3.0.7을 사용하고 프로젝트에서 동시성 제어를 구현하고 있습니다. 하지만 작동하지 않습니다. 나는 사용했다.

<security:session-management>
            <security:concurrency-control error-if-maximum-exceeded="true" max-sessions="1"/>
</security:session-management>

심지어 나는 스프링 보안 참조에서 해결책을 시도했지만 제대로 작동하지 않았다. 다음은 구성 파일 내용입니다.

  <session-management session-authentication-strategy-ref="sas"/>
</http>

<beans:bean id="concurrencyFilter"
   class="org.springframework.security.web.session.ConcurrentSessionFilter">
  <beans:property name="sessionRegistry" ref="sessionRegistry" />
  <beans:property name="expiredUrl" value="/session-expired.htm" />
</beans:bean>

<beans:bean id="myAuthFilter" class=
   "org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
  <beans:property name="sessionAuthenticationStrategy" ref="sas" />
  <beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>

<beans:bean id="sas" class=
 "org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
  <beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" />
  <beans:property name="maximumSessions" value="1" />
</beans:bean>

<beans:bean id="sessionRegistry"
    class="org.springframework.security.core.session.SessionRegistryImpl" />

다음과 같은 예외가 발생합니다.

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Filter beans '<myAuthFilter>' and '<org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0>' have the same 'order' value. When using custom filters, please make sure the positions do not conflict with default filters. Alternatively you can disable the default filters by removing the corresponding child elements from <http> and avoiding the use of <http auto-config='true'>.
Offending resource: class path resource [config/auth.xml]
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:72)
    at org.springframework.security.config.http.HttpSecurityBeanDefinitionParser.checkFilterChainOrder(HttpSecurityBeanDefinitionParser.java:196)
    at org.springframework.security.config.http.HttpSecurityBeanDefinitionParser.parse(HttpSecurityBeanDefinitionParser.java:132)
    at org.springframework.security.config.SecurityNamespaceHandler.parse(SecurityNamespaceHandler.java:86)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1338)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1328)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)

누구든지이 질문에 도움이 될 수 있습니까?

해결법

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

    1.동시성 제어 네임 스페이스 요소를 사용하는 경우 ConcurrentSessionFilter가 필터 체인에 자동으로 추가되므로 사용자 정의 필터를 사용하여 동일한 위치에 필터를 추가 할 수 없거나이 오류가 발생합니다.

    동시성 제어 네임 스페이스 요소를 사용하는 경우 ConcurrentSessionFilter가 필터 체인에 자동으로 추가되므로 사용자 정의 필터를 사용하여 동일한 위치에 필터를 추가 할 수 없거나이 오류가 발생합니다.

    form-login (또는 auto-config)을 사용하고 사용자 정의 필터를 사용하여 UsernamePasswordAuthenticationFilter를 추가하려는 경우에도 동일한 문제가 발생합니다. 그게 당신이 여기있는 특정 문제를 일으키는 것 같습니다 (당신의 bean myAuthFilter와 함께).

    아마도 http 요소 구성의 나머지 부분을 질문에 추가하여 충돌이 발생하는 곳을보다 분명하게해야합니다.

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

    2.설명서에 다음과 같이 적혀 있습니다.

    설명서에 다음과 같이 적혀 있습니다.

    따라서 사용자 정의 필터 태그를 여기에서 사용할 수 없습니다. 그것이 오류를 줄 수있는 이유입니다. 나는이 URL에서 위 내용을 차지했다. 이것 좀 봐:

    참조 : http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#nsa-concurrency-control

  3. ==============================

    3.web.xml에 다음을 추가하십시오.

    web.xml에 다음을 추가하십시오.

      <listener>
        <listener-class>
          org.springframework.security.web.session.HttpSessionEventPublisher
        </listener-class>
      </listener>
    
  4. ==============================

    4.UserPrincipal 및 UserPrincipalImpl (사용자 고유의 구현)을 작성한 경우 Object의 equals () 및 hashCode () 메소드를 대체해야합니다.

    UserPrincipal 및 UserPrincipalImpl (사용자 고유의 구현)을 작성한 경우 Object의 equals () 및 hashCode () 메소드를 대체해야합니다.

  5. ==============================

    5.나는 다음과 같은 applicationContext-security.xml을 가지고 있으며 완벽하게 작동한다.

    나는 다음과 같은 applicationContext-security.xml을 가지고 있으며 완벽하게 작동한다.

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:security="http://www.springframework.org/schema/security"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">
    
        <context:component-scan base-package="com.mycompany.test"/>
    
        <security:http use-expressions="true">
            <security:http-basic/>
            <security:intercept-url pattern="/**" access="isAuthenticated()" />
            <security:session-management>
                <security:concurrency-control error-if-maximum-exceeded="true" max-sessions="1"/>
            </security:session-management>  
        </security:http>
    
    
        <security:global-method-security secured-annotations="enabled"/>
    
        <security:authentication-manager>
            <security:authentication-provider>
                <security:user-service>
                    <security:user name="restuser" password="restuser" authorities="ROLE_RESTCLIENT"/>
                </security:user-service>
            </security:authentication-provider>
        </security:authentication-manager>
    
    </beans>
    

    제대로 테스트하려면 다음을 수행해야합니다. 두 개의 다른 브라우저에서 웹 사이트를 열고 쿠키를 지 웁니다. 2 번째로 로그인 할 수있는 시간은 처음입니다. 두 경우 모두 브라우저에 HTTP 인증 양식이 표시되어야합니다. 보지 못한다면 이전 세션에서 이미 인증되었음을 의미하므로 쿠키를 삭제해야합니다. (안전한쪽에 두 개의 다른 브라우저로 테스트해야합니다. 그렇지 않으면 쿠키를 공유해야합니다)

  6. from https://stackoverflow.com/questions/8586824/spring-security-concurrency-control by cc-by-sa and MIT license