2

私は春と春のセキュリティに不慣れで、これを機能させることができないようです。SpringセキュリティでWebサービスを保護しています。安全なリクエストに対して、定義したURLに明示的にログインすると、適切な応答(401、200など)が返されます。ただし、ヘッダーで認証を送信するcurlまたはposterを介してデータを提供する実際のURLをテストしようとすると、それを機能させることができません。

これが私のservlet-security.xmlファイルです:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:sec="http://www.springframework.org/schema/security"
xsi:schemaLocation="
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

<http create-session="stateless" entry-point-ref="restAuthenticationEntryPoint">
  <intercept-url pattern="/services/schedule/**" access="ROLE_USER, ROLE_ADMIN"/>

  <custom-filter ref="myFilter" position="FORM_LOGIN_FILTER"/>

  <!-- Adds a logout filter to Spring Security filter chain -->
    <logout logout-url="/api/logout" delete-cookies="true" invalidate-session="true"
        success-handler-ref="restLogoutSuccessHandler"/>
</http>

<beans:bean id="myFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
  <beans:property name="authenticationManager" ref="authenticationManager"/>
  <beans:property name="authenticationSuccessHandler" ref="mySuccessHandler"/>
  <beans:property name="filterProcessesUrl" value="/api/login"/>
    <beans:property name="usernameParameter" value="username"/>
    <beans:property name="passwordParameter" value="password"/>
    <beans:property name="postOnly" value="true"/>
 </beans:bean>

 <!-- Configures a custom authentication success handler that returns HTTP status code 200 -->
 <beans:bean id="mySuccessHandler" class="com.touchvision.pilot.security.RestAuthenticationSuccessHandler"/>

 <!-- Configures a custom authentication failure handler that returns HTTP status code 401 -->
 <beans:bean id="restAuthenticationFailureHandler" class="com.touchvision.pilot.security.RestAuthenticationFailureHandler"/>

  <!-- Configures a custom logout success handler that returns HTTP status code 200 -->
  <beans:bean id="restLogoutSuccessHandler" class="com.touchvision.pilot.security.RestLogoutSuccessHandler"/>

<!-- Declare an authentication-manager to use a custom userDetailsService -->
<authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="customUserDetailsService">
                <password-encoder ref="passwordEncoder"/>
        </authentication-provider>
</authentication-manager>

<!-- Use a Md5 encoder since the user's passwords are stored as Md5 in the database -->
<beans:bean class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" id="passwordEncoder"/>

    <!-- A custom service where Spring will retrieve users and their corresponding access levels  -->
<beans:bean id="customUserDetailsService" class="com.touchvision.pilot.services.CustomUserDetailsService"/>

</beans:beans>

私が言ったように、私はクレジットを/ api/loginに投稿することでうまくログインできます。ただし、実際のデータリクエストを使用してヘッダーで認証を送信しようとすると、「このリクエストにはHTTP認証が必要です」というエラーが表示されます。私が使用しているcurlコマンドは次のとおりです。

curl -u admin@touchvision.com:admin123 "http://local.touchvision.com/services/schedule/list"

助けてくれてありがとう。

4

2 に答える 2

4

HTTP POSTリクエストで渡されたフォームパラメータを処理するように設定されたフォームログインフィルタ()のみがありますが、リクエストのヘッダーUsernamePasswordAuthenticationFilterを処理するサーバー側には何もありません。

BasicAuthenticationFilterヘッダーで渡された情報に基づいてリクエストを認証するを構成してみてください。

于 2013-02-21T15:36:41.300 に答える
0

ユーザーIDの@記号の代わりに%40を使用してみましたか。また、CURLのバージョンによっては、-uパラメーター全体を引用符で囲むことをお勧めします。

于 2013-02-21T15:27:05.970 に答える