Невозможно поразить пользовательский AuthenticationProvider с помощью Spring security 5.1.1 - PullRequest
0 голосов
/ 17 ноября 2018

Я использую Spring security 5.1.1. Я пытаюсь создать две точки входа безопасности для своего приложения: одно для REST и другое для защищенных URL-адресов приложения. Я создал CustomAuthenticationProvider, реализовав AuthenticationProvider для аутентификацииManager. Я следую за примерами в: Spring Security для REST API и Spring Security - две области безопасности в одном приложении

Но на странице входа в систему, когда я ввожу имя пользователя и пароль, он вообще не затрагивает метод CustomAuthenticationProvider.authenticate(), а идет в logout.html. Ниже мой xml фрагмент http:

<!-- Configuration for API -->

<security:http entry-point-ref="restAuthEntryPoint" pattern="/api/**"  use-expressions="true">

    <intercept-url pattern="/api/**"  access="hasAnyRole('ROLE_DRIVER','ROLE_PARENT') and isAuthenticated()"/>
    <intercept-url pattern="/api/driver/**"  access="hasRole('ROLE_DRIVER') and isAuthenticated()"/>
    <intercept-url pattern="/api/parent/**"  access="hasRole('ROLE_PARENT') and isAuthenticated()"/>

    <form-login
      authentication-success-handler-ref="apiSuccessHandler"
      authentication-failure-handler-ref="apiFailureHandler" />

    <custom-filter ref="apiAuthenticationFilter" after="BASIC_AUTH_FILTER" />
    <logout />
</security:http>

<beans:bean id="apiAuthenticationFilter" class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter">
    <beans:constructor-arg name="authenticationEntryPoint" ref="restAuthEntryPoint"/>
    <beans:constructor-arg name="authenticationManager" ref="authenticationManager"/>
</beans:bean>

<beans:bean id="restAuthEntryPoint" 
    class="com.main.sts.api.security.RestAuthenticationEntryPoint"/>

<beans:bean id="apiSuccessHandler"
  class="com.main.sts.api.security.MySavedRequestAwareAuthenticationSuccessHandler"/>

<beans:bean id="apiFailureHandler" class=
  "org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"/>

<!-- Configuration for Rest-API finished-->

<security:http auto-config="true" use-expressions="true" authentication-manager-ref="authenticationManager">
    <intercept-url pattern="/school_admin/*"
        access="hasAnyRole('ROLE_SCHOOLADMIN','ROLE_GUEST','ROLE_SCHOOLTEACHER','ROLE_PARENT')" />

    <form-login login-page="/login" authentication-failure-url="/loginfailed"/>

    <!-- <custom-filter before="FORM_LOGIN_FILTER" ref="userAuthenticationProcessingFilter" /> -->

    <logout invalidate-session="true" logout-success-url="/logout" />
    <access-denied-handler error-page="/404" />

    <session-management invalid-session-url="/logout.html">

    </session-management>
    <sec:headers >
        <sec:cache-control />
        <sec:hsts/>
    </sec:headers>
</security:http>

    <authentication-manager alias="authenticationManager">
    <authentication-provider ref="customAuthenticationProvider" />
</authentication-manager> 

<beans:bean id="customAuthenticationProvider" class="com.main.sts.util.CustomAuthenticationProvider">
    <beans:property name="loginService" ref="loginService" />
</beans:bean>

Даже если я закомментировал конфигурацию для REST-API, все равно я не попаду в этот класс.

Вот мой CustomAuthenticationProvider:

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {


@Override
public Authentication authenticate(Authentication authentication) {

    // **I never hit this class**
}
@Override
public boolean supports(Class<?> authentication) {
    return authentication.equals(UsernamePasswordAuthenticationToken.class);
}

фильтр определен правильно в web.xml:

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

springSecurityFilterChain / *

В логине jsp я установил форму, как показано ниже:

        <form class="form-vertical login-form" name='f' action="<c:url value='j_spring_security_check' />" method="post">

Я не могу получить доступ к защищенным URL-адресам, я перехожу на страницу входа; это значит - этот фильтр работает. Но почему я не могу нажать CustomAuthenticationProvider? Почему он идет в logout.html ???

Я также пытался реализовать собственный фильтр (который в конечном итоге устанавливает в качестве свойства authenticationManager); но все равно не повезло.

Я также проверил файлы журналов, но там ничего нет.

Кстати, если я пытаюсь получить доступ через curl, я получаю Http status 403 (forbidden). The server understood the request but refuses to authorize it.

curl -i -X POST -d username=admin -d password=Admin123 http://localhost:8080/sts/api/login

Пожалуйста, помогите мне выяснить проблему.

1 Ответ

0 голосов
/ 18 ноября 2018

Альхамдулилла, наконец-то я нашел проблему. База кода, с которой я изначально начал, была реализована в Spring 2.5. Я обновил версию Spring до 5.1. В основном / j_spring_security_check, j_username и j_password устарели. Теперь я изменил свой jsp соответственно, и теперь он работает.

Странно, что не было сообщений об ошибках или предупреждений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...