Spring security REST не обрабатывает запрос на вход в систему (404) - PullRequest
2 голосов
/ 01 октября 2019

Я пытался следовать этому уроку , и я застрял. Мой запрос к

POST http://localhost:8080/MyWebsite_Membership/api/login 

возвращает 404 каждый раз. В журнале отладки я вижу

WARN org.springframework.web.servlet.PageNotFound - No mapping for POST /MyWebsite_Membership/api/login

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

Конфигурация безопасности

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

    <http auto-config="true" use-expressions="false" entry-point-ref="restAuthenticationEntryPoint" >

        <intercept-url pattern="/api/login*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <intercept-url pattern="/api/**" access="ROLE_USER" />
        <csrf disabled="true" />
        <form-login
                authentication-success-handler-ref="restAuthenticationSuccessHandler"
                authentication-failure-handler-ref="restAuthenticationFailureHandler"
        />
        <logout />
    </http>
    <beans:bean id="restAuthenticationSuccessHandler" class="com.mywebsite.membership.web.RESTAuthenticationSuccessHandler" />
    <beans:bean id="restAuthenticationFailureHandler" class="com.mywebsite.membership.web.RESTAuthenticationFailureHandler" />
    <beans:bean id="restAuthenticationEntryPoint" class="com.mywebsite.membership.web.RESTAuthenticationEntryPoint" />
    <authentication-manager>
        <authentication-provider>
            <user-service>
                <!-- Password is prefixed with {noop} to indicate to DelegatingPasswordEncoder that
                NoOpPasswordEncoder should be used. This is not safe for production, but makes reading
                in samples easier. Normally passwords should be hashed using BCrypt -->
                <user name="jimi" password="{noop}jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />
                <user name="bob" password="{noop}bobspassword" authorities="ROLE_USER" />
            </user-service>
        </authentication-provider>
    </authentication-manager>
</beans:beans>

Ответы [ 3 ]

1 голос
/ 01 октября 2019

В Spring Security будет установлен фильтр обработки аутентификации по умолчанию <form-login> (В XML Config) .formLogin() (В Java Config), чья конфигурация по умолчанию

По умолчанию в конфигурации xml (Вы можете настроить, если хотите)

login-page="/login"
default-target-url="/" <!-- On Successful athentication -->
authentication-failure-url="/login?error"
username-parameter="username" <!-- For custom login page if it has different param name - say email -->
password-parameter="password" <!-- For custom login page custom parameter -->

По умолчанию в конфигурации Java (Вы можете настроить, если хотите)

.loginPage("/login")
.defaultSuccessUrl("/") //On Authentication success
.failureUrl("/login?error") //On Authentication failure
.usernameParameter("username") //Default auth param1
.passwordParameter("password") //Default auth param2

ВВаш код
Поскольку вы не упомянули login-page в своей конфигурации

, он предоставит страницу входа по умолчанию на GET: /login
и URL-адрес обработки аутентификации по умолчанию POST: /login
(параметры должны быть username и password)

Поэтому используйте

POST - http://localhost:8080/MyWebsite_Membership/login

Для аутентификации у вашего почтальона или любого другого клиента. Не будет отображаться 404
Никаких изменений кода не требуется.

В случае OP springSecurityFilterChain настроен для шаблона URL

<url-pattern>/api/**</url-pattern>

Если springSecurityFilterChain (DelegatingFilterProxy) настроен для шаблона URL /api/**, настройки безопасности по умолчанию /login и /logout не будут работать, поэтому вам необходимо настроить указанные ниже URL для прохождения через springSecurityFilterChain.

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/api/**</url-pattern>
    <url-pattern>/login</url-pattern>
    <url-pattern>/logout</url-pattern>
</filter-mapping>

Или вы можете настроить какобъяснил О.П. в своем ответе.

1 голос
/ 01 октября 2019

В конце концов я понял, что этот код не обрабатывается в контексте сервлета, поэтому ни один из путей не предшествует / api /.

  1. Убедитесь в правильности отображения web.xml. Сопоставление фильтров / api / * не перехватит запрос / login.

  2. Добавьте login-processing-url = "/ api / login", чтобы переопределить значение по умолчанию "/ login"

1 голос
/ 01 октября 2019

Вы используете /MyWebsite_Membership/api/login, который не сопоставлен ни с одним ресурсом. Вместо этого используйте /MyWebsite_Membership/login.

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