FrontPage > Spring Bootの覚書 > Spring Security

画面表示の制御

1. ロールによる表示項目の制御

トップページの「管理者ページ」リンクをADMINロールでログインした場合のみ
表示する。

ライブラリの追加

  • build.gradleの"dependencies"に"thymeleaf-extras-springsecurity3"を追加

    (build.gradle抜粋)
    dependencies {
       compile("org.springframework.boot:spring-boot-starter-web")
       compile("org.springframework.boot:spring-boot-starter-thymeleaf")
       compile("org.springframework.security:spring-security-web:3.2.6.RELEASE")
       compile("org.springframework.security:spring-security-config:3.2.6.RELEASE")
       compile ('org.thymeleaf.extras:thymeleaf-extras-springsecurity3:2.1.1.RELEASE')
       providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
       testCompile("org.springframework.boot:spring-boot-starter-test")
    }
  • プロジェクトを右クリック[Gradle]->[Refresh All]を選択。

トップページ修正

  • ネームスペース追加

    (src/main/resources/templates/top.html抜粋)
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
  • "管理者ページ"リンクを以下のようにdivで囲む

    (src/main/resources/templates/top.html抜粋)
    <div sec:authorize="hasRole('ROLE_ADMIN')">
     <a th:href="@{/admin/sample}">管理者ページ</a>
    </div>
  • ログインリンクを追加する。

    (src/main/resources/templates/top.html抜粋)
    <div th:if="${#httpServletRequest.remoteUser == null}">
     <a th:href="@{/login}">ログイン</a>
    </div>
  • top.html全体
    (src/main/resources/templates/top.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-springsecurity3">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <link th:href="@{/resources/css/base.css}" rel="stylesheet" type="text/css" />
    <title>Insert title here</title>
    </head>
    <body>
    
    <div>
     <a th:href="@{/user/sample}">ユーザページ</a><br/>
    </div>
    
    <div sec:authorize="hasRole('ROLE_ADMIN')">
     <a th:href="@{/admin/sample}">管理者ページ</a>
    </div>
    <p/>
    <div th:if="${#httpServletRequest.remoteUser == null}">
     <a th:href="@{/login}">ログイン</a>
    </div>
    
     <fieldset th:if="${#httpServletRequest.remoteUser != null}">
       <legend>ログイン情報</legend>
       <form th:action="@{/logout}" method="post">
         <span sec:authentication="name"></span>:<span sec:authentication="principal.authorities"></span>
         <div style="text-align: right">
           <input type="submit" value="ログアウト" />
         </div>
       </form>
     </fieldset>
    </body>
    </html>

実行

  • 未ログイン、ADMINロール以外のユーザでログインした場合は
    "管理者ページ"リンクは表示されない。

    ssd-top1.png

    ssd-top2.png

  • ADMINロールのユーザでログインした場合は
    "管理者ページ"リンクは表示される。

    ssd-top3.png

2. ログアウト後に表示されるページを指定する。

デフォルトではログアウトすると、ログインページが表示される。
これをトップページが表示されるように変更する。

  • WebSecurityConfigクラスのconfigureメソッド内、.logout()に
    .logoutSuccessUrl("/")を追加する。

    (src/main/java/com/ziqoo/sbSample/WebSecurityConfig.java抜粋)
       @Override
       protected void configure(HttpSecurity http) throws Exception {
           http
               .authorizeRequests()
                   .antMatchers("/resources/**", "/").permitAll()
                   .antMatchers("/admin/**").hasRole("ADMIN")
                   .anyRequest().authenticated()
                   .and()
               .formLogin()
                   .loginPage("/login")
                   .permitAll()
                   .and()
               .logout()
                   .logoutSuccessUrl("/")
                   .permitAll()
                   .deleteCookies("JSESSIONID");
       }

3. 無効なセッションIDが指定された場合の遷移先を指定する

  • .sessionManagement().invalidSessionUrlで指定する。


(src/main/java/com/ziqoo/sbSample/WebSecurityConfig.java)

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http
           .authorizeRequests()
               .antMatchers("/resources/**", "/").permitAll()
               .antMatchers("/admin/**").hasRole("ADMIN")
               .anyRequest().authenticated()
               .and()
           .formLogin()
               .loginPage("/login")
               .permitAll()
               .and()
           .logout()
               .logoutSuccessUrl("/")
               .permitAll()
               .deleteCookies("JSESSIONID")
               .and()
           .sessionManagement().invalidSessionUrl("/");
   }





添付ファイル: filessd-top3.png 358件 [詳細] filessd-top2.png 375件 [詳細] filessd-top1.png 387件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-27 (金) 17:45:54 (938d)