Spring Securityは大規模なモジュールであり、この記事にはカスタムパラメーターの認証のみが含まれます。 Spring Securityのデフォルト検証パラメーターは、ユーザー名とパスワードのみであり、通常は十分ではありません。時間が長すぎるため、忘れられている人もいれば、欠落している可能性があります。わかりました、ナンセンスはありません。
SpringおよびSpringのセキュリティ構成では、Javaconfigを使用し、バージョンは4.2.5および4.0.4です。
全体的なアイデア:エントリポイントをカスタマイズし、カスタムパラメーターを追加して、認証のためにAuthenticationTokenとAuthenticationProviderを拡張します。
最初にエントリポイントを定義します:
Import org.springframework.security.core.authenticationexception; import org.springframework.security.web.authentication.loginurlauthenticationEntrypoint; Import javax.servletexception; Import javax.servlet.http.httpservletrequett; javax.servlet.http.httpservletresponse; Import java.io.io.ioexception; public class myauthenticationEntrypoint extends logginurlauthenticationEntrypoint {public myAuthenticationEntryPoint(String loginformurl){super(loginformurl); } @Override public void開始(httpservletrequest request、httpservletresponse response、authenticationexception authexception)は、ioexception、servletexception {super.commence(request、response、authexception)をスローします。 }}次はトークンです。有効なコードは検証コードパラメーターです。
Import org.springframework.security.authentication.uthernamepasswordauthenticationtoken; public class myusernamepasswordauthenticationToken拡張usernamepasswordauthenticationtoken {private string validcode; public MyusernAmepassWordAuthEnticationToken(String Principal、String Credentials、String validCode){super(spinital、credentials); this.validCode = validCode; } public string getValidCode(){return validCode; } public void setValidCode(string balidcode){this.validCode = validCode; }}ProcessingFilterを続行し、
com.core.shared.validatecodehandle; Import org.springframework.security.core.authentication; import org.springframework.security.core.authenticationception; Import org.springframework.security.web.web.authentication.abtrattractationprocessingingingfilter; org.springframework.security.web.util.matcher.AntPathRequestMatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.ioexception; public class myvalidcodeprocessingfilter extends abstractauthenticationprocessingfilter {private string usernameparam = "username";プライベート文字列passwordParam = "password"; private string validCodeparam = "validAtecode"; public myValidCodeProcessingFilter(){super(new antpathRequestMatcher( "/user/login"、 "post")); } @Override public Authentication TragineAuthentication(httpservletrequest request、httpservletresponse応答)Slows AuthenticationException、ioexception、servletexception {string username = request.getParameter(usernameparam);文字列password = request.getParameter(passwordParam); string balidcode = request.getParameter(validCodeparam);有効(validCode、request.getSession()); myusernamepasswordauthenticationtoken token = new myusernamepasswordauthenticationtoken(username、password、validcode); this.getauthenticationManager()。認証(トークン); } public void balid(string validcode、httpsession session){if(validCode == null){throw new validCodeErrorexception( "balidatecode is empty!"); } if(!validAteCodeHandle.MatchCode(SESSION.GETID()、validCode)){throw new validCodeErrorexception( "validCodeError!"); }}}ログインフォームからパラメーターを受信するために使用される3つのパラメーターを個別に定義します。構築方法により、ログインURLと必要なPOSTメソッドが提供されます
次は認証です。認証ユーザー名とパスワードが到着する前に、確認コードを認証しました。
これは、Tool Class validAteCodeHandleとvalidCodeErrorexceptionです。
Import java.util.concurrent.concurrenthashmap; public class validatecodehandle {private static concurrenthashmap validatecode = new concurrenthashmap <>(); public static concurrenthashmap getCode(){return validAtecode; } public static void save(string sessionid、string code){validatecode.put(sessionId、code); } public static string getValidateCode(String SessionID){object obj = validAtecode.get(sessionId); if(obj!= null){return string.valueof(obj); } nullを返します。 } public static boolean matchcode(string sessionid、string inputCode){string savecode = getValidateCode(sessionID); if(savecode.equals(inputCode)){return true; } falseを返します。 }}ここでは、それが後続の障害プロセスに従うように、それがセキュリティ認証障害であることを示すために認証エクセプトを継承する必要があります。
Import org.springframework.security.core.authenticationexception; public class validcodeerrorexceptionはexhindicationexceptionを拡張します{public validcodeerrorexception(string msg){super(msg); } public validCodeErrorexception(String MSG、Throwable T){super(msg、t); }}次はプロバイダーです:
Intorg.springframework.security.authentication.badcredentialSexception; Import org.springframework.security.authentication.usernamepasswordauthenticationtoken; Import org.springframework.security.authentication.dao.dao org.springframework.security.core.authenticationexception; import org.security.core.core.userdetails; utherdeticationprovider; extends daoauthenticationProvider {@Override public boolean(クラス<?>認証) myusernamepasswordauthenticationtoken.class.isassignablefrom(authentication); } @Override Protected void adthipeAuthenticationChecks(userdetails userdetails、usernamepasswordauthenticationtoken認証)Sthrows authenticationexception {object salt = null; if(getSaltSource()!= null){salt = getSaltSource()。getSalt(userdetails); } if(authentication.getcredentials()== null){logger.debug( "認証障害:資格情報なし");新しいbadcredentialsexception( "username or password error!")をスローします。 } string presentedpassword = authentication.getcredentials()。toString(); if(!this.getPassWordENCODER()。isPassWordValid(userdetails.getPassWord()、presentedPassWord、SALT)){ogger.debug( "認証失敗:パスワードは保存値と一致しない");新しいbadcredentialsexception( "under underユーザーまたはパスワード!")を投げます。 }}}サポートメソッドは、カスタムトークンの使用を指定し、追加の承認チェックメソッドは親クラスのロジックとまったく同じです。例外によって返される情報を変更しました。
次は、成功した認証と失敗した認証を処理するハンドラーです
Import org.springframework.security.core.authentication; import org.scurity.web.authentication.simpleurlauthenticationsuccesshandler; Import javax.servlet.servletexception; Import javax.servlet.http.httpservletrequett; javax.servlet.http.httpservletResponse;インポートjava.io.io.ioexception; public class frontauthenticationsuccesshandler extends simpleurlauthenticationsuccesshandler {public frontauthenticationucsucscesshandler(string defaulttargeturl){defaulttargeturl); } @Override public void onauthenticationsucess(httpservletrequest request、httpservletResponse応答、認証認証)IoException、servletexception {super.onauthenticationsuccess(リクエスト、応答、認証); }} Import org.springframework.security.core.authenticationexception; import org.springframework.security.web.authentication.simpleurlauthenticationfailurehandler; Import javax.servletexception; Import javax.servlet.http.httpservletrequest; Import; javax.servlet.http.httpservletResponse; Import java.io.ioexception; public class frontauthenticationfailurehandler extends simpleurlauthenticationfailurehandler {public frontauthenticationfailurehandler(String defaultfailureurl){default(defaultfailureurl); } @Override public void onauthenticationFailure(httpservletrequest request、httpservletresponse response、authenticationexception Exception)は、ioexception、servletexception {super.onauthenticationfailure(リクエスト、応答、例外)をスローします。 }}最後に、最も重要なセキュリティ構成:
com.service.user.customerservice; Import com.web.filter.sitemeshfilter; Import com.web.mysecurity。*; import org.springframework.beans.factory.annotation.autowired; import org.springframework.context.annotation.annotation.byean; springframework.context.annotation.configuration; Import org.springframework.core.annotation.order; Import org.security.authentication.authenticationmanager; Import org.springframework.security.authentication.authenticationpriderticationProvider; springframework.security.authentication.providermanager; Import org.springframework.security.config.annotation.web.builders.httpsecurity; Import org.springframework.security.config.annotation.web.configuration.enablewebsecurity; springframework.security.config.annotation.web.configuration.websecurityconfigureradapter; Import org.security.crypto.password.passwordencoder; Import org.springframework.security.crypto.standardPass org.springframework.security.web.access.exceptiontranslationfilter; Import org.springframework.security.web.authentication.uthernamepasswordauthenticationfilter; Import org.springframework.security.web.context. org.springframework.web.filter.characterencodingfilter; Import javax.servlet.dispatchertype; import javax.servlet.filterregistration; Import javax.servlet.servletcontext; Import Java.util.Arraylist; Java.util.util.util.util.util.util.util.util.util.util.util.util.util.util.util.util.util.util.util.のインポートjava.util.list;@configuration@enablewebsecuritypublic class securityconfig extends abstractsecuritywebapplicationInitializer {@bean publics passwordencoder passwordencoder(){return new StandardPasswordencoder( "MD5"); } @Autowiredプライベートカスタマーサービス顧客サービス。 @configuration @Order(1)public static class frontendwebsecurityconfigureadapter extends websecurityconfigureradapter {@autowired private myvalidcodeprocessingfilter myvalidcodeprocessingingfilter; @Override Protected void configure(httpsecurity http)throws {http.csrf()。disable().authorizerequests( "/user/login"、 "/user/logout")。 .addfilterbefore(myvalidcodeprocessingfilter、usernamepasswordauthenticationfilter.class).formlogin().loginpage( "/user/login")。 }} @bean(name = "frontauthenticationProvider")public myAuthenticationProvider frontauthenticationProvider(){myAuthenticationProvider myAuthenticationProvider = new MyAuthicationProvider(); myAuthenticationProvider.setUserDetailsService(customerservice); myAuthenticationProvider.setPassWordENCODER(PassdapEncoder()); myAuthenticationProviderを返します。 } @bean public AuthenticationManager AuthenticationManager(){list <AuthenticationProvider> list = new ArrayList <>(); list.add(frontauthenticationprovider()); AuthenticationManager AuthenticationManager = new ProviderManager(list); AuthenticationManagerを返します。 } @bean public myValidCodeProcessingFilter myValidCodeProcessingFilter(AuthenticationManager AuthenticationManager){myValidCodeProcessingFilterフィルター= new MyValidCodeProcessingFilter(); Filter.SetAuthenticationManager(AuthenticationManager); filter.setauthenticationsuccesshandler(frontauthenticationsuccesshandler()); filter.setAuthenticationFailureHandler(frontauthenticationFailureHandler());返品フィルター。 } @bean public frontauthenticationfailurehandler frontauthenticationfailurehandler(){return new frontauthenticationfailurehandler( "/user/login"); } @bean public frontauthenticationsuccessuceshandler frontauthenticationsucceshandler(){return new frontauthenticationsucceshandler( "/front/test"); } @bean public myAuthenticationEntryPoint myAuthenticationEntryPoint(){return new MyAuthenticationEntryPoint( "/user/login"); }}まず第一に、それは暗号化クラスの豆であり、customerserviceはシンプルなクエリユーザーです
@service( "Customerservice")Public Class CustomerServiceImplはcustomerservice {@autowired private userdao userdao; @Override public userdetails loaduserbyUsername(string username)throws usernamenotfoundexception {return userdao.findcustomerbyusername(username); }}次は、frontendwebsecurityconfigureadapterです。 Configureメソッド、最初にCSRFを無効にし、authorizerequests()を有効にすることを書き直しました。ここで、「/user/login」と「/user/logout」許可確認の手放し、その他のリクエストにはログイン認証が必要です。カスタムmyvalidcodeprocessingfilterをセキュリティでデフォルトのusernamepasswordauthenticationfilterに追加する前に、まずカスタムパラメーター認証を実行し、次にformlogin()、ログインURLおよびログアウトURL、ログインURL、ログインURL、ログインURL、ログインURLを設定して、URLをログインします。
次は、AuthenticationProvider、AuthenticationManager、ProcessingFilter、AuthenticationFailureHandler、AuthenticationsucsCesshandler、およびEntryPointのBeanディスプレイ宣言です。
以下はlogin.jspです
<body> <div> <form:form autocomplete = "false" commandName = "userdto" method = "> <div> <span> <b> $ {spring_security_last_exception.message} </b> </span </div> username:<form:input path =" username "cssclass =" patidf/> <patisd = <<patids " cssclass = "form-control"/> <br/> validatecode:<form:input path = "validatecode" cssclass = "form-control"/> <label> $ {validate_code} </label> <div> <label> <inputタイプ= "チェックボックス" name = "remember-me" </form:form> </div> </body>検証コードが失敗すると、validCodeErrorexceptionがスローされます。 AuthenticationExceptionを継承するため、SecurityがAuthenticationExceptionに遭遇すると、AuthenticationFailureHandlerがトリガーされます。上記のBeanは、認証が失敗し、ログインURLにジャンプすることを宣言しているため、login.jspに$ {spring_security_last_exception.message}があります。例外情報は、私が認証するとスローされます。これにより、ユーザーフレンドリーを促すことができます。
カスタムセキュリティ検証プロセス全体が完了しました
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。