この記事では、Spring BootがSpring Securityを統合して、メソッドの注釈を使用して許可制御を実装し、カスタムユーザーDetailServiceを使用してMySQLからユーザー情報をロードするというストーリーについて説明しています。ユーザーのパスワードを暗号化するためのセキュリティに付属のMD5暗号化を使用します。ページテンプレートでは、Thymeleafエンジンを使用しています。
ソースコードアドレス:https://github.com/li5454yong/springboot-security.git
1. POM依存関係を紹介します
<parent> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <バージョン> 1.4.4.Release </version> </parent> <依存関係> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-web </artifactid> </dependency> <dependency> groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-security </artifactid> </dependency> <dependency> <グループ<artifactid> spring-security-oauth2 </artifactid> </dependency> <dependency> groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-thymeleaf </artifactid> </dependency> <依存関係> <グループ< <artifactid> spring-boot-starter-data-jpa </artifactid> </dependency> <dependency> groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-jdbc </artifactid> </depenting> <artifactid> mysql-connector-java </artifactid> <version> 5.1.34 </version> </dependency> <dependency> <groupid> com.alibaba </groupid> <artifactid> druid </artifactid> <バージョン> 1.0.15 </バージョン
ここでは、Druid接続プーリングを使用し、Spring Data JPAはデータベースアクセスを実装します。
2。スプリングセキュリティを構成します
@configuration @enablewebmvcsecurity @enableglobalmethodsecurity(prepostenabled = true)//セキュリティアノテーションパブリッククラスWebsecurerAdapter {@bean @OverRide Protected AuthenticationManager AuthenticationManager()Throws {return super.authenticationmanager(); } @Override Protected void configure(httpsecurity http)throws exception {//すべてのユーザーが「/」および「/home」http.authorizerequests().antmatchers( "/"、 "/home")。 //ログインページを「/login」.loginpage( "/login").defaultsuccessurl( "/hello")に指定します//ログインが成功した後、デフォルトで「/hello」にジャンプします。 .permitall().and().logout().logoutsuccessurl( "/home")//ログアウト後のデフォルトのurlは "/home" .permitall(); } @autowired public void configureglobal(authenticationmanagerbuilder auth)スロー例外{auth .userdetailsservice(customuserdetailsservice()).passwordencoder(passhipencoder()); } / ***ユーザーパスワードの暗号化メソッドをMD5に設定します* @return* / @bean public md5passwordencoder passwordencoder(){return new md5passwordencoder(); } / ***データベースからユーザー情報を読むためのカスタムユーザーデテールサービス}}ここでは、基本的な構成のみがログインURL、ログイン後にジャンプするURLをセットアップし、ログアウト後にジャンプするURLのみを設定します。 annotation @enableglobalmethodsecurity(prepostenabled = true)を使用すると、セキュリティの注釈が可能になります。制御権限を必要とするメソッドでは、@preauthorizeと@prefilterを使用できます。
3.カスタムユーザーDetailService
Public Class CustomUserDetailsServiceは、userdetailsservice {@autowired // domain service class private suserservice waitservice; @Override public userdetails loaduserbyusername(string username)throws usernamenotfoundexception {// suserはデータベースのユーザーテーブルに対応します。データベースは最終的にカスタマイズできるテーブルです。 if(user == null){新しいusernamenotfoundexception( "username" + username + "not not ing"); } // securityUserはユーザーデテールを実装し、suserの電子メールをusername securityuser = new securityUser(user); collection <simpleGrantedAuthority> aittherities = new ArrayList <SimpleGrantedAuthority>(); ATIOLITIES.ADD(new SimpleGrantedAuthority( "role_admin")); Return SecurityUser; }}ここでは、userdetailsServiceインターフェイスを実装し、LoaduserByUsernameメソッドを書き直し、データベースからユーザー情報を取得するだけです。最後に、userdetails実装クラスが返されます。
4.エラー処理構成を定義します
@configurationPublic class errorpageconfig {@bean public embeddedservletcontainercustomizer embeddedservletcontainercustomizer(){return new mycustomizer(); } private static class mycustomizer実装embeddedservletcontainercustomizer {@override public void customize(configureableembeddedservletcontainer container){container.adderrorpages(new errorpage(httpstatus.forbidden、 "/403")); }}}アクセスエラーが発生したら、「/403」にジャンプします。
5。コントローラーインターフェイス
@ControllerPublic Class IndexController {@Resource Private Suserservice Suserservice; @RequestMapping( "/home")public string home(){return "home"; } @preauthorize( "hasrole( 'user')")@requestmapping(value = "/admin"、method = requestmethod.get)public string toadmin(){return "helloadmin"; } @RequestMapping( "/hello")public string hello(){return "hello"; } @RequestMapping( "/login")public string login(){return "login"; } @RequestMapping( "/")public string root(){return "index"; } @RequestMapping( "/403")public string error(){return "403"; }}@preauthorize( "hasrole( 'user')")はtoadmin()メソッドで使用されており、このメソッドにアクセスするためにユーザーロールが必要であることを示しています。権限レベルを制御する場合は、@Preauthorize( "haspermission()")を使用できます。これは使用法の1つにすぎません。その他の使用方法については、公式ドキュメントを読むことができます。 Spring Securityのデフォルトの役割の接頭辞は「Role_」であることに注意してください。これは、Hasroleメソッドを使用するときにデフォルトで追加されています。したがって、データベースでのユーザーの役割は「role_user」である必要があり、ユーザーのプレフィックス「役割_」がユーザーの前に追加される必要があります。
6。テスト
プロジェクトを開始し、http:// localhost:1130/loginにアクセスしてください
クリックしてログインして「/hello」を入力します
クリックして[管理者]ページにジャンプします
「ユーザー」メソッドに対応するバックグラウンド「/admin」URLでは、ユーザーは「ユーザー」の役割を持つ必要があります。ログインしたユーザーもデータベースに設定され、この役割があります。
次に、データベースのユーザーロールを変更し、「role_admin」に変更します。ログアウトしたら、もう一度ログインして、[[管理]ページに移動]ボタンをもう一度クリックすると、次のページにジャンプします。
現在「ユーザー」の許可がないため、アクセス中に例外がスローされ、「/403」に傍受され、リダイレクトされました。
7.アクセスを投稿、エラーコード403
まず、「/admin」を変更してリクエストを投稿します
@preauthorize( "hasrole( 'user')")@requestmapping(value = "/admin"、method = requestmethod.post)public string toadmin(){return "helloadmin"; }元のフォーム式から「管理者ページに移動」ボタンの要求方法を変更します。フォームポストを使用して提出されていない理由については、後で説明します。最初にコードを変更します
<body> <h1 th:inline = "text"> hello [[$ {#httpservletrequest.remoteuser}]] th:type = "submit" th:value = "に移動ページに移動"/> </form> - > <a th:href = "@{/admin}" rel = "external nofollow"> <入力th:入力th: "onclick =" testpost() "to"/> < $ .ajax({url: "/admin"、type: 'post'、success:function(data){}}); } </script> [管理者ページに移動]ボタンをクリックすると、デバッグプラットフォームで以下が表示されます
これは、フレームワークがCSRF(クロスサイトリクエストの偽造クロスサイトリクエスト偽造)が発生するのを防ぎ、GET以外のほとんどの方法を制限するためです。
これが解決策です:
まず、タグに次のコンテンツを追加します。
<Meta name = "_ csrf" th:content = "$ {_ csrf.token}"/> <meta name = "_ csrf_hader" th:content = "$ {_ csrf.headername}"/>このトークンが追加されている限り、背景はこのトークンの正確性を検証します。それが正しい場合、それはポストアクセスを受け入れます。
次に、AJAXコードに次のコードを追加します。
var token = $( 'meta [name = "_ csrf"]')。
このようにして、通常、Post、削除、その他のメソッドを使用してアクセスできます。
上記は、フォームの投稿方法を使用して送信しました。ページのソースコードを表示することで確認できます。
フレームワークは非表示のフィールドをフォームフォームに自動的に挿入し、値値はトークンであるため、フォームフォームを使用してPOSTリクエストを直接渡すことができ、Ajax Wayで送信する場合は、そのコードを追加する必要があります。
さて、それはこの記事に関するすべてです。後に、Spring Securityを使用してREST APIスタイルのアクセス許可を制御する方法についての記事があります。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。