springboot springsecurity におけるログアウトと権限制御の問題の詳細な説明

この記事では主に springboot-springsecurity のログアウトとアクセス許可の制御について説明します。アカウントのログアウトには、SecurityConfig でログアウト機能を有効にするコードを追加する必要があります。アクセス許可の制御には、springsecurity と thymeleaf の統合の依存関係をインポートする必要があります。この記事では、サンプル コードを通じて詳しく紹介します。友達の参照が必要です。それに

目次

1 アカウントのキャンセル

1.1 SecurityConfig でログアウト機能を有効にするコードを追加

1.2 Index.html にログアウト ボタンを追加する

1.3 プロジェクトのテストを開始する

2 アクセス制御

2.1 springsecurity と thymeleaf の統合依存関係をインポートする

2.2 スプリングブート バージョンのダウングレード

2.3 制約の導入

2.4 ページコードを変更する

2.5 再起動プログラムテスト


1 アカウントのキャンセル

1.1 SecurityConfig でログアウト機能を有効にするコードを追加

src/main/java/com/lv/config/SecurityConfig.java

org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder をインポートします。
org.springframework.security.config.annotation.web.builders.HttpSecurity をインポートします。
org.springframework.security.config.annotation.web.configuration.EnableWebSecurity をインポートします。
org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter をインポートします。
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder をインポートします。
//AOP : インターセプター!
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //認可
    @オーバーライド
    public void configure(HttpSecurity http) が例外をスローする {
        //ホームページは誰でもアクセス可能、機能ページは対応する権限のある人のみがアクセス可能
        //認可リクエストのルール~(チェーンプログラミング)
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");
        //デフォルトではログインページにジャンプする権限がないため、ログインページを開く必要があります
        http.formLogin();
        //ログアウト、ログアウト機能が有効になり、ホームページにジャンプします
        http.logout().logoutSuccessUrl("/");
        //クロスサイトツールの防止、取得、投稿
        http.csrf().disable();//csrf 関数を閉じます。ログアウト失敗の考えられる理由
    }
    //認証、springboot 2.1.x を直接使用可能
    //パスワードエンコード: PasswordEncoder
    //Spring Security 5.0以降では多くの暗号化方式が追加されました
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //これらのデータは通常、データベースから読み取られる必要があります
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("lv").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3")
                。と()
                .withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
                .withUser("ゲスト").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
}

1.2 Index.html にログアウト ボタンを追加する

src/main/resources/templates/index.html

<!--ログイン ログアウト-->
<div class="右メニュー">
    <div>
        <a class="item" th:href="@{/toLogin}">
            <i class="アドレス カード アイコン"></i>登录
        </a>
    </div>
    <div>
        <a class="item" th:href="@{/logout}">
            <i class="sign-out icon"></i>注销
        </a>
    </div>
</div>

1.3 プロジェクトのテストを開始する

ログイン ページにアクセスし、レベル 1 ページにアクセスできるゲスト アカウントにログインします。

ログインに成功したら、level1 のリンクをクリックし、レベルのページに正常にジャンプし、ログアウト ボタンをクリックします。

ホームページに戻り、もう一度クリックしてレベル 1 ページをクリックします。

ログインページにジャンプしました

アカウントが正常にキャンセルされたことを示します

2 アクセス制御

2.1 springsecurity と thymeleaf の統合依存関係をインポートする

pom.xml

<!-- springSecurity と thymeleaf 統合パッケージ -->
<依存関係>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
    <バージョン>3.0.2.RELEASE</バージョン>
</依存関係>

2.2 スプリングブート バージョンのダウングレード

pom.xml

<親>
    <groupId>org.springframework.boot</groupId>
    <artifactId>スプリングブートスターター親</artifactId>
    <バージョン>2.0.9.RELEASE</バージョン>
    <relativePath/> <!-- リポジトリから親を検索 -->
</親>

springboot のバージョンを 2.0.9 未満に下げる必要があります。そうしないと、sec:authorize="isAuthenticated()" が有効になりません。バージョンを下げた後は、junit の依存関係を手動でインポートする必要があります。そうしないと、テスト クラスがエラーを報告します。

<依存関係>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <バージョン>リリース</バージョン>
    <スコープ>テスト</スコープ>
</依存関係>

2.3 制約の導入

index.htmlのヘッダファイルにspringsecurityとthymeleafの統合制約を追加する

src/main/resources/templates/index.html

<html xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">

