1、背景Springboot-Securityのセキュリティフレームワーク
楽屋セキュリティフレームワークを設定されている管理フレームワークで使用する場合、フレームワークの実装プロセスは、ケースです。
ユーザークラスを作成します。
まず、あなたはいくつかのメソッドを実装するためのインターフェイスでインターフェイスUserDetailsを達成したいというユーザークラスを作成し、最も重要なのはにあります
/ * * *収集ユーザーの文字情報、文字情報収集に * @return * / @Override パブリックコレクション<GrantedAuthority拡張?> GetAuthorities(){ ArrayListを <GrantedAuthority>当局= 新しい新しいのArrayList <> (); のため(ロールロール:ロール){ authorities.add(新しい新しいSimpleGrantedAuthority(role.getName())); } 戻り機関を; }
主な方法は、ユーザーの役割の収集情報にあります。
Seriviceで
場合は、クエリのデータベースを介してユーザのログイン名、ユーザーが存在し、ユーザが直接ユーザーに返さ存在する場合は、UsernameNotFoundExceptionをスローしない場合、
1 - 実施形態は、この方法は、主にユーザーのユーザー名とパスワードの検証であるようなものです
@Override 保護 ボイド configureは(AuthenticationManagerBuilder AUTH)スロー例外{ auth.userDetailsService(hrSevice).passwordEncoder(新しいBCryptPasswordEncoder())。 }
2-実施例は、方法は、主にインターフェイスを対応するクリアランスが、ログイン・インタフェースを解放することができないようなものです。ログインは言葉のURLログインしている場合。
@Override 公共 のボイドのconfigure(WebSecurity社のウェブ)がスロー例外{ 。(antMatchersをweb.ignoring()を、 "login_p" "/静的/ **" ); }
3-実施形態は、そのようなものです
@Override 保護 ボイド configureが(HttpSecurity HTTP)スロー例外{ http.authorizeRequests() .withObjectPostProcessor(新しい ObjectPostProcessor <FilterSecurityInterceptor> (){ @Override 公衆 <Oが延び FilterSecurityInterceptorを> O後処理(O O){ o.setSecurityMetadataSource(urlFilterConfig)。 o.setAccessDecisionManager(webAccessDecisionManager); 戻りO; } }) .AND() .formLogin()loginPage(。"/login_p").loginProcessingUrl("/login" ) .usernameParameter( "ユーザ名")。passwordParameter( "パスワード" ) .successHandler(新しいAuthenticationSuccessHandler(){ @Override 公共 のボイド onAuthenticationSuccess(HttpServletRequestのREQ、HttpServletResponseのRESP、認証の認証)スローのIOException、ServletExceptionが{ resp.setContentType( "アプリケーション/ JSONを、文字セット= UTF-8" ); ObjectMapper OM = 新しいObjectMapper(); のPrintWriterアウト = RESP。getWriter(); out.write(om.writeValueAsString(RespBean.ok( "登录成功!" 、HrUtils.getCurrentHrInfo()))); out.flush(); out.close(); } }) .failureHandler(新しいAuthenticationFailureHandler(){ @Override 公共 ボイド onAuthenticationFailureは(HttpServletRequestのREQ、HttpServletResponseのRESP、含むAuthenticationException E)スローにIOException、ServletExceptionが{ (resp.setContentType ";のcharset = UTF-8アプリケーション/ JSONを" ); ObjectMapper OM =新しいObjectMapper(); PrintWriterアウト = resp.getWriter()。 out.write(om.writeValueAsString(RespBean.ok( "登录失败!"、ヌル))); out.flush(); out.close(); } }) .permitAll() .AND() .logout() .logoutUrl( "/ログアウト" ) .permitAll() .AND() .csrf()。無効() 。exceptionHandling()accessDeniedHandler(accessExceptionHandler)。 }
セクションでは、それぞれ着色されています。
1、すべての要求は、それ以外の場合は、学ぶためにアクセスすることはできません許可されています
2、具体的には、認証要求を処理します
3、基本的な構成情報をユーザーがログオン
4、成功または失敗のコールバック関数にログイン
5.ログの物事に対処するための時間
6、アクセス時間の取り扱いも例外ではありません
すべてのブラウザで、4-契約は、URLを提出します
@Component パブリック クラス UrlFilterConfig 実装FilterInvocationSecurityMetadataSource { @Autowired MenuService menuService; @Override パブリックコレクションのgetAttributes(オブジェクトOが)<ConfigAttributeが> スローはIllegalArgumentException { ストリングrequestUrl = ((FilterInvocation)O).getRequestUrl(); //すべての切片URL AntPathMatcher antPathMatcher = 新しい新AntPathMatcher(); // URLを使用してマッチング IF((requestUrl.equalsを"/ login_p" )){// URLはlogin_p傍受、直接リリースは必要ありません開始された場合 、戻り はnullを ; //ログインページには、認証を必要としない場合 } 一覧 <メニュー>メニュー= menuService.getAllMenus(); //クエリのクエリ実行の結果にメニューテーブルの内容、および各項目のメニューとの関係の対応する役割、注意を払うのすべてああ、後方に配置されている ため(メニューメニュー:メニュー){ // メニュー要求URLが中に存在する場合 IF。(antPathMatcher.match(menu.getUrl()、requestUrl)&& menu.getRoles()サイズ()> 0 ){//リクエストURLメニューとメニューが適切な役割持っているURLがある場合は リスト <役割>役割= menu.getRoles(); // URL役割取った int型のサイズを= (roles.sizeを); String []型値 = 新しい新しい文字列[サイズ]; のための(INT I = 0; I <roles.size(); I ++){ //コレクションは、URL内の役割持つべき 値[I] = ; roles.get(I).getName() } 戻り SecurityConfig.createList(値); // URLはそれが次の段階に役割を有する返すべき } } / / リクエストがデータベースに存在しない場合は、URL を返す SecurityConfig.createList(「ROLE_LOGINを」); // URLリクエストがメニューにない場合は、次のステージのROLE_LOGINにメッセージを返すように } @Override パブリックコレクション<ConfigAttributeがある> getAllConfigAttributes( ){ 戻り NULL ; } @Override パブリック ブール <?>支持体(クラスAClassは){ 戻り SecurityConfigを。クラス.isAssignableFrom(AClassは); } }
5本当の特権のように扱われます
@Component パブリック クラス WebAccessDecisionManager 実装AccessDecisionManager { @Override 公共 ボイドが決め(AUTH認証、オブジェクトO、コレクションCAS <ConfigAttributeが>)スローAccessDeniedExceptionを、{InsufficientAuthenticationExceptionれる イテレータは =イテレータ<ConfigAttributeが> cas.iterator(); //反復ビット、ために次のステップ 一方(cas.iterator()のhasNext()){ ConfigAttribute CAは = (iterator.next)を、 文字列needRole = ca.getAttribute(); // アクセスへのパスが存在するが、ログインしていない IF( "ROLE_LOGIN"を.equals(needRole)){ IF(認証instanceofはAnonymousAuthenticationToken){ スロー 新しい新 BadCredentialsException(「未登録」); } リターン; } // ログ、アクセス・パスも存在するが、ためのアクセス権を行うために裁判官に コレクション< ?拡張 GrantedAuthority>当局= auth.getAuthoritiesを(); のために:(GrantedAuthority庁当局){ IF (。authority.getAuthority()のequals(needRoleを)){//あなたができる前に役割がログインされている場合アクセス リターン; } } } スロー 新しい AccessDeniedExceptionを( "访问权限不足" ); } @Override パブリック ブール支持体(ConfigAttribute configAttribute){ 戻り 偽。 } @Override 公共 ブール支援(<?>クラスAClassは){ リターン はfalse ; }
これまでのところ、基本的な[OK]を構築するための総合的なプロジェクト。