Spring Security Basic Introduction
ここでは、Spring Securityにはあまり紹介しません。詳細については、公式ドキュメントを参照してください。
スプリングセキュリティのコア機能についてのみお話します。
基本的な環境構造
ここでは、スプリングブートをプロジェクトの基本的なフレームワークとして使用します。私はパッケージ管理にMavenメソッドを使用しているので、ここで最初にSpring Securityを統合する方法を示します。
<Dependencies> ... <Dependency> groupId> org.springframework.boot </groupid> <artifactid> spring-boot-starter-security </artifactid> </dependency> ... </dependencies>
次に、Webレイヤーリクエストインターフェイスを確立します
@retycontroller @requestmapping( "/user")public class usercontroller {@getmapping public string getusers(){return "hello spring security"; }}次に、プロジェクトを直接実行し、インターフェイスに電話して効果を確認できます。
Webページを介して呼び出します
最初にブラウザを介してインターフェイスを呼び出し、http:// localhost:8080/userに直接アクセスします。インターフェイスに正常にアクセスできる場合は、「Hello Spring Security」を表示する必要があります。
ただし、正常にアクセスすることはできず、下の図の認証入力ボックスが表示されます
これは、スプリングブートでは、デフォルトのスプリングセキュリティが効果的であるためです。現時点では、インターフェイスが保護されており、通常のアクセスにアクセスするために検証に合格する必要があります。 Spring Securityはデフォルトのユーザーを提供し、ユーザー名はユーザーであり、プロジェクトの開始時にパスワードが自動的に生成されます。
プロジェクトの起動ログを確認すると、次のログが見つかります
デフォルトのセキュリティパスワードの使用:62CCF9CA-9FBE-4993-8566-8468CC33C28C
もちろん、表示されるパスワードは私のパスワードとは異なる必要があります。スタートアップログでユーザーとパスワードで直接ログインします。
正常にログインした後、インターフェイスが正常に呼ばれるページにジャンプします。
最初からSpring Securityを有効にしたくない場合は、構成ファイルで以下を構成できます。
#security enable security.basic.enabled = false
私が見たばかりのログインボックスは、httpbasicloginと呼ばれるSpringsecurityによって提供されました。それは私たちが私たちの製品に望んでいるものではありません。フロントエンドは通常、フォームの提出を通じてユーザーログイン検証を実行するため、独自の認証ロジックをカスタマイズする必要があります。
ユーザー認証ロジックをカスタマイズします
各システムには独自のユーザーシステムセットが必要なため、独自の認証ロジックとログインインターフェイスをカスタマイズする必要があります。
ここでは、それに応じてSpringsecurityを構成する必要があります
@configurationpublic class browersecurityconfig extends websecurityconfigureradapter {@override保護されたvoid configure(httpsecurity http)スロー例外{http.formlogin(){http.formlogin(){http.formlogin (//ユーザーが必要なときにログインを必要とする場合に、ログインページを定義します。保護する必要はありません。AnyRequest()//リクエストの場合、.authenticated()にアクセスできます。 }}次に、独自のユーザーシステムがあるため、ユーザー認証ロジックを構成します。
@ComponentPublic Class MyUSERDETAILSSERVICE IMPLEMESS USERDETAILSSSERVICE {PRIVATE LOGGER LOGGER = LOGGERFACTORY.GETLOGGER(getClass()); @Override public userdetails loaduserbyusername(string username)throws usernamenotfoundexception {logger.info( "user's username:{}"、username); //ユーザー名に従って、対応するパスワードを見つけて、ユーザー情報をカプセル化して返します。パラメーターは次のとおりです。ユーザー名、パスワード、ユーザー許可ユーザーユーザー= new user(userame、 "123456"、authoritils.commaseparatedStringToAuthorityList( "admin"));ユーザーを返します。 }}ここではあまり検証を行いませんでした。ユーザー名は自由に入力できますが、パスワードは「123456」でなければならないため、正常にログインできます。
同時に、ここのユーザーオブジェクトの3番目のパラメーターが現在のユーザーの許可を表し、「管理者」に設定することがわかります。
プログラムを実行してテストすると、ログインインターフェイスが変更されたことがわかります。
これは、構成ファイルでhttp.formLogin()を構成したためです
ここでユーザーに入力してから、間違った(非123456)バージョンに記入しましょう。これにより、検証エラーが促されます。
同時に、コンソールでは、ログイン時に記入したばかりのユーザーも印刷されます。
それでは、正しいパスワードでログインしてみましょう。確認に合格し、正しいインターフェイスコールページにジャンプすることがわかります。
userdetails
ちょうど今、 MyUserDetailsServiceを書いているとき、メソッドを実装してUserDetailsを返しました。このuserdetailsは、7つの方法を含むユーザー情報をカプセル化するオブジェクトです
public interface userdetailsは、シリアル化可能な{//カプセル化許可情報収集<? adrentadauthority> getauthorities(); //パスワード情報文字列getPassWord(); // login username string getUsername(); //アカウントがboolean isaccountnonexpired()の有効期限が切れるかどうか。 //アカウントがFrozen boolean isaccountnonlockedであるかどうか(); //アカウントのパスワードが期限切れになるかどうか、通常、パスワード要件が高いシステムで使用します。ユーザーと比較して、たまにブールのBoolean IsCredentialSnonexpired()をリセットする必要があります。 //アカウントは利用可能ですか? boolean isEnabled();}userdetails実装クラスユーザーを返すと、ユーザーコンストラクターメソッドを使用して対応するパラメーターを設定できます。
パスワードの暗号化と復号化
SpringsecurityにはPasswordEncoderインターフェイスがあります
public interface passwordencoder {//パスワード文字列エンコード(charsequence var1)を暗号化します。 //ブールマッチを一致させるパスワードを決定する(charsequence var1、string var2);}このインターフェイスを自分で実装し、構成ファイルで構成するだけです。
ここでは、デフォルトで提供される実装クラスで一時的にテストします
// browersecurityconfig @beanpublic passwordencoder passwordencoder(){return new bcryptpasswordencoder(); }暗号化の使用:
@ComponentPublic Class MyUSERDETAILSSERVICE IMPLEMESS USERDETAILSSSERVICE {PRIVATE LOGGER LOGGER = LOGGERFACTORY.GETLOGGER(getClass()); @AutowiredプライベートPasswordEncoder PasswordEncoder; @Override public userdetails loaduserbyusername(string username)throws usernamenotfoundexception {logger.info( "user's username:{}"、username);文字列password = passwordencoder.encode( "123456"); logger.info( "password:{}"、password); //パラメーターは次のとおりです。ユーザー名、パスワード、ユーザー許可ユーザーユーザー= newユーザー(username、password、authoriutils.commaseparatedStringToAuthorityList( "admin"));ユーザーを返します。 }}ここでは、123456を暗号化するだけです。テストを実施して、毎回印刷されたパスワードが異なることがわかります。これは、構成されたbcryptpasswordencoderの役割です。
パーソナライズされたユーザー認証ロジック
カスタムログインページ
以前のテストでは、デフォルトのログインインターフェイスが常に使用されています。各製品には独自のログインインターフェイスデザインがあると考えているため、このセクションでログインページをカスタマイズする方法について学びます。
最初に簡単なログインページを書きましょう
<!doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title> loginページ</title> </head> <body> <h2> custom login page </h2> <form action = "/user/login" method = "post"> <td> <td> <td> <td> <td> <td> type = "text" name = "username"> </td> </tr> <tr> <td>パスワード:</td> <td> <入力タイプ= "password" name "name =" password "> </td> </tr> <tr> <td colspan =" 2 "> <ボタンタイプ=" "> login </td> </tr </</</</</</</</</</</</</</tr </td> </td> </td> </tr </</</lf>
ログインページを完了したら、Springsecurity用に構成する必要があります
// browersecurityconfig.java@overrideprotected void configure(httpsecurity http)throws {http.formlogin()//ユーザーがログインする必要があるときにログインページを定義する.loginpage( "/login.html") //カスタムログインinterface.and().authorizerequests()//どのURLを保護する必要がないかを定義し、Antmatchers( "/login.html")。ptmitall()//全員を設定してください。 // CSRF保護をオフにします}このようにして、保護されたインターフェイスにアクセスするたびに、login.htmlページに転送されます
さまざまな種類のリクエストを処理します
これで、フロントエンドとバックエンドが一般的に分離されているため、バックエンドはフロントエンドのインターフェイスを提供し、JSON形式のデータをフロントエンドに返します。前と同様に、保護されたインターフェイスが呼び出され、ページジャンプが直接リダイレクトされました。 Web側では受け入れられますが、アプリ側では不可能なので、さらに処理する必要があります。
ここに簡単なアイデアが整理されています
まず、カスタムコントローラーを作成し、ID認証が必要な場合にジャンプします。
@RestControllerPublic Class BrowserSecurityController {private logger logger = loggerFactory.getLogger(getClass()); //元のリクエスト情報のキャッシングと回復private prieckcache requestcache = new httpsessionRequestCache(); //プライベートRedirectStrategy RedirectStrategy = new defaultredirectStrategy()にリダイレクトするために使用されます。 /** *アイデンティティ認証が必要な場合、ジャンプ * @param request * @param response * @return */@RequestMapping( "/authentication/require")@responsestatus(code = httpstatus.uthorized)public baseresponse requiresauthenication(httpservletrequestice request、httpservletletreletresponseprespenseprespest exows throws savedRequest = requestCache.getRequest(request、response); if(savedRequest!= null){string targeturl = savedRequest.getRedirecturl(); logger.info( "ジャンプをトリガーするリクエストは次のとおりです。" +ターゲットルール); if(stringutils.swithignorecase(targeturl、 ".html")){redirectstrategy.sendredirect(request、response、 "/login.html"); }} new BaseReSponseを返します(「アクセスされたサービスにはID認証が必要です。ユーザーをログインページにガイドしてください」); }}もちろん、構成ファイルをそれに応じて変更する必要があるため、ここにコードを投稿することはありません。インターフェイスを開くことです。
拡張機能:
ここでは、Webページからアクセスされるインターフェイスを書き、「/login.html」ページにジャンプします。実際、それを展開し、構成ファイルにジャンプアドレスを構成することができます。これはより便利です。
カスタム処理ログイン成功/失敗
以前のテストでは、ログインが成功した後、ページのリダイレクトが実行されました。
フロントエンドとバックエンドの分離の場合、正常にログインする場合は、直接ジャンプするのではなく、ユーザーの個人情報をフロントエンドに返す必要がある場合があります。失敗したログインにも同じことが言えます。
これには、Spring Security AuthenticationSuccessHandlerとAuthenticationFailureHandlerの2つのインターフェイスが含まれます。このインターフェイスを実装して、それに応じて構成できます。もちろん、フレームワークにはデフォルトの実装クラスがあります。この実装クラスを継承し、ビジネスをカスタマイズすることができます
@component( "myauthenctiationsuccesshandler")public class myauthenctiationsuccesshandler extends simpleurlauthenticationsuccesshandler {private logger logger = loggerfactory.getlogger(getclass()); @autowired private objectmapper objectmapper; @Override public void onauthenticationsucess(httpservletrequest request、httpservletresponse応答、認証認証)は、ioexception、servletexception {logger.info( "login sucture"); Response.setContentType( "Application/JSON; charset = utf-8"); Response.getWriter()。write(objectmapper.writevalueasstring(authentication)); }}ここでは、応答を通じてJSON文字列を返します。
この方法の3番目のパラメーターでAuthentication 、ログインユーザー情報(ユーザーデテール)、セッション情報、ログイン情報などが含まれます。
@component( "myauthenctiationFailureHandler")パブリッククラスmyauthenctiationfailurehandler extends simpleurlauthenticationfailurehandler {private logger logger = loggerfactory.getLogger(getClass()); @autowired private objectmapper objectmapper; @Override public void onauthenticationFailure(httpservletrequest request、httpservletresponse response、authenticationexception Exception)throws ioexception、servletexception {logger.info( "login failed"); Response.setStatus(httpstatus.internal_server_error.value()); Response.setContentType( "Application/JSON; charset = utf-8"); Response.getWriter()。write(objectmapper.writevalueasstring(new baseresponse(exception.getMessage()))); }}この方法の3番目のパラメーターであるAuthenticationExceptionには、ログイン障害に関する情報が含まれています。
同様に、構成ファイルで構成する必要があります。ここにすべてのコードを投稿するわけではなく、対応するステートメントのみが投稿されます。
.successhandler(myauthenticationsucceshandler)//カスタムログイン正常にhandles.failurehandler(myauthenticationfailurehandler)//カスタムログイン障害ハンドル
コード
私をクリックして完全なコードを表示できます
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。