実装の原則
以前の記事では、通常のアカウントパスワードでログインする方法を紹介しました:Springboot + Spring Security Basic UsageとPersonalized Login構成。しかし、今では別の一般的な方法があります。これは、携帯電話のSMS検証コードを介して直接ログインすることです。ここでは、自分で追加の作業を行う必要があります。
Springsecurity認証プロセスの詳細な説明を特定している人なら誰でも、アカウントパスワード認証のプロセスでは、次のカテゴリが関与していることを知っています:usernamepasswordauthenticationfilter(パラメーターの取得を要求するために使用)、usernamepasswordauthenticationtoken(ユーザーログイン情報を表します)、プロバイダーマナー(認証のための)、
SMS検証コードを介してログインしているため、要求されたパラメーター、認証プロセス、およびユーザーログイントークン情報を一定の金額で書き換える必要があります。
もちろん、グラフィック検証コードが同じように実装されている場合は、検証コードプロセスを最初に配置する必要があります。このアプローチの利点は、他のインターフェイスも使用できるように検証コード認証プロセスが分離されていることです。
基本的な実装
検証コード検証
SMS検証コードの機能的実装は、実際にはグラフィック検証コードの原理と同じです。 1つは写真をフロントエンドに返すことであり、もう1つはユーザーに短いメッセージを送信することです。ここでは、SMSサービスプロバイダーのインターフェイスを呼び出すだけです。その他の原則については、グラフィカル検証コード関数を実装するには、Springboot + Springsecurityを参照してください。
AuthenticationToken
アカウントのパスワードでログインするとき、usernamepasswordauthenticationtokenには、ユーザーのアカウント、パスワード、および利用可能かどうかなどのその他のステータス情報が含まれています。携帯電話でSMSをログインするため、パスワードはありません。ここでは、usernamepasswordauthenticationTokenコードをコピーして、パスワード関連の情報を削除します。
パブリッククラスSMSCODEAUTHENTICATIONTOKENは、AbstractAuthenticationToken {private static final long serialversionuid = springsecuritycoreversion.serial_version_uid;プライベートファイナルオブジェクトプリンシパル。 public smscodeAuthenticationToken(String Mobile){super(null); this.principal = mobile; setauthenticated(false); } public smscodeAuthenticationToken(オブジェクトプリンシパル、コレクション<?adrantadauthority>当局を拡張){super(当局); this.principal =プリンシパル; super.setauthenticated(true); // Override} public Object getCreDentials(){return null; } public Object getPrincipal(){return this.principal; } public void setAuthenticated(boolean isauthenticated)shleg legalargumentexception {if(isauthenticated){show new Illegalargumentexception( "このトークンを信頼できるように設定できません - 代わりに許可されたコンストラクターを使用するコンストラクターを使用する"); } super.setauthenticated(false); } @override public void erasecredentions(){super.erasecredentients(); }} AuthenticationFilter
アカウントのパスワードにログインする過程で、デフォルトはusernamepasswordauthenticationfilterです。その機能は、要求からアカウントとパスワードを取得し、リクエストメソッドを確認し、AuthenticationTokenを生成することです。ここで、私たちのパラメーターは特定の方法で変更されたため、それはまだ古い方法であり、コピーして簡単な変更を行うためにコピーします
public class smscodeAuthenticationFilter extends abstractAuthenticationProcessingFilter {// prailatersキープライベート文字列mobileparameter = securityconstants.default_parameter_name_mobile; // post post private boolean postonly = trueのみサポートされていますか。 public smscodeAuthenticationFilter(){//インターフェイスのurl super(new antpathRequestMatcher(securityconstants.default_login_processing_url_mobile、 "post")); } public認証の試み(httpservletrequest request、httpservletResponse応答)authentivesexception {if(postonly &&!request.getMethod()。equals( "post")){show new eversitionserviceException( "認証方法なし:" + request.getMethod(); } //要求パラメーター名String bovel = gotainMobile(request)に従って要求値を取得します。 if(mobile == null){mobile = ""; } mobile = mobile.trim(); //対応するAuthenticationToken smscodeAuthenticationToken authRequest = new smscodeAuthenticationToken(Mobile)を生成します。 setDetails(request、authrequest); this.getauthenticationManager()。authing(authrequest); } / ***携帯電話番号を取得* /保護された文字列gotainmobile(httpservletrequest request){return request.getParameter(mobileparameter); } //無関係なコードを省略}プロバイダー
アカウントパスワードのログインプロセス中に、パスワードの正しさとアカウントが利用可能かどうかは、DaoAuthenticationProviderを介して検証されます。また、プロバイダーを自分で実装する必要があります
パブリッククラスSMSCODEAUTHENTICATIONPROVIDERを実装しているauthenticationProvider {private userdetailsService userdetailsService; / ** * IDロジック検証 * @param認証 * @return * @throws AuthenticationException */ @Override Public Authentication Authentication(Authentication Authentication)Slows AuthenticationException {SmscodeAuthenticationToken AuthenticationToken =(SMSCODEAUTHENTICATIONTOKEN)認証; userdetails user = userdetailsservice.loduserbyusername((string)authenticationToken.getPrincipal()); if(user == null){新しいinternalauthenticationserviceException( "ユーザー情報が取得できない"); } smscodeAuthenticationToken AuthenticationResult = new SmscodeAuthenticationToken(user、user.getauthorities()); authenticationResult.setDetails(AuthenticationToken.getDetails());認証を返す; } @Override public boolean supports(class <?> authentication){return smscodeauthenticationtoken.class.isassignable from(authentication); } public userdetailsService getUserDetailsService(){return userdetailsService; } public void setUserDetailsService(userdetailsService userdetailsService){this.userdetailsservice = userdetailsService; }}構成
主な認証プロセスは、上記の4つのプロセスを通じて達成されます。ここでは、それらの構成を減らすことができます。
@componentPublic class smscodeauthenticationsecurityconfig extensits securityconfigurerAdapter <defaultsecurityfilterchain、httpsecurity> {@autowired private evenusticationucescescessucescescessucticationsuccesccescsusccesshandler; @autowired private authenticationfailurehandler myauthenticationfailurehandler; @autowired private userdetailsservice userdetailsservice; @Override public void configure(httpsecurity http)スロー例外{smscodeauthenticationfilter smscodeauthenticationfilter = new smscodeauthenticationfilter(); smscodeAuthenticationFilter.setAuthenticationManager(http.getSharedObject(AuthenticationManager.class)); SMSCODEAUTHENTICATIONFILTER.SETAUTHENTICESSUCCESSHANDLER(myAuthenticationsuccesshandler); SMSCODEAUTHENTICATIONFILTER.SETAUTHENTICATIONFAILUREHANDLER(myAuthenticationFailureHandler); SMSCODEAUTHENTICATIONPROVIDER SMSCODEAUTHENTICATIONPROVIDER = new SMSCODEAUTHENTICATIONPROVIDER(); smscodeAuthenticationProvider.setUserDetailsService(userdetailsService); http.authenticationProvider(smscodeAuthenticationProvider).addfilterafter(smscodeauthenticationFilter、usernamepasswordauthenticationfilter.class); }} // browersecurityconfig.java@overrideprotected void configure(httpsecurity http)スロー例外{http.apply(smscodeauthenticationsecurityconfig);}コードダウンロード
春のセキュリティ
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。