第148章 Shiro セキュリティー


Shiro セキュリティーコンポーネント

Camel 2.5 で利用可能
Camel の shiro-security コンポーネントは、Apache Shiro セキュリティープロジェクトをベースとしたセキュリティーに焦点を当てたコンポーネントです。
Apache Shiro は、認証、承認、エンタープライズセッション管理、および暗号化を適切に処理する強力かつ柔軟なオープンソースセキュリティーフレームワークです。Apache Shiro プロジェクトの目的は、利用可能な最も堅牢で包括的なアプリケーションセキュリティーフレームワークを提供しながら、非常に簡単に理解でき、非常に簡単です。
この camel の shiro-security コンポーネントにより、認証および承認サポートを Camel ルートの異なるセグメントに適用できます。
Shiro セキュリティーは、Camel ポリシーを使用してルートに適用されます。Camel の Policy は、Camel プロセッサーにインターセプターを適用するストラテジーパターンを使用します。camel ルートのセクション/セグメントに、セキュリティー、トランザクションなどの相互の懸念(セキュリティー、トランザクションなど)を適用する機能を提供します。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-shiro</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
Copy to Clipboard Toggle word wrap

Shiro セキュリティーの基本

camel ルートで Shiro セキュリティーを使用するには、セキュリティー設定の詳細(ユーザー、パスワード、ロールなど)を使用して ShiroSecurityPolicy オブジェクトをインスタンス化する必要があります。その後、このオブジェクトは Camel ルートに適用する必要があります。この ShiroSecurityPolicy オブジェクトは、Camel レジストリー(JNDI または ApplicationContextRegistry)に登録してから、Camel Context の他のルートでも使用することができます。
設定の詳細は、Ini ファイル(プロパティーファイル)または Ini オブジェクトを使用して ShiroSecurityPolicy に提供されます。Ini ファイルは、以下のようにユーザー/ロールの詳細を含む標準の Shiro 設定ファイルです。
[users]
# user 'ringo' with password 'starr' and the 'sec-level1' role
ringo = starr, sec-level1
george = harrison, sec-level2
john = lennon, sec-level3
paul = mccartney, sec-level3

[roles]
# 'sec-level3' role has all permissions, indicated by the 
# wildcard '*'
sec-level3 = *

# The 'sec-level2' role can do anything with access of permission 
# readonly (*) to help
sec-level2 = zone1:*

# The 'sec-level1' role can do anything with access of permission 
# readonly   
sec-level1 = zone1:readonly:*
Copy to Clipboard Toggle word wrap

ShiroSecurityPolicy オブジェクトのインスタンス化

ShiroSecurityPolicy オブジェクトは以下のようにインスタンス化されます。
        private final String iniResourcePath = "classpath:shiro.ini";
        private final byte[] passPhrase = {
            (byte) 0x08, (byte) 0x09, (byte) 0x0A, (byte) 0x0B,
            (byte) 0x0C, (byte) 0x0D, (byte) 0x0E, (byte) 0x0F,
            (byte) 0x10, (byte) 0x11, (byte) 0x12, (byte) 0x13,
            (byte) 0x14, (byte) 0x15, (byte) 0x16, (byte) 0x17};
        List<permission> permissionsList = new ArrayList<permission>();
        Permission permission = new WildcardPermission("zone1:readwrite:*");
        permissionsList.add(permission);

        final ShiroSecurityPolicy securityPolicy = 
            new ShiroSecurityPolicy(iniResourcePath, passPhrase, true, permissionsList);
Copy to Clipboard Toggle word wrap

ShiroSecurityPolicy Options

Expand
名前 デフォルト値 説明
iniResourcePath または ini none リソース文字列または Ini オブジェクト iniResourcePath または Ini オブジェクトのインスタンスの必須の Resource String をセキュリティーポリシーに渡す必要があります。"file:, classpath:, url:" で始まる場合は、ファイルシステム、クラスパス、または URL からそれぞれリソースを取得できます。例:"classpath:shiro.ini"
passPhrase AES 128 ベースのキー byte[] メッセージエクスチェンジとともに送信される ShiroSecurityToken (s)を復号化する passPhrase
alwaysReauthenticate true boolean を設定して、個々のリクエストで再認証できるようにします。false に設定すると、ユーザーは認証され、今後実行する同じユーザーからの要求のみではなく認証およびロックされます。
permissionsList none List<Permission> 認証されたユーザーが追加のアクションを実行できるようにするために必要なパーミッションのリスト。つまり、ルートでさらに続行されます。ShiroSecurityPolicy オブジェクトに Permissions リストが提供されていない場合、承認は不要であると判断されます。
cipherService AES org.apache.shiro.crypto.CipherService Shiro には AES および Blowfish ベースの CipherServices が同梱されています。これらは 1 つ使用することも、独自の暗号実装で渡すこともできます。
base64 false boolean Camel 2.12: セキュリティートークンヘッダーに base64 エンコーディングを使用します。これにより、JMS でのヘッダーの転送が可能になります。このオプションは ShiroSecurityTokenInjector でも設定する必要があります。

Camel ルートでの Shiro 認証の適用

