はじめに:
とき機密情報のデータベース・ビュー、動的なクエリWebインタフェースの脱感作を使用してください。
標的:ウェブユーザーは管理者の役割である場合は、ユーザ情報照会インターフェースのためのインターフェース、機密情報へのユーザ戻る(ID、名前、電話番号[敏感]、ID番号[敏感])は、クエリは、テキスト形式でユーザー情報を返しますユーザーは、一般的なユーザー情報がある場合は、クエリは、脱感作後のユーザ情報を返します。
具体的な手順:
MySQLのユーザー情報ではまず、新しいテーブル、およびいくつかのデータを追加します
第二に、テーブルのビューを作成する減感作マスキング技術、携帯電話や脱感作フィールドによって解除されたid_cardです
作成 ビュー user_info_viewをとして 選択 ID、名前、連結(左(電話、3)、' **** '、右(電話、3))のような電話、連結(左(電話、4)、「***** ********* 」)として id_card から USER_INFO。
三、SpringBootプロジェクトは、設定ファイルでは、2つの役割adminと通常のメモリを追加し、SpringSecurityを有効にすると、新しいアカウント
パッケージEleven.config; 輸入org.springframework.context.annotation.Bean。 輸入org.springframework.context.annotation.Configuration。 輸入org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder。 輸入org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity。 輸入org.springframework.security.config.annotation.web.builders.HttpSecurity。 輸入org.springframework.security.config.annotation.web.configuration.EnableWebSecurity。 輸入org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter。 インポートorg.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 輸入org.springframework.security.crypto.password.PasswordEncoder。 @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = 真) パブリック クラス WebSecurityConfigが延びWebSecurityConfigurerAdapter { @Bean 公共PasswordEncoder passwordEncoderを(){ 戻り 新しい)(BCryptPasswordEncoderします。 } @Overrideは、 保護された ボイド設定(AuthenticationManagerBuilderのAUTH)をスロー例外{ 。auth.inMemoryAuthentication()withUser( "管理")パスワードロール( "ADMIN。"(PasswordEncoder()( "123456")をコードする。) ) 。auth.inMemoryAuthentication()withUser( "ユーザ")パスワード(PasswordEncoder ().encode( "123456"))の役割( "ノーマル。" ); } @Overrideは、 保護された 無効の設定(HttpSecurity HTTP)は、スロー例外{ http.authorizeRequests()が// 必要はありませんが保護されるURLを、保護される必要があるかを定義 .antMatchers( "ログイン/")。permitAll()// 誰もがログインページにアクセスできるように設定 .anyRequestを()。認証() // ログイン後にすべての要求、 。そして() 。.formLogin()loginPage("/ログイン" ) ; } }
第四に、ドメインクラスを作成するのUserInfo
パッケージEleven.domain; パブリック クラスのUserInfo { プライベート 長いID。 プライベート文字列名; プライベート文字列電話。 プライベート文字列のid_card。 公衆 ロングのgetId(){ 戻りID。 } 公共 ボイド SETID(長いID){ この .ID = ID。 } パブリック文字列のgetName(){ 戻り名。 } 公共 ボイドのsetName(文字列名){ この .nameの=名; } パブリック文字列getPhone(){ リターン電話。 } 公共 ボイドsetPhone(文字電話){ このドットフォン= 電話; } パブリック文字列getId_card(){ 戻りid_card。 } 公共 ボイドsetId_card(文字列id_card){ この .id_card = id_card。 } }
第五に、脱感作ビュー後に元のテーブルまたはクエリの異なる役割を区別するためにマッパー、データベースにアクセスするためのインターフェース、2つのクエリメソッドを作成します
パッケージEleven.mapper; インポートEleven.domain.UserInfo; インポート org.apache.ibatis.annotations *。; @Mapper パブリック インターフェイスUserMapper { // テキスト形式でユーザー名の問い合わせ、元のテーブル、機密情報 @Select(「選択* WHERE NAME =から#1 USER_INFO {名} " ) のUserInfo findByName(文字列名); // ユーザ名クエリ、クエリテーブルビュー減感は、機密情報の脱感作が表示 @Selectは、(" user_info_view SELECT * FROM場所名=# 名前} { " ) のUserInfo findByNameSec(文字列名); }
六個のImplをファイルと作成サービス
パッケージEleven.service; 輸入Eleven.domain.UserInfo; パブリック インターフェースUserServiceの{ パブリック(文字列名)を検索ユーザー情報。 公共のUserInfo findSec(文字列名)。 }
パッケージEleven.impl; 輸入Eleven.domain.UserInfo; 輸入Eleven.mapper.UserMapper; 輸入Eleven.service.UserService。 輸入org.springframework.beans.factory.annotation.Autowired; 輸入org.springframework.stereotype.Service。 @Service パブリック クラス UserServiceImplは実装UserServiceの{ @Autowired プライベートUserMapper userMapperを。 @Override 公共 {(文字列名)を見つけるのUserInfo を返す(名前)userMapper.findByNameを。 } 公共 のUserInfo findSec(文字列名){ 返すuserMapper.findByNameSec(名); } }
七、脱感作のビューでSQLを実行するための一般ユーザ、最終的には元のデータベーステーブルの管理ユーザーにSQLクエリを実行し、ログオンしてますユーザーの役割、異なる機能のサービスコールでさまざまな役割、で取得要求コントローラファイルを作成しますお問い合わせ
パッケージEleven.controller; 輸入Eleven.domain.User。 輸入Eleven.domain.UserInfo; 輸入Eleven.service.UserService。 輸入org.springframework.beans.factory.annotation.Autowired; 輸入org.springframework.security.core.Authentication。 輸入org.springframework.security.core.context.SecurityContextHolder。 輸入org.springframework.web.bind.annotation.GetMapping。 輸入org.springframework.web.bind.annotation.RestController。 @RestController パブリック クラスUserControllerで{ @Autowired プライベートUserServiceのUserServiceのを。 (@GetMapping「/ findByName」) パブリックオブジェクトfindByName(文字列名){ / ** *ログオン取得し、ユーザの役割、異なる機能のサービスコールに異なる役割は、最終的に別のSQLクエリを実行 * / 認証AUTH = SecurityContextHolder.getContext( ).getAuthentication(); IF(auth.getAuthorities()のtoString()に等しい( "[ROLE_ADMIN]。" )){ のUserInfoユーザー情報 = userService.find(名前); 戻りユーザー情報を; } そう IF(auth.getAuthorities() .toString()。等号( "[ROLE_normal]" )){ のUserInfoユーザー情報 =userService.findSec(名); 返すのUserInfoを。 } 他{ 戻りauth.getAuthoritiesを()toString()を。 } } }
八、テストおよび認定
1、アクセスSpringBootのWEBは、ログインページを入力します。
図2は、以下に示すように管理者、情報問合せインタフェースへのユーザアクセスを使用して、ユーザがログインした後に、平文のユーザ情報を返します
図3に示すように、ユーザのログインアクセスを使用して、通常のユーザは、示されるように、ユーザ情報は、脱感作後に返されます
本番環境では、Webアプリケーションのための脱感作の動的なビューを達成するためのデータベース技術を使用して、ユーザーが脱感作の役割の前と後にクエリ結果を返すことができます。しかし、すべての機密データテーブルはビュー、データベースによって占められ、余分なストレージスペースを生成するために必要とされ、目標を達成するために、開発者は、追加の開発努力が必要です。