Как справиться с ошибкой учетных данных перед возвратом в пользовательский интерфейс в Spring Security с помощью OAuth? - PullRequest
0 голосов
/ 03 апреля 2019

В моем приложении мы используем OAuth для мобильного приложения с паролем grant_type Ниже приведен мой XML-конфиг для OAuth

<security:http pattern="/rest/mobile/**" create-session="never"
    access-decision-manager-ref="accessDecisionManager" entry-point-ref="oauthAuthenticationEntryPoint"
    use-expressions="true" auto-config="true">
    <security:anonymous enabled="false" />
    <security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
    <security:custom-filter ref="corsFilter" position="CORS_FILTER"/>
    <security:intercept-url pattern="/rest/mobile/**" access="isAuthenticated()" /> 
    <security:access-denied-handler ref="oauthAccessDeniedHandler" />
    <security:expression-handler ref="oauthWebExpressionHandler" />
    <security:csrf disabled="true" />
</security:http>

<bean id="corsFilter" class="com.testapp.dev.auth.CorsFilter"/>

<!-- OAuth2 Authentication Entry Point -->
<bean id="oauthAuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
    <property name="realmName" value="conference" />
</bean>
<bean id="oauthAccessDeniedHandler"
    class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased">
    <constructor-arg>
        <list>
            <bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" />
            <bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
            <bean
                class="org.springframework.security.web.access.expression.WebExpressionVoter">
                <property name="expressionHandler" ref="oauthWebExpressionHandler" />
            </bean>
        </list>
    </constructor-arg>
</bean>

<oauth:web-expression-handler id="oauthWebExpressionHandler" />
<!-- OAuth2 Token Generation Services -->
<security:http pattern="/oauth/token" create-session="stateless"
    authentication-manager-ref="clientAuthenticationManager">
    <security:anonymous enabled="false" />
    <security:http-basic entry-point-ref="clientAuthenticationEntryPoint" />
    <security:access-denied-handler ref="oauthAccessDeniedHandler" />
    <security:csrf disabled="true" />
</security:http>

<bean id="tokenServices" class="org.springframework.security.oauth2.provider.token.DefaultTokenServices">
    <property name="tokenStore" ref="tokenStore" />
    <property name="supportRefreshToken" value="true" />
    <property name="clientDetailsService" ref="clientDetails" />
</bean>
<bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.store.JdbcTokenStore">
    <constructor-arg ref="jdbcTemplateDataSource" />
    <property name="authenticationKeyGenerator">
    <bean class="com.testapp.dev.auth.UniqueAuthenticationKeyGenerator" />
</property>
</bean>

<bean id="approvalStore" class="org.springframework.security.oauth2.provider.approval.TokenApprovalStore">
    <property name="tokenStore" ref="tokenStore" />
</bean>
<bean id="userApprovalHandler"
    class="org.springframework.security.oauth2.provider.approval.ApprovalStoreUserApprovalHandler">
    <property name="approvalStore" ref="approvalStore" />
    <property name="clientDetailsService" ref="clientDetails" />
    <property name="requestFactory">
        <bean
            class="org.springframework.security.oauth2.provider.request.DefaultOAuth2RequestFactory">
            <constructor-arg index="0" ref="clientDetails" />
        </bean>
    </property>
</bean>

<!-- OAuth2 Authorization Server -->
<oauth:authorization-server
    client-details-service-ref="clientDetails" token-services-ref="tokenServices"
    user-approval-handler-ref="userApprovalHandler">
    <oauth:authorization-code authorization-code-services-ref="JdbcAuthorizationCodeServices" />
    <oauth:implicit />
    <oauth:refresh-token />
    <oauth:client-credentials />
    <oauth:password />
</oauth:authorization-server>    

<!-- OAuth2 Protected Resources Server -->
<oauth:resource-server id="resourceServerFilter" resource-id="conference" token-services-ref="tokenServices" />

<bean id="clientAuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
    <property name="realmName" value="conference/client" />
    <property name="typeName" value="Basic" />
</bean>
<bean id="clientDetailsUserService" class="org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService">
    <constructor-arg ref="clientDetails" />
</bean>   

 <!-- OAuth2 Client's Authentication Manager -->
<security:authentication-manager id="clientAuthenticationManager">
    <security:authentication-provider user-service-ref="clientDetailsUserService" />
</security:authentication-manager>

<bean id= "clientDetails" class="org.springframework.security.oauth2.provider.client.JdbcClientDetailsService">
    <beans:constructor-arg ref="jdbcTemplateDataSource"/> 
</bean>

<bean id="JdbcAuthorizationCodeServices" class="org.springframework.security.oauth2.provider.code.JdbcAuthorizationCodeServices">
    <constructor-arg ref="jdbcTemplateDataSource" />
</bean>

Я хочу добавить логику при сбое входа в систему, т. Е. Когда учетные данные пользователя неверны для пароля типа предоставления, я хочу добавить логику для обработки попытки входа в систему и после определенной попытки сказать 3, что реагировать на пользовательский интерфейс, чтобы принять пользователя к экран забытого пароля.

Я не уверен, как я могу это сделать, любая пользовательская реализация некоторого определенного класса OAuth, чтобы я мог получить дескриптор, когда имя пользователя / пароль неверны, и чем я могу добавить свою логику.

Любая помощь приветствуется !!!

...