ShiroSecurityPolicy は、メッセージヘッダーに暗号化された SecurityToken を含む受信メッセージエクスチェンジをテストおよび許可し、さらに適切な認証を続行します。SecurityToken オブジェクトには、ユーザーが有効なユーザーである場所を決定するために使用される Username/Password の詳細が含まれます。
    protected RouteBuilder createRouteBuilder() throws Exception {
        final ShiroSecurityPolicy securityPolicy = 
            new ShiroSecurityPolicy("classpath:shiro.ini", passPhrase);
        
        return new RouteBuilder() {
            public void configure() {
                onException(UnknownAccountException.class).
                    to("mock:authenticationException");
                onException(IncorrectCredentialsException.class).
                    to("mock:authenticationException");
                onException(LockedAccountException.class).
                    to("mock:authenticationException");
                onException(AuthenticationException.class).
                    to("mock:authenticationException");
                
                from("direct:secureEndpoint").
                    to("log:incoming payload").
                    policy(securityPolicy).
                    to("mock:success");
            }
        };
    }
Copy to Clipboard Toggle word wrap

Camel ルートでの Shiro 承認の適用

パーミッションリストを ShiroSecurityPolicy に関連付けることで、承認を Camel ルートに適用できます。Permissions List は、ユーザーがルートセグメントの実行に進むために必要なパーミッションを指定します。ユーザーに適切なパーミッションが設定されていない場合、リクエストはこれ以上続行できません。
    protected RouteBuilder createRouteBuilder() throws Exception {
        final ShiroSecurityPolicy securityPolicy = 
            new ShiroSecurityPolicy("./src/test/resources/securityconfig.ini", passPhrase);
        
        return new RouteBuilder() {
            public void configure() {
                onException(UnknownAccountException.class).
                    to("mock:authenticationException");
                onException(IncorrectCredentialsException.class).
                    to("mock:authenticationException");
                onException(LockedAccountException.class).
                    to("mock:authenticationException");
                onException(AuthenticationException.class).
                    to("mock:authenticationException");
                
                from("direct:secureEndpoint").
                    to("log:incoming payload").
                    policy(securityPolicy).
                    to("mock:success");
            }
        };
    }
Copy to Clipboard Toggle word wrap

ShiroSecurityToken を作成し、メッセージエクスチェンジに注入する

ShiroSecurityToken オブジェクトは、ShiroSecurityTokenInjector と呼ばれる Shiro Processor を使用してメッセージエクスチェンジを作成し、挿入することができます。クライアントで ShiroSecurityTokenInjector を使用して ShiroSecurityToken を注入する例を以下に示します。
    ShiroSecurityToken shiroSecurityToken = new ShiroSecurityToken("ringo", "starr");
    ShiroSecurityTokenInjector shiroSecurityTokenInjector = 
        new ShiroSecurityTokenInjector(shiroSecurityToken, passPhrase);

    from("direct:client").
        process(shiroSecurityTokenInjector).
        to("direct:secureEndpoint");
Copy to Clipboard Toggle word wrap

ShiroSecurityPolicy でセキュリティーが保護されたルートへのメッセージ送信

セキュリティーポリシーが適用される Camel ルートとともに送信されるメッセージおよびメッセージエクスチェンジは、Exchange ヘッダーの SecurityToken によって付随する必要があります。SecurityToken は、Username と Password を保持する暗号化されたオブジェクトです。SecurityToken はデフォルトで AES 128 ビットセキュリティーを使用して暗号化され、任意の暗号に変更できます。
以下は、Camel の ProducerTemplate と SecurityToken を使用してリクエストを送信する方法の例になります。
     @Test
    public void testSuccessfulShiroAuthenticationWithNoAuthorization() throws Exception {        
        //Incorrect password
        ShiroSecurityToken shiroSecurityToken = new ShiroSecurityToken("ringo", "stirr");

        // TestShiroSecurityTokenInjector extends ShiroSecurityTokenInjector
        TestShiroSecurityTokenInjector shiroSecurityTokenInjector = 
            new TestShiroSecurityTokenInjector(shiroSecurityToken, passPhrase);
        
        successEndpoint.expectedMessageCount(1);
        failureEndpoint.expectedMessageCount(0);
        
        template.send("direct:secureEndpoint", shiroSecurityTokenInjector);
        
        successEndpoint.assertIsSatisfied();
        failureEndpoint.assertIsSatisfied();
    }
Copy to Clipboard Toggle word wrap
Camel 2.12 以降では、サブジェクトを 2 つの方法で提供できるため、さらに簡単になりました。

ShiroSecurityToken の使用

ユーザー名とパスワードが含まれる org.apache.camel.component.shiro.security.Shiro.security.ShiroSecurityToken タイプのキー ShiroSecurityConstants. SHIRO_SECURITY_TOKEN のヘッダーを持つ Camel ルートにメッセージを送信することができます。以下に例を示します。
        ShiroSecurityToken shiroSecurityToken = new ShiroSecurityToken("ringo", "starr");

        template.sendBodyAndHeader("direct:secureEndpoint", "Beatle Mania", ShiroSecurityConstants.SHIRO_SECURITY_TOKEN, shiroSecurityToken);
Copy to Clipboard Toggle word wrap
また、以下のように、2 つの異なるヘッダーでユーザー名とパスワードを指定することもできます。
        Map<String, Object> headers = new HashMap<String, Object>();
        headers.put(ShiroSecurityConstants.SHIRO_SECURITY_USERNAME, "ringo");
        headers.put(ShiroSecurityConstants.SHIRO_SECURITY_PASSWORD, "starr");
        template.sendBodyAndHeaders("direct:secureEndpoint", "Beatle Mania", headers);
Copy to Clipboard Toggle word wrap
ユーザー名とパスワードヘッダーを使用すると、Camel ルートの ShiroSecurityPolicy がキー ShiroSecurityConstants.SHIRO_SECURITY_TOKEN を持つ単一のヘッダーに自動的に変換されます。次に、トークンは base64 表現の ShiroSecurityToken インスタンスです(後者は base64=true を設定する場合です)。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat