2012-11-17 1 views
1

스프링 보안 (3.1.0)을 사용하여 약간 사용자 정의 된 rememberme 기능을 사용하고 싶습니다.봄 보안 환경에서 어떻게 사용자 정의 된 RememberMeAuthenticationFilter를 사용할 수 있습니까?

나는이 같은에서 rememberme 태그를 선언

<bean id="rememberMeFilter" class="org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter"> 
    <property name="rememberMeServices" ref="gymRememberMeService"/> 
    <property name="authenticationManager" ref="authenticationManager" /> 
</bean> 

나는 봄이 : 나는 내 자신의에서 rememberme 서비스가로서 나는이 같은 정의하는

<security:remember-me key="JNJRMBM" user-service-ref="gymUserDetailService" /> 

내가 RememberMeAuthenticationFilter에 그를 주입 할 필요가 내 web.xml의 표준 방법으로 통합 된 보안 :

<filter-name>springSecurityFilterChain</filter-name> 
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 

Ev Erything은 RememberMeAuthenticationFilter가 표준 RememberMeService를 사용한다는 것을 제외하고는 잘 작동합니다. 따라서 정의 된 RememberMeAuthenticationFilter가 사용되지 않고 있다고 생각합니다.

내 필터 정의가 사용되고 있는지 어떻게 확인할 수 있습니까? 사용자 정의 필터 체인을 만들어야합니까? 그렇다면 현재의 "암시 적"필터 체인을보고 어떻게 기본 필터 대신 내 RememberMeAuthenticationFilter를 제외하고 동일한 필터를 사용할 수 있습니까?

어떤 조언 및/또는 안내해 주셔서 감사합니다! 여기

전체 스프링 security.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:security="http://www.springframework.org/schema/security" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

<security:http pattern="/_ui/**" security="none" /> 
<!-- Default security config --> 
<security:http disable-url-rewriting="true"> 
    <security:anonymous username="anonymous" granted-authority="ROLE_ANONYMOUS" /> 

    <!-- session stealing is prevented by using secure GUID cookie --> 
    <security:session-management session-fixation-protection="none" /> 

    <!-- SSL/AUTHENTICATED pages --> 
    <security:intercept-url pattern="/my-account*" access="ROLE_CUSTOMERGROUP" requires-channel="https" /> 
    <security:intercept-url pattern="/my-account/**" access="ROLE_CUSTOMERGROUP" requires-channel="https" /> 

    <!-- SSL/ANONYMOUS pages Login pages need to be SSL, but occur before authentication --> 
    <security:intercept-url pattern="/login" requires-channel="https" /> 
    <security:intercept-url pattern="/login/**" requires-channel="https" /> 
    <security:intercept-url pattern="/register" requires-channel="https" /> 
    <security:intercept-url pattern="/register/**" requires-channel="https" /> 
    <security:intercept-url pattern="/j_spring_security_check" requires-channel="https" /> 
    <security:intercept-url pattern="/logout" requires-channel="https" /> 

    <!-- MiniCart and CartPopup can occur on either secure or insecure pages --> 
    <security:intercept-url pattern="/cart/rollover/*" requires-channel="any" /> 
    <security:intercept-url pattern="/cart/miniCart/*" requires-channel="any" /> 
    <security:intercept-url pattern="/cart/show" requires-channel="any" /> 
    <security:intercept-url pattern="/cart/lightboxmybag" requires-channel="any" /> 
    <security:intercept-url pattern="/cart/remove/*" requires-channel="any" /> 
    <security:intercept-url pattern="/cart/update/*" requires-channel="any" /> 
    <security:intercept-url pattern="/cart/getProductSizes/**" requires-channel="any" /> 
    <security:intercept-url pattern="/cart/getShippingMethods" requires-channel="any" /> 
    <security:intercept-url pattern="/cart/setShippingMethod" requires-channel="any" />  
    <security:intercept-url pattern="/cart/applyVoucherDiscount" requires-channel="any" /> 
    <security:intercept-url pattern="/cart/removeVoucherDiscount" requires-channel="any" /> 

    <security:intercept-url pattern="/checkout/**" requires-channel="https" /> 

    <!-- product suggest --> 
    <security:intercept-url pattern="/suggest*" requires-channel="any" /> 

    <!-- cybersource response --> 
    <security:intercept-url pattern="/cybersource/response" requires-channel="any" /> 
    <security:intercept-url pattern="/cybersource/csResponse" requires-channel="http" /> 

    <!-- regions --> 
    <security:intercept-url pattern="/regions*" requires-channel="any" /> 
    <security:intercept-url pattern="/regions/*" requires-channel="any" /> 

    <!-- popup links --> 
    <security:intercept-url pattern="/popupLink/*" requires-channel="any" /> 

    <!-- addresses --> 
    <security:intercept-url pattern="/my-addresses*" requires-channel="any" /> 
    <security:intercept-url pattern="/my-addresses/**" requires-channel="any" /> 

    <security:intercept-url pattern="/search/autocompleteSecure/**" requires-channel="https" /> 

    <!-- OPEN/ANONYMOUS pages Run all other (public) pages openly. Note that while credentials are secure, the session id can be sniffed. 
     If this is a security concern, then this line should be re-considered --> 
    <security:intercept-url pattern="/**" requires-channel="any" method="POST" /> <!-- Allow posts on either secure or insecure --> 
    <security:intercept-url pattern="/**" requires-channel="http" /> <!-- Everything else should be insecure --> 

    <security:form-login 
      login-page="/login" 
      authentication-failure-handler-ref="loginAuthenticationFailureHandler" 
      authentication-success-handler-ref="loginGuidAuthenticationSuccessHandler" /> 

    <security:logout logout-url="/logout" success-handler-ref="logoutSuccessHandler" /> 

    <security:port-mappings> 
     <security:port-mapping http="#{configurationService.configuration.getProperty('tomcat.http.port')}" 
      https="#{configurationService.configuration.getProperty('tomcat.ssl.port')}" /> 
     <security:port-mapping http="80" https="443" /> 
     <!--security:port-mapping http="#{configurationService.configuration.getProperty('proxy.http.port')}" 
      https="#{configurationService.configuration.getProperty('proxy.ssl.port')}" /--> 
    </security:port-mappings> 

    <security:request-cache ref="httpSessionRequestCache" /> 

    <security:remember-me key="JNJRMBM" user-service-ref="gymUserDetailService" /> 
</security:http> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider ref="acceleratorAuthenticationProvider" /> 
</security:authentication-manager> 

<bean id="acceleratorAuthenticationProvider" class="org.jnj.storefront.security.AcceleratorAuthenticationProvider" 
    scope="tenant"> 
    <property name="userDetailsService" ref="gymUserDetailService" /> 
    <property name="adminGroup" value="ROLE_ADMINGROUP"/> 
    <property name="userService" ref="userService"/> 
    <property name="gymCustomerLoginService" ref="defaultGymCustomerLoginService"/> 
</bean> 

<bean id="gymUserDetailService" class="org.jnj.storefront.security.services.impl.GymCoreUserDetailsService" scope="tenant"> 
    <property name="baseDao" ref="asyBaseDao" /> 
</bean> 

<bean id="coreUserDetailsService" class="de.hybris.platform.spring.security.CoreUserDetailsService" scope="tenant" /> 

<bean id="guidCookieStrategy" class="org.jnj.storefront.security.impl.DefaultGUIDCookieStrategy" 
    scope="tenant"> 
    <property name="cookieGenerator" ref="guidCookieGenerator" />  
</bean> 

<alias name="defaultGuidCookieGenerator" alias="guidCookieGenerator"/> 
<bean id="defaultGuidCookieGenerator" class="org.jnj.storefront.security.cookie.EnhancedCookieGenerator" scope="tenant"> 
    <property name="cookieSecure" value="true" /> 
    <property name="cookieName" value="acceleratorSecureGUID" />   
    <property name="httpOnly" value="false"/> 
    <!-- if context allows a httpOnly adjust to true --> 
</bean> 

<bean id="autoLoginStrategy" class="org.jnj.storefront.security.impl.DefaultAutoLoginStrategy" scope="tenant"> 
</bean> 

<bean id="httpSessionRequestCache" class="org.jnj.storefront.security.impl.WebHttpSessionRequestCache" 
    scope="tenant" /> 

<bean id="loginUserType" class="org.jnj.storefront.security.impl.LoginUserTypeBean" scope="tenant" /> 

<bean id="redirectStrategy" class="org.springframework.security.web.DefaultRedirectStrategy" scope="tenant" /> 

<!-- Login Success Handlers --> 

<bean id="loginGuidAuthenticationSuccessHandler" class="org.jnj.storefront.security.GUIDAuthenticationSuccessHandler" scope="tenant"> 
    <property name="authenticationSuccessHandler" ref="loginAuthenticationSuccessHandler" /> 
    <property name="guidCookieStrategy" ref="guidCookieStrategy" /> 
