第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>
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:*
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);
ShiroSecurityPolicy Options リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | デフォルト値 | 型 | 説明 |
|---|---|---|---|
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");
}
};
}
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");
}
};
}
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");
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();
}
ShiroSecurityPolicy によってセキュリティーが保護されたルートへのメッセージ送信(Camel 2.12 以降により簡単) リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
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);
また、以下のように、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);
ユーザー名とパスワードヘッダーを使用すると、Camel ルートの ShiroSecurityPolicy がキー ShiroSecurityConstants.SHIRO_SECURITY_TOKEN を持つ単一のヘッダーに自動的に変換されます。次に、トークンは base64 表現の
ShiroSecurityToken インスタンスです(後者は base64=true を設定する場合です)。