12

私は春の mvc と春のセキュリティ ベースの web ベースのアプリケーションを構築しています。

パスワードのリセット機能を実装しました。システム管理者は任意のユーザーのパスワードをリセットします。ランダムに生成されたパスワードはユーザーに電子メールで送信され、データベースで更新されます。

ランダムに生成されたパスワードでユーザーがログインするたびに、ユーザーにパスワードの変更を強制したい。

私のユーザーTABLEを見てください。

userid bigint(20)
username varchar(20)
password varchar(65)
email varchar(50)
firstname varchar(20)
lastname varchar(20)
groupname varchar(50)
enabled tinyint(1)
credentialsNonExpired tinyint(1)

私の認証プロバイダー

    <!--
        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>

JDBCDaoImplをjdbcUserServiceとして拡張するJDBCUserDetailsS​​erviceを使用しました。

パスワードをリセットするときに、 credentialNonExpiredをユーザー テーブルの false 列に設定したいと考えています。

私にはそれができます。

しかし、ログインすると、春のセキュリティ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フィールドが必要です。

上記の方法をロードすることでそれを達成していますが、期限切れのパスワードでログインしたときにユーザーをパスワード変更ページにリダイレクトする他の方法はありますか。

どうすればそれができるか教えてください。

4

2 に答える 2

15

かなり遅い答えで、Spring 2と3のどちらを使用しているかはわかりませんが、Spring3ではこの方法で使用できます。

Springのセキュリティコンテキストに次のものを含めます。

<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>

もちろん、他の特定の認証例外を他のページにマップすることもできます。

form-login要素を使用している場合は、authentication-failure-handler-ref属性を指定する必要があります(使用されている場合は削除しますauthentication-failure-url) 。

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

そして最後のステップは、パスワードの変更ページを作成することです。

パスワードの変更ページにリダイレクトされた場合、ユーザーは認証されないことに注意してください。

于 2013-01-17T16:06:49.793 に答える
1

サブクラス化を試しSimpleUrlAuthenticationSuccessHandlerて、パスワードの有効期限をチェックするためのカスタム ロジックを実装できます。これへの参照SimpleUrlAuthenticationSuccessHandlerは、アプリケーション コンテキストの form-login 要素に渡すことができます。

于 2012-01-12T12:15:07.480 に答える