</bean> 

<bean id="loginAuthenticationSuccessHandler" class="org.jnj.storefront.security.StorefrontAuthenticationSuccessHandler" scope="tenant"> 
    <property name="customerFacade" ref="customerFacade" /> 
    <property name="defaultTargetUrl" value="/my-account"/> 
    <property name="useReferer" value="true"/> 
    <property name="alwaysUseDefaultTargetUrl" value="false"/> 
    <property name="requestCache" ref="httpSessionRequestCache" /> 
</bean> 

<bean id="loginCheckoutGuidAuthenticationSuccessHandler" class="org.jnj.storefront.security.GUIDAuthenticationSuccessHandler" scope="tenant"> 
    <property name="authenticationSuccessHandler" ref="loginCheckoutAuthenticationSuccessHandler" /> 
    <property name="guidCookieStrategy" ref="guidCookieStrategy" /> 
    <property name="defaultGymCartFacade" ref="gymCartFacade"/> 
</bean> 

<bean id="loginCheckoutAuthenticationSuccessHandler" class="org.jnj.storefront.security.StorefrontAuthenticationSuccessHandler" scope="tenant"> 
    <property name="customerFacade" ref="customerFacade" /> 
    <property name="defaultTargetUrl" value="/checkout/single/summary"/> 
</bean> 

<!-- Login Failure Handlers --> 

<bean id="loginAuthenticationFailureHandler" class="org.jnj.storefront.security.LoginAuthenticationFailureHandler"> 
    <property name="defaultFailureUrl" value="/login?error=auth"/> 
    <property name="accountBlockedUrl" value="/login?error=blocked"/> 
    <property name="passwordMigrationUrl" value="/login?error=migration"/> 
</bean> 

<bean id="loginCheckoutAuthenticationFailureHandler" class="org.jnj.storefront.security.LoginAuthenticationFailureHandler"> 
    <property name="defaultFailureUrl" value="/login/checkout?error=auth"/>  
    <property name="accountBlockedUrl" value="/login/checkout?error=blocked"/> 
    <property name="passwordMigrationUrl" value="/login/checkout?error=migration"/>  
</bean> 


<!-- Logout Success Handler --> 

<bean id="logoutSuccessHandler" class="org.jnj.storefront.security.StorefrontLogoutSuccessHandler" scope="tenant"> 
    <property name="defaultTargetUrl" value="/?logout=true"/> 
    <property name="guidCookieStrategy" ref="guidCookieStrategy"/> 
    <property name="cmsSiteService" ref="cmsSiteService"/> 
</bean> 

<bean id="gymRememberMeService" class="org.jnj.storefront.security.cookie.DefaultRememberMeService" scope="tenant"> 
    <property name="tokenService" ref="secureTokenService" /> 
    <property name="rememberMeCookieGenerator" ref="defaultRememberMeCookieGenerator" /> 
</bean> 

<bean id="rememberMeFilter" class="org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter"> 
    <property name="rememberMeServices" ref="gymRememberMeService"/> 
    <property name="authenticationManager" ref="authenticationManager" /> 
</bean> 

+0

완벽한 'security-context.xml'을 넣을 수 있습니까? – Xaerxess

+0

안녕하세요 @Xaerxess, 방금 추가했습니다. – Sebastian

답변

1

I 양식 - 로그인 및 모두를 선언하는 데 결국 명시 적으로 태그 나를 기억하고 필터 체인을 선언합니다.

대신 태그와 태그 대신 각 필터를 빈으로 선언해야하므로이를 적절하게 구성한 다음 태그가있는 필터 체인의 해당 위치에 정의해야합니다. (사용자 정의 필터 태그와 명시 적 태그를 사용하면 시작하는 동안 스프링 오류가 발생합니다).

여기에 나를 위해 작동 내용은 다음과 같습니다

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:security="http://www.springframework.org/schema/security" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

<security:http pattern="/_ui/**" security="none" /> 


<!-- Default security config --> 
<security:http disable-url-rewriting="true" entry-point-ref="gymAuthenticationEntryPoint"> 

    <!-- using custom login filter config and rememberme filter config --> 
    <security:custom-filter ref="gymRememberMeFilter" position="REMEMBER_ME_FILTER"/> 
    <security:custom-filter ref="gymAuthenticationFilter" position="FORM_LOGIN_FILTER"/> 

    <security:anonymous username="anonymous" granted-authority="ROLE_ANONYMOUS" /> 

    <!-- session stealing is prevented by using secure GUID cookie --> 
    <security:session-management session-fixation-protection="none" /> 

    <!-- SSL/AUTHENTICATED pages --> 
    <security:intercept-url pattern="/my-account*" access="ROLE_CUSTOMERGROUP" requires-channel="https" /> 

<!-- omitting intercept definitions for readability --> 

<!-- use explicit FORM_LOGIN_FILTER (see above) and entry-point (see entry-point-ref in http tag) instead of form-login definition 
    <security:form-login 
      login-page="/login" 
      authentication-failure-handler-ref="loginAuthenticationFailureHandler" 
      authentication-success-handler-ref="loginGuidAuthenticationSuccessHandler" /> 
--> 

    <security:logout logout-url="/logout" success-handler-ref="logoutSuccessHandler" /> 

    <security:port-mappings> 
     <security:port-mapping http="#{configurationService.configuration.getProperty('tomcat.http.port')}" 
      https="#{configurationService.configuration.getProperty('tomcat.ssl.port')}" /> 
     <security:port-mapping http="80" https="443" /> 
     <!--security:port-mapping http="#{configurationService.configuration.getProperty('proxy.http.port')}" 
      https="#{configurationService.configuration.getProperty('proxy.ssl.port')}" /--> 
    </security:port-mappings> 

    <security:request-cache ref="httpSessionRequestCache" /> 


</security:http> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider ref="acceleratorAuthenticationProvider" /> 
    <security:authentication-provider ref="rememberMeAuthenticationProvider" /> 
</security:authentication-manager> 

<bean id="acceleratorAuthenticationProvider" class="org.jnj.storefront.security.AcceleratorAuthenticationProvider" 
    scope="tenant"> 
    <property name="userDetailsService" ref="gymUserDetailService" /> 
    <property name="adminGroup" value="ROLE_ADMINGROUP"/> 
    <property name="userService" ref="userService"/> 
    <property name="gymCustomerLoginService" ref="defaultGymCustomerLoginService"/> 
</bean> 

<bean id="gymUserDetailService" class="org.jnj.storefront.security.services.impl.GymCoreUserDetailsService" scope="tenant"> 
    <property name="baseDao" ref="asyBaseDao" /> 
</bean> 

<bean id="coreUserDetailsService" class="de.hybris.platform.spring.security.CoreUserDetailsService" scope="tenant" /> 


<!-- Login Success Handlers --> 

<bean id="loginGuidAuthenticationSuccessHandler" class="org.jnj.storefront.security.GUIDAuthenticationSuccessHandler" scope="tenant"> 
    <property name="authenticationSuccessHandler" ref="loginAuthenticationSuccessHandler" /> 
    <property name="guidCookieStrategy" ref="guidCookieStrategy" /> 
</bean> 

<bean id="loginAuthenticationSuccessHandler" class="org.jnj.storefront.security.StorefrontAuthenticationSuccessHandler" scope="tenant"> 
    <property name="customerFacade" ref="customerFacade" /> 
    <property name="defaultTargetUrl" value="/my-account"/> 
    <property name="useReferer" value="true"/> 
    <property name="alwaysUseDefaultTargetUrl" value="false"/> 
    <property name="requestCache" ref="httpSessionRequestCache" /> 
</bean> 

<bean id="loginCheckoutGuidAuthenticationSuccessHandler" class="org.jnj.storefront.security.GUIDAuthenticationSuccessHandler" scope="tenant"> 
    <property name="authenticationSuccessHandler" ref="loginCheckoutAuthenticationSuccessHandler" /> 
    <property name="guidCookieStrategy" ref="guidCookieStrategy" /> 
    <property name="defaultGymCartFacade" ref="gymCartFacade"/> 
</bean> 

<bean id="loginCheckoutAuthenticationSuccessHandler" class="org.jnj.storefront.security.StorefrontAuthenticationSuccessHandler" scope="tenant"> 
    <property name="customerFacade" ref="customerFacade" /> 
    <property name="defaultTargetUrl" value="/checkout/single/summary"/> 
</bean> 

<!-- Login Failure Handlers --> 

<bean id="loginAuthenticationFailureHandler" class="org.jnj.storefront.security.LoginAuthenticationFailureHandler"> 
    <property name="defaultFailureUrl" value="/login?error=auth"/> 
    <property name="accountBlockedUrl" value="/login?error=blocked"/> 
    <property name="passwordMigrationUrl" value="/login?error=migration"/> 
