0

セキュリティxmlで次の設定を使用してSpring基本認証を使用しています。

<http use-expressions="true" create-session="never" >
        <intercept-url pattern="/**" method="GET" access="isAuthenticated()" />
        <intercept-url pattern="/**" method="POST" access="isAuthenticated()" />
        <intercept-url pattern="/**" method="PUT" access="isAuthenticated()" />
        <intercept-url pattern="/**" method="DELETE" access="isAuthenticated()" />
        <http-basic />
    </http>

認証が失敗した場合、ブラウザはユーザー名とパスワードを借りるためのプロンプトウィンドウをポップアップします。そのプロンプトがまったくポップアップしないようにする方法はありますか?

4

3 に答える 3

1

認証の失敗に使用される可能性が最も高いページも保護されます。手動で失敗ページを次のように保護されていないページに設定してみることができます

 <access-denied-handler error-page="/login.jsp"/> 

一緒に

 <intercept-url pattern="/*login*" access="hasRole('ROLE_ANONYMOUS')"/>

また

<intercept-url pattern='/*login*' filters='none'/>  

auto-config='true'または、それを修正するhttp要素の属性を使用できます 。詳細はこちらをご覧ください

于 2012-04-27T09:55:39.340 に答える
0

ブラウザでログインダイアログをスローするRESTAPIでも同じ問題が発生しました。あなたが言ったように、ブラウザが応答ヘッダーを次のように見るとき

WWW-認証:Basic realm = "Spring Security Application

基本認証ダイアログが表示されます。RESTAPIベースのログインの場合、これは理想的ではありません。これが私がそれをした方法です。カスタム認証エントリポイントを定義し、 最初にヘッダーを「FormBased」として設定します

response.setHeader( "WWW-Authenticate"、 "FormBased");

以下のapplication-context.xml構成

<security:http create-session="never" entry-point-ref="authenticationEntryPoint" authentication-manager-ref="authenticationManager">
    <security:custom-filter ref="customRestFilter" position="BASIC_AUTH_FILTER" />
    <security:intercept-url pattern="/api/**" access="ROLE_USER" />
</security:http>

<bean id="authenticationEntryPoint" class="com.tito.demo.workflow.security.RestAuthenticationEntryPoint">
</bean>

以下のカスタムエントリポイントクラス。

@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

    private static Logger logger = Logger.getLogger(RestAuthenticationEntryPoint.class);

    public void commence( HttpServletRequest request, HttpServletResponse response,
                          AuthenticationException authException ) throws IOException {
        logger.debug("<--- Inside authentication entry point --->");
        // this is very important for a REST based API login. 
        // WWW-Authenticate header should be set as FormBased , else browser will show login dialog with realm
        response.setHeader("WWW-Authenticate", "FormBased");
        response.setStatus( HttpServletResponse.SC_UNAUTHORIZED );
    }


}

注:私はスプリング3.2.5を使用しました。リリース

これで、POSTMANなどのRESTクライアントから残りのAPIがヒットすると、サーバーは401Unauthorizedを返します。

于 2014-09-26T15:42:43.953 に答える
0

私は同じ問題に直面しました、そして私がしたことはRequestMatcher私のリソースサーバーでカスタムを作成することです。これにより、Outh2がを送信できなくなりWWW-Authenticate headerます。

例:

 @Override

    public void configure(HttpSecurity http) throws Exception {
         http.requestMatcher(new OAuthRequestedMatcher())
                .authorizeRequests()
                 .antMatchers(HttpMethod.OPTIONS).permitAll()
                    .anyRequest().authenticated();
    }

    private static class OAuthRequestedMatcher implements RequestMatcher {
        public boolean matches(HttpServletRequest request) {
            String auth = request.getHeader("Authorization");
            boolean haveOauth2Token = (auth != null) && auth.startsWith("Bearer");
            boolean haveAccessToken = request.getParameter("access_token")!=null;
   return haveOauth2Token || haveAccessToken;
        }
    }
于 2017-07-21T21:10:56.807 に答える