web-dev-qa-db-ja.com

複数のログインページによるSpringセキュリティ

Springセキュリティを使用して、ユーザー名とパスワードを使用してアプリケーション管理セクションへのログインを保護しています。しかし今、私のクライアントは、アプリケーションクライアントセクション用に別のログイン画面を持っている必要があります。そこでは、クライアントセクションにログインするための独自のユーザー名/パスワードがあります。これまでのところ、次のspring-security.xml設定を使用して、adminセクションのログインを正常に実装しています。

<security:http auto-config="true" use-expressions="true">
    <security:form-login login-page="/login"
        default-target-url="/admin/dashboard" always-use-default-target="true"
        authentication-failure-url="/login/admin?error_msg=wrong username or password" />
    <security:intercept-url pattern="/admin/*" access="hasRole('ROLE_ADMIN')" />        
    <security:logout logout-success-url="/login"/>
</security:http>

<security:authentication-manager>
    <security:authentication-provider
        user-service-ref="adminServiceImpl">
    </security:authentication-provider>
</security:authentication-manager>

クライアントセクションのログイン画面、intercept-url(s)、セキュリティ認証プロバイダーを追加する方法を見つけるためにWebを何度も検索しましたが、情報が見つかりませんでした。誰かがリンクを教えてくれませんか。チュートリアル/例、その方法のガイド?

ありがとう

13
MChan

Spring Security docs によると:

Spring Security 3.1から、複数のhttp要素を使用して、さまざまな要求パターンに対して個別のセキュリティフィルターチェーン構成を定義できるようになりました。パターン属性がhttp要素から省略されている場合、すべてのリクエストに一致します。

各要素は、内部FilterChainProxy内にフィルターチェーンを作成し、それにマップする必要があるURLパターンを作成します。要素は宣言された順序で追加されるため、最も具体的なパターンを最初に再度宣言する必要があります。

したがって、基本的に2つ必要です <http> それぞれ異なるpattern属性を持つ要素。

ここに詳細なチュートリアルがあります: https://blog.codecentric.de/en/2012/07/spring-security-two-security-realms-in-one-application/

5
Marcel Stör

security:httpを1つだけ使用しますが、UsernamePasswordLoginFilterを2つ登録します。

このソリューションは、2つのログインページが同じセキュリティレルムにログインする場合に適しています。 (したがって、ユーザーがどのログインページにログインするかは問題ではありません)。もちろん、ロールを使用して、アプリケーションのさまざまな部分へのアクセスをさまざまなタイプのユーザーに制限することもできます。

2つのsecurity:httpセクションを処理する必要がないため、このソリューションは非常に簡単です。

これの主な欠点は、ログインが必要なページにアクセスしようとした場合に、ログインしていないユーザーが2つのログインページのどちらをリダイレクトするかを決定する必要があることです。

3
Ralph

複数のログインフォームを使用したSpringMVCアプリのサンプルプロジェクト。

通常/メンバー/管理者の3種類のページ。メンバーページにアクセスしようとすると、メンバーログインフォームが表示されます。管理ページにアクセスしようとすると、管理者ログインフォームに移動します。

https://github.com/eric-mckinley/springmultihttploginforms

Seucrityxml構成ファイルのantregexリクエストマッチャーを使用して実行します。

<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
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/security
                http://www.springframework.org/schema/security/spring-security.xsd">

<global-method-security secured-annotations="enabled" />

<http name="member" pattern="/member/*" request-matcher="ant"   auto-config="true" use-expressions="false">
    <csrf disabled="true"/>

    <intercept-url pattern="/member/home" access="ROLE_MEMBER" />
    <intercept-url pattern="/member/account" access="ROLE_MEMBER" />
    <intercept-url pattern="/member/orders" access="ROLE_MEMBER" />

    <form-login login-page="/member-login" always-use-default-target="false"/>
    <logout logout-url="/logout" logout-success-url="/home"/>
</http>

<http name="admin" request-matcher="regex"   auto-config="true" use-expressions="false">
    <csrf disabled="true"/>

    <intercept-url pattern="/admin/home" access="ROLE_ADMIN" />
    <intercept-url pattern="/admin/users" access="ROLE_ADMIN" />

    <form-login login-page="/admin-login" always-use-default-target="false"/>
    <logout logout-url="/logout" logout-success-url="/home"/>
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="admin" password="password" authorities="ROLE_ADMIN" />
            <user name="member" password="password" authorities="ROLE_MEMBER" />
            <user name="super" password="password" authorities="ROLE_ADMIN,ROLE_MEMBER" />
        </user-service>
    </authentication-provider>
</authentication-manager>
2
stackguest2711

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/securityhttp:// www .springframework.org/schema/security/spring-security-4.0.xsd ">

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/" access="permitAll" />
    <intercept-url pattern="/login" access="permitAll" />
    <!-- <intercept-url pattern="/welcome/**" access="permitAll" /> <intercept-url 
        pattern="/admin*" access="hasRole('ROLE_ADMIN')" /> -->
    <intercept-url access="hasRole('ROLE_USER')" pattern="/main*" />
    <intercept-url pattern="/main*" access="hasRole('ROLE_USER')" />

    <form-login login-page="/login" default-target-url="/login-success"
        authentication-failure-url="/loginError" />
    <!-- <session-management invalid-session-url="/login" session-fixation-protection="newSession"> 
        <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /> 
        </session-management> -->
    <logout logout-success-url="/login" delete-cookies="JSESSIONID" />
    <csrf disabled="true" />
    <headers>
        <frame-options policy="SAMEORIGIN" />
    </headers>
</http>

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/mobile/" access="permitAll" />
    <intercept-url pattern="/mobile/login" access="permitAll" />
    <!-- <intercept-url pattern="/welcome/**" access="permitAll" /> <intercept-url 
        pattern="/admin*" access="hasRole('ROLE_ADMIN')" /> -->
    <intercept-url access="hasRole('ROLE_USER')" pattern="/main*" />
    <intercept-url pattern="/main*" access="hasRole('ROLE_USER')" />
    <form-login login-page="/mobile/login" default-target-url="/mobile/login-success"
        always-use-default-target="true" authentication-failure-url="/mobile/login?error"
        username-parameter="username" password-parameter="password" />
    <logout delete-cookies="JSESSIONID" logout-success-url="/mobile/login" />
    <csrf disabled="true" />
    <headers>
        <frame-options policy="SAMEORIGIN" />
    </headers>

ここでは、すべてのユーザーに共通の2つのログインフォームが必要です。上記のようにspring-security.xmlでタグ要素を構成しましたが、機能していません。解決策を提案してください

0
Mohan Raj