</bean> 

<bean id="loginCheckoutAuthenticationFailureHandler" class="org.jnj.storefront.security.LoginAuthenticationFailureHandler"> 
    <property name="defaultFailureUrl" value="/login/checkout?error=auth"/>  
    <property name="accountBlockedUrl" value="/login/checkout?error=blocked"/> 
    <property name="passwordMigrationUrl" value="/login/checkout?error=migration"/>  
</bean> 


<!-- Logout Success Handler --> 

<bean id="logoutSuccessHandler" class="org.jnj.storefront.security.StorefrontLogoutSuccessHandler" scope="tenant"> 
    <property name="defaultTargetUrl" value="/?logout=true"/> 
    <property name="guidCookieStrategy" ref="guidCookieStrategy"/> 
    <property name="cmsSiteService" ref="cmsSiteService"/> 
</bean> 


<!-- remember me services --> 
<bean id="rememberMeServices" class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices"> 
    <property name="userDetailsService" ref="gymUserDetailService"/> 
    <property name="key" value="someprivatekey"/> <!-- must match the rememberMeAuthenticationProvider key --> 
    <property name="parameter" value="rememberMe" /><!-- must match the parameter in the login form --> 
    <property name="cookieName" value="JNJ_RMMBRM" /> 
    <property name="useSecureCookie" value="false" /> <!-- if set to true "remember me" only gets detected when accessed via https --> 
    <property name="tokenValiditySeconds" value="31536000" /> <!-- 1 year --> 
</bean> 

<bean id="rememberMeAuthenticationProvider" class="org.springframework.security.authentication.RememberMeAuthenticationProvider"> 
    <property name="key" value="someprivatekey"/> 
</bean> 

<bean id="gymRememberMeFilter" class="org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter"> 
    <property name="rememberMeServices" ref="rememberMeServices"/> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationSuccessHandler" ref="loginGuidAuthenticationSuccessHandler"/> 
</bean> 

<!-- login filter and entry point --> 
<bean id="gymAuthenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager"/> 
    <property name="filterProcessesUrl" value="/j_spring_security_check"/> 
    <property name="rememberMeServices" ref="rememberMeServices"/> 
    <property name="authenticationSuccessHandler" ref="loginGuidAuthenticationSuccessHandler"/> 
    <property name="authenticationFailureHandler" ref="loginAuthenticationFailureHandler"/> 
</bean> 
<bean id="gymAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
    <property name="loginFormUrl" value="/login"/> 
</bean> 

2

당신이보고 here (Spring Docs)을하려고 했습니까? 그들은 말 :

"() 속성, 이 (당신의 AuthenticationManager.setProviders에 RememberMeAuthenticationProvider 포함) 목록 당신의 UsernamePasswordAuthenticationFilter.setRememberMeServices에 RememberMeServices 구현을 추가로 RememberMeAuthenticationFilter을 추가하는 것을 잊지 마십시오 FilterChainProxy (일반적으로 UsernamePasswordAuthenticationFilter 바로 다음에 ). "

귀하의 경우 RememberMeServices는 gymRememberMeService입니다. RememberMeAuthenticationProvider가 있습니까?

HTH

+0

감사합니다 @ OhadR, 퍼즐의 한 부분이었습니다. 나는 기본적으로 login-form과 remember-me를 명시 적으로 사용해야 만했다. 지금 나와 맞는 솔루션을 게시 해 드리겠습니다. – Sebastian

1

스프링 시큐리티 3.2+는 remember-me 요소에서 services-ref 속성을 지원합니다. 그래서 보안 설정에서, 당신은 것입니다 :

<security:http xmlns="http://www.springframework.org/schema/security"> 
    ... 
    <remember-me services-ref="rememberMeServices" key="secret-key"> 
</security:http> 

<bean id="rememberMeServices" class="com.example.MyRememberMeServices"> 
    <constructor-arg index="0" value="secret-key" /> 
    <constructor-arg index="1" ref="userDetailsService" /> 
    <property name="tokenValiditySeconds" value="1000000" /> 
</bean> 

을 com.example.MyRememberMeServices 사용자 정의 RememberMeServices 구현 클래스입니다. 그런 다음 필터 체인, 인증 관리자 등을 더 이상 사용하지 않아도됩니다.

관련 문제