crocos/CrocosSecurityBundle — pull request #8 by okapon (2014-04-28 03:56:08+00:00)
Title: Add feature to force HTTPS scheme

## 概要

* httpsでの通信を強制させる機能を追加
* configこの機能をOFFにするオプションも提供

## なぜこの変更をするか

* アプリケーション側でhttps通信を強制させたいケースが生じたため。

## 使い方

例）
コントローラーのAction全てに適用する場合

Annotation
```php
/**
* @SecureConfig(httpsRequired=true)
*/
class SomeController
```

フレームワークの設定で機能をOFFにすることも可能（httpsを利用できない環境ない開発環境などを考慮）
app/config/config.yml
```yml
crocos_security:
https_requiring: false
```

## 影響範囲

* 特になし(BCなし、@SecureConfig に httpsRequired=trueを指定しない限りは以前の動作に影響なし)

## テスト結果とテスト項目

### configの`https_requiring=true`の状態
* [x] SecureConfigのhttpsRequired=true となってる場合、httpでアクセスするとhttpsにリダイレクトされること
* [x] 親クラスでSecureConfigの`httpsRequired=true`となってるが、継承先のクラスやメソッドで`httpsRequired=false`が指定されている場合、httpでアクセスしてもhttpsにリダイレクトされないこと

### configの`https_requiring=false`の状態
* [x] SecureConfigのhttpsRequired=true となってる場合でも、httpsにリダイレクトされないこと

### HTTP Status Code
* [x] 200OKであること

### testing
* [x] テストコードが通ること

## その他

httpsで通信していない場合に、`HttpsRequiredException.php`を発生させてます。
この例外クラスは`Symfony\Component\HttpKernel\Exception\HttpExceptionInterface`を実装しています。

Symfony2.1以降、`Symfony\Component\HttpKernel\HttpKernel::handleException`の処理が変わって、`HttpExceptionInterface`を実装するか、Responseのheaderに`X-Status-Code`を指定する必要があります。

Symfony2.3対応した時から`AuthException`が発生するとstatus codeが500となっていたので、Enterfaceを実装するより、$event->setRespons($response)する手前で、headerに`X-Status-Code`を追加する方法でもよかったかもしれません。。

【参考】
http://symfony.com/doc/2.3/book/internals.html#kernel-exception-event
https://github.com/symfony/symfony/blob/2.3/src/Symfony/Component/HttpKernel/HttpKernel.php#L188