2011-12-12 2 views
11

저는 스프링 기반의 mvc 및 스프링 보안 기반 웹 기반 애플리케이션을 구축하고 있습니다.스프링 보안에서 만료 된 비밀번호를 변경하도록 사용자를 강요합니다.

암호 재설정 기능을 구현했습니다. 시스템 관리자는 모든 사용자의 암호를 재설정합니다. 생성 된 임의의 암호는 사용자에게 전자 메일로 전송되며 데이터베이스에서도 업데이트됩니다.

이제 임의로 생성 된 비밀번호로 로그인 할 때마다 사용자가 비밀번호를 변경하도록하고 싶습니다.

사용자 표 좀 봐주세요.

사용자 ID BIGINT (20)
자명 VARCHAR (20)
암호 VARCHAR (65)
이메일 VARCHAR (50)
FIRSTNAME의 VARCHAR (20)
LASTNAME의 VARCHAR (20)
그룹 이름의 VARCHAR (50)
활성화 TINYINT (1)
credentialsNonExpired의 TINYINT (1)

MY Authenticat I는 jdbcUserServiceJdbcDaoImpl은으로 연장 JDBCUserDetailsService를 사용한

<!-- 
     Configuring Authentication Provider to make use of spring security 
     provided Jdbc user management service 
    --> 
    <authentication-provider user-service-ref="jdbcUserService"> 
     <!-- 
      Configuring SHA-1 Password Encoding scheme to secure user credential 
     --> 
     <password-encoder ref="sha1PasswordEncoder" /> 
    </authentication-provider> 
</authentication-manager> 

이온 공급자.

비밀번호를 재설정 할 때 credentialNonExpired을 내 사용자 테이블의 허위 열로 설정하고 싶습니다.

나는 그렇게 할 수있다.

그러나 로그인 할 때 스프링 보안 JDBCuserdetailsservice loadUserbyUsername 사용자 이름, 암호, 사용 가능한 열 및 나머지 모든 필드 만 true로 설정됩니다.

protected List<UserDetails> loadUsersByUsername(String username) { 
    return getJdbcTemplate().query(usersByUsernameQuery, new String[] {username}, new RowMapper<UserDetails>() { 
     public UserDetails mapRow(ResultSet rs, int rowNum) throws SQLException { 
      String username = rs.getString(1); 
      String password = rs.getString(2); 
      boolean enabled = rs.getBoolean(3); 
      return new User(username, password, enabled, true, true, true, AuthorityUtils.NO_AUTHORITIES); 
     } 

    }); 
} 

는하지만 실제 그 봄 보안 CREDENTIALEXPIREDEXCEPTION을 던질 것이다, 그래서 다시 암호가 설정 필드를 credentialNonExpired합니다.

나는 위의 방법을로드하여이를 달성했지만 만료 된 비밀번호로 로그인 할 때 비밀번호 페이지를 변경하도록 사용자를 리디렉션하는 다른 방법이 있습니다.

어떻게 할 수 있습니까?

답변

1

SimpleUrlAuthenticationSuccessHandler의 서브 클래 싱을 시도하고 비밀번호 만기 확인을위한 사용자 정의 로직을 구현할 수 있습니다. 이 SimpleUrlAuthenticationSuccessHandler에 대한 참조는 응용 프로그램 컨텍스트의 form-login 요소로 전달 될 수 있습니다.

15

꽤 늦은 대답이고 스프링 2 또는 3을 사용하는지 잘 모르겠습니다. 하지만 스프링 3에서는 이렇게 할 수 있습니다.당신이 다른 페이지에 다른 특정 인증 예외를 매핑 할 수 있습니다 물론

<bean id="securityExceptionTranslationHandler" class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler"> 
    <property name="exceptionMappings"> 
     <props> 
      <prop key="org.springframework.security.authentication.CredentialsExpiredException">/change_password_page</prop> 
     </props> 
    </property> 
    <property name="defaultFailureUrl" value="/login_generic_error_page"/> 
</bean> 

:

은 봄 보안 컨텍스트에 다음을 포함합니다.

양식 - 로그인 요소를 사용하는 경우는, 당신은 (사용 된 경우와 authentication-failure-url 제거)

<security:form-login ... authentication-failure-handler-ref="securityExceptionTranslationHandler"> 

authentication-failure-handler-ref 속성을 지정해야합니다 그리고 마지막 단계는 암호 변경 페이지를 만드는 것입니다.

암호 변경 페이지로 리디렉션 될 때 사용자가 인증되지 않는다는 점에 유의하십시오.

+0

매우 비슷한 문제를 해결하고이 경로로 향하고 있습니다 ... 암호 변경 논리를 가장 잘 처리하는 방법에 대한 권장 사항이 있습니까? 모든 정상적인 "로그인"기능 (암호 확인, 오류 코드 반환)을 복제하려고 시도하는 것처럼 보일 수도 있습니다. – bimsapi

+1

JPA 및 모델을 사용하고 있는데이를 통해 직접 업데이트하지 않고 있습니다. 전체 봄 보안주기. 그것은 가장 빠른 길로 보였습니다. 물론 비밀번호를 변경 한 후 사용자를 로그인 페이지로 리디렉션합니다. –

+1

그래, 난 당신의 방법은 빠른했을 것이다 :) 여기에 내가하고 결국 무엇을 생각 - *'UsernamePasswordResetAuthentication'를 새/확인 암호 필드에 사용자 이름, 암호 및 새 암호 * 로그인 페이지가 적절한 경우 * 로그인 (기존의 다른 이유로) 사용자 정의 AuthenticationProvider는 1) 기존 암호로 인증하고, 2) 저장된 암호를 업데이트하고, 3) 새 암호로 다시 인증하기 위해 확장 된 요청을 기반으로 올바른 인증 개체를 만드는 필터 . – bimsapi

관련 문제