2.4 ページコードを変更する

主にログイン状態でユーザー名とログアウトボタンを表示する部分と、sec:authorize="isAuthenticated()"によりログインしていない状態でログインボタンを表示する部分の2つを変更し、もう1つはページメニューの表示を変更する部分です。ログインユーザーの権限は、sec:authorize="hasRole('vip1')" によって実装されます。

src/main/resources/templates/index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<頭>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=デバイス幅、初期スケール=1、最大スケール=1">
    <title>ホームページ</title>
    <!--semantic-ui-->
    <link href="https://cdn.bootcss.com/semantic-ui/2.4.1/semantic.min.css" rel="stylesheet">
    <link th:href="@{/qinjiang/css/qinstyle.css}" rel="stylesheet">
</head>
<本文>

<!--メインコンテナ-->
<div class="ui コンテナ">
    <div class="ui セグメント" id="index-header-nav" th:fragment="nav-menu">
        <div class="ui セカンダリ メニュー">
            <a class="item" th:href="@{/index}">首页</a>
            <!--ログイン ログアウト-->
            <div class="右メニュー">
                <!-- ログインしていない場合: ログイン ボタンを表示します -->
                <div sec:authorize="!isAuthenticated()">
                    <a class="item" th:href="@{/toLogin}">
                        <i class="アドレス カード アイコン"></i>登录
                    </a>
                </div>
                <!-- ログインしている場合: ユーザー名とログアウト ボタンを表示 -->
                <div sec:authorize="isAuthenticated()">
                    <a class="アイテム">
                        ユーザー名: <span sec:authentication="name"></span>
                    </a>
                </div>
                <div sec:authorize="isAuthenticated()">
                    <a class="item" th:href="@{/logout}">
                        <i class="sign-out icon"></i>注销
                    </a>
                </div>
            </div>
        </div>
    </div>
    <div class="ui セグメント" style="text-align: center">
        <h3>秦疆による春のセキュリティ調査</h3>
    </div>
    <div>
        <br>
        <div class="ui 3 列積み重ね可能なグリッド">
            <!-- メニューはユーザーの役割に応じて動的に実装されます -->
            <div class="column" sec:authorize="hasRole('vip1')">
                <div class="ui 隆起セグメント">
                    <div class="ui">
                        <div class="コンテンツ">
                            <h5 class="content">レベル 1</h5>
                            <時間>
                            <div><a th:href="@{/level1/1}"><i class="ブルホーン アイコン"></i> レベル 1-1</a></div>
                            <div><a th:href="@{/level1/2}"><i class="ブルホーン アイコン"></i> レベル 1 ~ 2</a></div>
                            <div><a th:href="@{/level1/3}"><i class="ブルホーン アイコン"></i> レベル 1 ~ 3</a></div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="column" sec:authorize="hasRole('vip2')">
                <div class="ui 隆起セグメント">
                    <div class="ui">
                        <div class="コンテンツ">
                            <h5 class="content">レベル 2</h5>
                            <時間>
                            <div><a th:href="@{/level2/1}"><i class="ブルホーン アイコン"></i> レベル 2-1</a></div>
                            <div><a th:href="@{/level2/2}"><i class="ブルホーン アイコン"></i> レベル 2-2</a></div>
                            <div><a th:href="@{/level2/3}"><i class="ブルホーン アイコン"></i> レベル 2-3</a></div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="column" sec:authorize="hasRole('vip3')">
                <div class="ui 隆起セグメント">
                    <div class="ui">
                        <div class="コンテンツ">
                            <h5 class="content">レベル 3</h5>
                            <時間>
                            <div><a th:href="@{/level3/1}"><i class="ブルホーン アイコン"></i> レベル 3-1</a></div>
                            <div><a th:href="@{/level3/2}"><i class="ブルホーン アイコン"></i> レベル 3-2</a></div>
                            <div><a th:href="@{/level3/3}"><i class="ブルホーン アイコン"></i> レベル 3-3</a></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script th:src="@{/qinjiang/js/jquery-3.1.1.min.js}"></script>
<script th:src="@{/qinjiang/js/semantic.min.js}"></script>
</body>
</html>

2.5 再起動プログラムテスト

ログインしていないページ

lvユーザーページにログイン

ゲストユーザー向けログインページ

root ユーザーのページにログインします

ページの表示が異なり、権限制御が正常に実装されています

おすすめ

転載: blog.csdn.net/weixin_53630942/article/details/124180043