0・セキュリティ・フレームワークの構造

1、背景Springboot-Securityのセキュリティフレームワーク

楽屋セキュリティフレームワークを設定されている管理フレームワークで使用する場合、フレームワークの実装プロセスは、ケースです。

ユーザークラスを作成します。

まず、あなたはいくつかのメソッドを実装するためのインターフェイスでインターフェイスUserDetailsを達成したいというユーザークラスを作成し、最も重要なのはにあります

    / * * 
     *収集ユーザーの文字情報、文字情報収集に
     * @return 
     * / 
    @Override 
    パブリックコレクション<GrantedAuthority拡張?> GetAuthorities(){ 

        ArrayListを <GrantedAuthority>当局= 新しい新しいのArrayList <> ();
         のため(ロールロール:ロール){ 
            authorities.add(新しい新しいSimpleGrantedAuthority(role.getName())); 
        } 
        戻り機関を; 
    }

主な方法は、ユーザーの役割の収集情報にあります。

Seriviceで

場合は、クエリのデータベースを介してユーザのログイン名、ユーザーが存在し、ユーザが直接ユーザーに返さ存在する場合は、UsernameNotFoundExceptionをスローしない場合、

1 - 実施形態は、この方法は、主にユーザーのユーザー名とパスワードの検証であるようなものです

    @Override
     保護 ボイド configureは(AuthenticationManagerBuilder AUTH)スロー例外{ 
        auth.userDetailsS​​ervice(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]を構築するための総合的なプロジェクト。

おすすめ

転載: www.cnblogs.com/gfbzs/p/12346898.html
おすすめ