Spring Boot で　Spring Security

軽くやってみたら、ちと、Getting Started に不備があったのでメモ

##STSのインストール
3.5.1をインストール
https://spring.io/tools/sts
(gradle使いたければ、dashboadのIDE EXTENTIONSから Gradle Pluginもインストール)

##Getting Started　プロジェクトの作成
1.new ➡Import Spring Getting Started Contents
2.securing Webを選択。（しばらく待つと、ダウンロードして、finishが押せる。）
3.finish
![スクリーンショット 2014-06-22 14.54.24.png](https://qiita-image-store.s3.amazonaws.com/0/30836/1b349f02-368e-be44-627c-0595fff13bab.png)

##起動してみる。
1.gs-securing-web-completeを選択して、Run As➡Spring Boot App
![スクリーンショット 2014-06-22 14.58.53.png](https://qiita-image-store.s3.amazonaws.com/0/30836/bc551849-55c2-1cd2-8eac-e53e9c7aadbc.png)
2.ブラウザでlocalhost:8080/loginにアクセスすると、
![スクリーンショット 2014-06-22 14.59.39.png](https://qiita-image-store.s3.amazonaws.com/0/30836/e5ebd967-9a22-5e4e-f66a-67e8fa7efb31.png)
3.ユーザー名は「user」,パスワードは「password」でログイン可能。
![スクリーンショット 2014-06-22 15.02.15.png](https://qiita-image-store.s3.amazonaws.com/0/30836/2d085193-6746-2509-0608-ab0971136a2a.png)


##管理者ページの確認

```java
package hello;


@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
　　　　　　　　　//管理者ページの追加
                .antMatchers("/admin").hasRole("ADMIN")
                .anyRequest().authenticated();
        http
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
        //管理者ユーザーの登録
        auth
           .inMemoryAuthentication()
                .withUser("admin").password("password").roles("ADMIN");
        
    }
}
```

```java:MvcConfig

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
    
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("hello");
        registry.addViewController("/login").setViewName("login");
        //管理者ページの追加
        registry.addViewController("/admin").setViewName("admin");
    }

}
```
適当にテンプレートページも追加(java/main/resources/templates).

```html:admin.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
    <head>
        <title>Admin Page</title>
    </head>
    <body>
        <h1 th:inline="text">Hello Administrator[[${#httpServletRequest.remoteUser}]]!</h1>
        <form th:action="@{/logout}" method="post">
            <input type="submit" value="Sign Out"/>
        </form>
    </body>
</html>
```
アクセスしてみる。
###「user」でログオンし、localhost:8080/adminに入るとエラー。
![スクリーンショット 2014-06-22 15.29.04.png](https://qiita-image-store.s3.amazonaws.com/0/30836/bdbb895e-59a8-299a-ff5d-1c05de8db196.png)
###「admin」でログオンし、localhost:8080/adminに入ると正常に表示される。
![スクリーンショット 2014-06-22 15.30.16.png](https://qiita-image-store.s3.amazonaws.com/0/30836/5e3c097a-22cd-e79e-164a-361f10602e29.png)

##タグによる表示の制御
thymeleafにはSpring Security用のdialectがある。
http://www.thymeleaf.org/springsecurity.html

```html:hello.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
    <head>
        <title>Hello World!</title>
    </head>
    <body>
    
        <div sec:authorize="hasRole('ROLE_ADMIN')">This is Admin</div>
        <div sec:authorize="hasRole('ROLE_USER')">This is User</div>
        
        <h1 th:inline="text">Hello [[${#httpServletRequest.remoteUser}]]!</h1>
        <form th:action="@{/logout}" method="post">
            <input type="submit" value="Sign Out"/>
        </form>
    </body>
</html>
```
これでいいはずだが、なぜか、sec:がhtmlでもそのまま表示されてしまい、タグの表示制御ができていない。

build.gradleに下記を追加する。
参考：http://stackoverflow.com/questions/22606311/filter-html-content-with-spring-and-thymeleaf

```groovy:build.gradle
dependencies {
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-starter-security")
    //追加 
	compile ('org.thymeleaf.extras:thymeleaf-extras-springsecurity3:2.1.1.RELEASE')
//これは不備で、本来は下記のようになるはず
//compile ('org.thymeleaf.extras:thymeleaf-extras-springsecurity4:バージョン')
	testCompile("junit:junit")
}

```
これでタグの表示制御もできる。

追記。コメントで指摘の通り、templateのns宣言とdependenciesの宣言があっていない。org.thymeleaf.extrasはSpring3用と4用で分かれるので、本来は間違い。修正してからの、動作確認できてないです。すみません。