1

Spring MVC + Securityの使用SEC(セキュリティチーム)のユーザーがアプリケーションに完全にアクセスでき、FRAUD(不正防止チーム)がURLに「ブロック」または「」という単語が含まれていないページにのみアクセスできるというビジネス要件があります。大文字と小文字を区別せずに"を更新します。

以下に、 spring-security.xmlで使用される正規表現のテスト(私は正規表現のスペシャリストではありません。改善を歓迎します=]):

import java.util.Arrays;
import java.util.List;

public class RegexTest {

    public static void main(String[] args) {

        List<String> pathSamples = Arrays.asList(
                "/index",
                "/index.*",
                "/index/",
                "/cellphone/block",
                "/cellphone/block.*",
                "/cellphone/block/",
                "/cellphone/confirmBlock",
                "/cellphone/confirmBlock.*",
                "/cellphone/confirmBlock/",
                "/user/update",
                "/user/update.*",
                "/user/update/",
                "/user/index",
                "/user/index.*",
                "/user/index/",
                "/search",
                "/search.*",
                "/search/",
                "/doSearch",
                "/doSearch.*",
                "/doSearch/");

        for (String pathSample : pathSamples) {
            System.out.println("Path sample: " + pathSample
                    + " - SEC: " + pathSample.matches("^.*$")
                    + " | FRAUD: " + pathSample.matches("^(?!.*(?i)(block|update)).*$"));
        }
    }
}

以下、上記のJavaクラスのコンソール結果:

Path sample: /index - SEC: true | FRAUD: true
Path sample: /index.* - SEC: true | FRAUD: true
Path sample: /index/ - SEC: true | FRAUD: true
Path sample: /cellphone/block - SEC: true | FRAUD: false
Path sample: /cellphone/block.* - SEC: true | FRAUD: false
Path sample: /cellphone/block/ - SEC: true | FRAUD: false
Path sample: /cellphone/confirmBlock - SEC: true | FRAUD: false
Path sample: /cellphone/confirmBlock.* - SEC: true | FRAUD: false
Path sample: /cellphone/confirmBlock/ - SEC: true | FRAUD: false
Path sample: /user/update - SEC: true | FRAUD: false
Path sample: /user/update.* - SEC: true | FRAUD: false
Path sample: /user/update/ - SEC: true | FRAUD: false
Path sample: /user/index - SEC: true | FRAUD: true
Path sample: /user/index.* - SEC: true | FRAUD: true
Path sample: /user/index/ - SEC: true | FRAUD: true
Path sample: /search - SEC: true | FRAUD: true
Path sample: /search.* - SEC: true | FRAUD: true
Path sample: /search/ - SEC: true | FRAUD: true
Path sample: /doSearch - SEC: true | FRAUD: true
Path sample: /doSearch.* - SEC: true | FRAUD: true
Path sample: /doSearch/ - SEC: true | FRAUD: true

テスト

シナリオ1

ベロー、spring-security.xmlの重要な部分:

<security:http entry-point-ref="entryPoint" request-matcher="regex">

    <security:intercept-url pattern="^.*$" access="ROLE_SEC" />
    <security:intercept-url pattern="^(?!.*(?i)(block|update)).*$" access="ROLE_FRAUD" />

    <security:access-denied-handler error-page="/access-denied.html" />

    <security:form-login always-use-default-target="false"
        login-processing-url="/doLogin.html"
        authentication-failure-handler-ref="authFailHandler"
        authentication-success-handler-ref="authSuccessHandler" />
    <security:logout logout-url="/logout.html"
        success-handler-ref="logoutSuccessHandler" />
</security:http>

行動:

  • 詐欺グループは**どのページにもアクセスできません"
  • SECグループは正常に機能します

シナリオ2

以下のspring-security.xmlのintercept-urlの順序のみを変更したことに注意してください。

<security:http entry-point-ref="entryPoint" request-matcher="regex">

    <security:intercept-url pattern="^(?!.*(?i)(block|update)).*$" access="ROLE_FRAUD" />
    <security:intercept-url pattern="^.*$" access="ROLE_SEC" />

    <security:access-denied-handler error-page="/access-denied.html" />

    <security:form-login always-use-default-target="false"
        login-processing-url="/doLogin.html"
        authentication-failure-handler-ref="authFailHandler"
        authentication-success-handler-ref="authSuccessHandler" />
    <security:logout logout-url="/logout.html"
        success-handler-ref="logoutSuccessHandler" />
</security:http>

行動:

  • SECグループは**どのページにもアクセスできません"
  • 詐欺グループは正常に機能します

結論

私は何か間違ったことをしたか、春のセキュリティにバグがあります。

問題はすでに非常に悪い方法で解決されましたが、私はそれを迅速に修正する必要があります。フレームワークコードを開かずにデバッグを改善するための秘訣を知っている人はいますか?

乾杯、

フェリペ

4

1 に答える 1

3

ユニバーサルマッチャーが最初であるため、最初の構成は間違っています。2番目の構成は無視されます。2番目の構成では、最初に一致するものからSECの役割が除外されるため、次のようなものが必要なようです。

<intercept-url pattern="^(?!.*(?i)(block|update)).*$" access="ROLE_FRAUD,ROLE_SEC" />
<intercept-url pattern="^.*$" access="ROLE_SEC" />

これは、両方のパターンでSEC属性を持っています。

それでも必要なものでない場合は、関連するデバッグログを投稿して、Spring Securityが特定のリクエストの属性を選択していることを示し(これは詳細にログに記録されます)、期待するものとどのように異なるかを説明してください。

于 2012-11-22T21:32:49.827 に答える