春セキュリティのOAuth2 JDBCベースのストレージおよびRBACトークン認証局

李ジボからオフ関連:   https://funtl.com/zh/spring-security-oauth2/    (紙レコードだけ自分自身の学習記録、それは詳細にはない、あなたは、Liジボをオフに見ることができます)

認証サーバとサーバリソースのpom.xml構成(李ジボのゲストは、私は春のJPAを使用tk.mybatisです)

<依存性> 
    <依存性> 
        <のgroupId> com.zaxxer </のgroupId> 
        <たartifactId> HikariCP </たartifactId> 
    </依存> 
    <依存性> 
        <のgroupId> org.projectlombok </のgroupId> 
        <たartifactId>ロンボク</たartifactId> 
    < /依存> 
    <依存性> 
        <のgroupId> org.springframework.boot </のgroupId> 
        <たartifactId>ばねブートスタータデータJPA </たartifactId> 
    </依存> 
    <依存性> 
        <のgroupId> org.springframework.boot < /のgroupId> 
        <たartifactId>春・ブート・スターター・ウェブ</たartifactId>
    </依存関係> 
    <依存> 
        <groupIdを> org.springframework.cloud </ groupIdを>
        <たartifactId>ばねクラウドスタータのOAuth2 </たartifactId> 
    </依存> 
 
    <依存性> 
        <groupIdを>のMySQL </のgroupId> 
        <たartifactId> MySQLのコネクタからJava </たartifactId> 
        <スコープ>実行</スコープ> 
    < /依存> 
    <依存性> 
        <のgroupId> org.springframework.boot </のgroupId> 
        <たartifactId>ばねブートスタータ試験</たartifactId> 
        <スコープ>テスト</スコープ> 
        <除外> 
            <除外> 
                <のgroupId> ORG .junit.vintage </のgroupId> 
                <たartifactId> JUnitのヴィンテージエンジン</たartifactId>
            </除外> 
        </除外> 
    </依存関係> 
</依存関係>

認証サーバ: 

apllication.yml:

サーバー:
  ポート:9999 
春:
  データソース:
    ドライバー・クラス名:com.mysql.cj.jdbc.Driverの
    URL:(独自のデータベース)
    のユーザー名:(アカウント)
    パスワード:(パスワード)
    ひかり:
      最小-IDLE:5 
      IDLE-タイムアウト:600000 
      最大プールサイズ:10 
      自動コミット:trueに
      MyHikariCP:プール名
      のmax-寿命:1800000 
      接続タイムアウト:30000 
      接続テスト-クエリ:SELECT 1

     認証サーバの設定:

認定顧客サービス側:

@Configuration 
@EnableAuthorizationServer 
パブリッククラスAuthorizationServerConfiguration AuthorizationServerConfigurerAdapter {延び
    @Bean 
    @Primary 
    @ConfigurationProperties(接頭辞=「spring.datasource」)
    公衆データソースデータソース(){ 
        //構成データソース(HikariCP接続プールが使用されている)、または複数の注釈データが指定されますソースは、別段の競合がある
        戻りDataSourceBuilder.create()ビルド();. 
    } 
    @Bean 
    公共tokenStore tokenStore(){ 
        // JDBCベースの実装は、トークンに保存されたデータは
        、新しい新しいJdbcTokenStore(データソース())を返す
    } 

    @Bean 
    公開jdbcClientDetails ClientDetailsS​​ervice(){ 
        // JDBCベースの実装は、クライアント情報データベースに設定する必要があります
        返す新しいJdbcClientDetailsS​​ervice(データソース()); 
    } 

    @Override 
    公共ボイド設定(AuthorizationServerEndpointsConfigurerエンドポイント)が例外をスロー{ 
        //设置令牌
        endpoints.tokenStore(tokenStore())。
    } 
    @Override 
    公共ボイド設定(ClientDetailsS​​erviceConfigurerクライアント)は例外{スロー
        //读取客户端配置
        clients.withClientDetails(jdbcClientDetailsを())。
    } 
}

認定顧客サービス側:

@Configuration 
パブリッククラスUserDetailsS​​erviceConfigurationはUserDetailsS​​ervice {実装
@Autowired
プライベートTbUserService tbUserServiceを。
@Autowired
プライベートTbPermissionService tbPermissionService。
@Override
公共UserDetails loadUserByUsername(文字列名)がUsernameNotFoundException {スロー
TbUser tbUser = tbUserService.findByUsername(ユーザ名)
一覧<GrantedAuthority> grantedAuthorities =新しいArrayListを<>();
(もし!tbUser = NULL){
//获取用户授权
一覧<TbPermission> tbPermissions = tbPermissionService.selectByUserId(tbUser.getId());
//声明用户授权
tbPermissions.forEach(tbPermission - > {
IF(tbPermission = NULL && tbPermission.getEnname()= NULL){!
GrantedAuthority grantedAuthority =新しいSimpleGrantedAuthority(tbPermission.getEnname());
grantedAuthorities.add(grantedAuthority);
}
})。
}

新しいユーザー(tbUser.getUsername()、tbUser.getPassword()、grantedAuthorities)を返します。

}
}

セキュリティの構成:

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = TRUEは、=真securedEnabled、jsr250Enabled =真)
パブリッククラスWebSecurityConfigurationはWebSecurityConfigurerAdapter {延び
    @Autowired 
    プライベートUserDetailsS​​erviceConfiguration userDetailsS​​erviceConfigurationと、
    @Bean 
    公共BCryptPasswordEncoder passwordEncoder(){ 
        //设置默认的加密方式
        (新BCryptPasswordEncoderを返します)。
    } 
    @Bean 
    @Override 
    公共UserDetailsS​​ervice userDetailsS​​ervice(){ 
        userDetailsS​​erviceConfigurationを返します。
    } 
    @Override
    configure保護された(AuthenticationManagerBuilder払い)を無効にすることは例外{スロー
        //カスタム認証および承認の使用
        auth.userDetailsS​​ervice(userDetailsS​​ervice()); 
    } 
    @Override 
    ます。public voidのconfigure(WebSecurity社のWebする){ 
        // check_tokenタイムズそうでない場合はアクセスサーバーのリソースに公開されます403エラー
        web.ignoring()antMatchers( "/のOAuth / check_token");. 
    } 
}

 ユーザー情報と権利情報とコードのディレクトリを取得します:

@Repository 
パブリックインターフェイスTbPermissionRepositoryはJpaRepository <TbPermission、ロング> {延び
    @query(値= "SELECT \ n" + 
            "Pを。* \ n" + 
            + "\ nは" 
            + "tb_user uが\ nは" 
            "LEFTはtb_user_roleをJOIN UR \ n "+ AS 
            ON "u.id = ur.user_id \ n" + 
            "LEFTは、R \ n" + AS tb_role JOIN 
            ON "r.id = ur.role_id \ n" + 
            " LEFTは、RPの\ nとしてtb_role_permissionをJOIN "+ 
            " r.id = rp.role_id \ ONのn」+ 
            "LEFTは、pする\ n" + AS tb_permissionを登録しよう
            "N p.id = rp.permission_id \ ON"+ 
            "WHERE u.id =?1"、nativeQuery =真)
    公共の一覧<TbPermission> selectByUserId(ロングID); 
}
@Repository 
パブリックインターフェイスTbUserRepositoryはJpaRepository <TbUser、ロング> {延び
    @query(値=、nativeQuery = TRUE "?tb_userここでユーザー名= 1 SELECT * FROM")
    公衆TbUser findByUsername(文字列名)。
}
@Service 
パブリッククラスTbPermissionService { 
    @Autowired 
    、プライベートTbPermissionRepository tbPermissionRepositoryを 
    公衆リスト<TbPermission> selectByUserId(ロングID){ 
        リスト<TbPermission> tbPermissions = tbPermissionRepository.selectByUserId(ID)。
        tbPermissionsを返します。
    } 
}
@Service 
パブリッククラスTbUserService { 
    @Autowired 
    、プライベートTbUserRepository tbUserRepositoryを 
    公共TbUser findByUsername(文字列名){ 
        TbUser byUsername = tbUserRepository.findByUsername(ユーザ名)。
        byUsernameを返します。
    } 
}

Kefuduan表:oauth_client_details

 

 

取得コード要求アドレス(GETリクエスト):  http://{you ip}:{you port}/oauth/authorize?client_id=client&response_type=code (client_id为上图中的client_id,成功之后会回调url 为上面的web_server_redicrct_uri)

アドレストークン要求(POSTリクエスト:)取得HTTP://クライアント:秘密のあなた@ {IP}:{ポート}あなたが/のOAuth /トークンパラメータ運ぶ:grant_type(上図のauthorization_grant_type)コードを(上のコードでは、返さ)

リソースサーバー:

application.yml:

 

サーバー:
  ポート:10000 
春:
  データソース:
    ドライバー・クラス名:com.mysql.cj.jdbc.Driverの
    URL:(自己的数据库)
    ユーザー名:(账号)
    パスワード:(密码)
    ひかり:
      最小-アイドル:5 
      idle-タイムアウト:600000 
      最大プールサイズ:10 
      自動コミット:真の
      プール名:MyHikariCP 
      MAX-寿命:1800000 
      接続タイムアウト:30000 
      接続テストクエリ:1つのSELECT 
:セキュリティ
  のOAuth2:
    クライアント:
      クライアントID:クライアントの
      クライアントを-secret:秘密の
      アクセストークン-URIます。http:// localhost:9999 /にOAuth /トークン
      ユーザー認証-URIます。http:// localhost:9999 /にOAuth /認可
    リソース:
      トークン情報-URIます。http:// localhost:9999 /にOAuth / check_token

 

リソースサーバーは、通常のCRUDとドッキングのOAuth2認証と認可サーバであります

@Configuration 
@EnableResourceServer 
@EnableGlobalMethodSecurity(= trueにsecuredEnabled =、= jsr250Enabled真に、trueにprePostEnabled)
パブリッククラス延びResourceServerConfigurerAdapter {ResourceServerConfiguration 
    @Override 
    公共ボイド構成は、(HttpSecurity HTTP)例外{スロー
        HTTP 
                .exceptionHandling()
                .AND()
                .sessionManagementを() .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .ANDは()
                .authorizeRequests()
                //以下のパスを保護するために必要な資源と権限の割り当てで、あなたは、認可および認証サーバの対応する部分を設定する必要があります
                .antMatchers(「/」)。hasAuthority (「システム「)
                .antMatchers( "/ビュー/ **")。hasAuthority( "SystemContentView")
                .antMatchers( "/挿入/ **")。hasAuthority( "SystemContentInsert")
                .antMatchers( "/更新/ **")。hasAuthority( "SystemContentUpdate")
                .antMatchers( "/削除/ **")hasAuthority( "SystemContentDelete")。
    } 
}

  

SQLデータベース関連の文:

JDBCストレージトークン:

CREATE TABLEの`clientdetails`(
  ` appId`のVARCHAR(128)NOT NULL、
  `resourceIds`のVARCHAR(256)のDEFAULT NULL、
  ` appSecret`のVARCHAR(256)のDEFAULT NULL、
  `scope`のVARCHAR(256)のDEFAULT NULL、
  ` grantTypes` VARCHAR (256)デフォルトNULL、
  `redirectUrl`のVARCHAR(256)は、デフォルトのNULL、
  ` authorities`のVARCHAR(256)は、デフォルトのNULL、
  `access_token_validity`はint(11)は、デフォルトのNULL、
  ` refresh_token_validity`はint(11)は、デフォルトのNULL、
  `additionalInformation` VARCHAR (4096)は、デフォルトのNULL、
  `autoApproveScopes`のVARCHAR(256)は、デフォルトのNULL、
  PRIMARY KEY(` appId`)
)ENGINE = InnoDBのデフォルトの文字セット= UTF8。

CREATE TABLEの`oauth_access_token`(
  ` token_id` VARCHAR(256)のDEFAULT NULL
  `token`ブロブ、
  ` authentication_id`のVARCHAR(128)、NOT NULL、
  `user_name`のVARCHAR(256)は、デフォルトのNULL、
  ` client_id`のVARCHAR(256)は、デフォルトのNULL、
  `authentication`ブロブ、
  ` refresh_token`のVARCHAR(256)デフォルトNULL、
  PRIMARY KEY( `authentication_id`)
)ENGINE = InnoDBのデフォルトの文字セット= UTF8。

`oauth_approvals`(CREATE TABLEを
  ` userId`のVARCHAR(256)は、デフォルトのNULL、
  `clientId`のVARCHAR(256)は、デフォルトのNULL、
  ` scope`のVARCHAR(256)は、デフォルトのNULL、
  `status`のVARCHAR(10)は、デフォルトのNULL、
  ` expiresAt`タイムスタンプNULLデフォルトNULL、
  `lastModifiedAt`タイムスタンプNULLデフォルトNULL 
)ENGINE = InnoDBのデフォルトの文字セット= UTF8。

(TABLE `oauth_client_details`をCREATE
  `client_id`のVARCHAR(128)NOT NULL、
  ` resource_ids`のVARCHAR(256)は、デフォルトのNULL、
  `client_secret`のVARCHAR(256)は、デフォルトのNULL、
  ` scope`のVARCHAR(256)は、デフォルトのNULL、
  `authorized_grant_types`のVARCHAR(256)デフォルトNULL、
  `web_server_redirect_uri`のVARCHAR(256)は、デフォルトのNULL、
  ` authorities`のVARCHAR(256)は、デフォルトのNULL、
  `access_token_validity`はint(11)は、デフォルトのNULL、
  ` refresh_token_validity`はint(11)は、デフォルトのNULL、
  `additional_information` VARCHAR(4096)デフォルトNULL、
  `autoapprove`のVARCHAR(256)は、デフォルトのNULL、
  PRIMARY KEY(` client_id`)
)ENGINE = InnoDBのデフォルトの文字セット= UTF8。

CREATE TABLEの`oauth_client_token`(
  ` token_id` VARCHAR(256)のDEFAULT NULL
  `token`ブロブ、
  ` authentication_id`のVARCHAR(128)NOT NULL、
  `user_name`のVARCHAR(256)は、デフォルトのNULL、
  ` client_id`のVARCHAR(256)は、デフォルトのNULL、
  PRIMARY KEY( `authentication_id`)
)ENGINE =のInnoDB DEFAULT CHARSET = UTF8 ; 

表`oauth_code`(CREATE 
  ` code`のVARCHAR(256)は、デフォルトのNULL、
  `authentication`ブロブ
)ENGINE = InnoDBのデフォルトの文字セット= UTF8と、

CREATE TABLEを`oauth_refresh_token`(
  ` token_id` VARCHAR(256)は、デフォルトのNULL、
  `token`ブロブ、
  ` authentication`ブロブ
)ENGINE = InnoDBのデフォルトの文字セット= UTF8。

RBAC:

CREATE(tb_permission` TABLE ` 
  ` BIGINT id`(20)とAUTO_INCREMENT NOT NULL、
  BIGINT parent_id` `(20です)COMMENT DEFAULT NULLの親権'、
  ` name`のVARCHAR(64)COMMENT NOT NULL '特権名'、
  `enname` VARCHAR(64)NOT NULL COMMENT者の権利の英語名'、
  `url` VARCHAR(255)COMMENT NOT NULL '許可パス'、
  ` description` VARCHAR(200は)DEFAULT NULLの'備考' COMMENT、
  `created`日時NOT NULL、
  `日時、NOT NULL updated`、
  PRIMARY KEY( `id`)
)= 44がAUTO_INCREMENT InnoDBエンジン= DEFAULT CHARSETがある= UTF8 COMMENT = '許可テーブル'; 
INSERT INTOのtb_permission``(` id`、parent_id``、 `name`の、` enname`、url` `` description`、created` `` updated`)の値
(37.0、 '管理システム'、 'システム'、 '/ '、NULL、「2019年4月4日午前23時22分:54' 、 '2019年4月4日23時22分56秒')、
(38、37、 'ユーザー・マネージャ'、 'SystemUser'、 '/ユーザ/'、NULL、 '2019年4月4日午後十一時25分31秒'、 '2019年4月4日夜十一時25分33秒')、 39および38、 '表示するユーザ'、 'SystemUserView'、 ''、NULL、 '2019年4月4日午前15時30分30秒'、 '2019年4月4日午後三時30分43秒')、
(40,38、 '新規ユーザー'、 'SystemUserInsert'、 ' ' NULL、' 2019年4月4日夜3時30分31秒'、」2019年4月4日午後03時30分44秒')、
(41,38'編集ユーザー'' SystemUserUpdate '' 'NULL、' 2019年4月4日午後03時30分32秒'' 2019年4月4日午前15時30分45秒')、
(42,38、'ユーザを削除する'' SystemUserDelete '' 'NULL、' 2019年4月4日夜三時30分48秒'' 2019年4月4日15時30分45秒「); 

`表tb_role`を作成する(
  ` BIGINT id`(20)とAUTO_INCREMENT NOT NULL 、
  `parent_id` BIGINT(20)DEFAULT NULLがCOMMENT '親の役割'
  `name`のVARCHAR(64)NOT NULL COMMENT ' ロール名'、
  ` enname` VARCHAR(64)NOT NULL COMMENTの役割英語名'、
  `description` VARCHAR(200)NULL DEFAULT COMMENTは、 '備考'
  `created`日時NULL NOT、
  ` updated`日時、NOT NULL、
  PRIMARY KEY( `id`)
)ENGINE = InnoDBのAUTO_INCREMENT = 38デフォルトの文字セット= UTF8コメント= '角色表'。
`tb_role`(` id`、 `parent_id`、` NAME`、 `enname`、` description`、 `created`、` updated`)値を挿入
(37.0 '超级管理员'、 '管理'、 NULL、 '2019年4月4日午後十一時22分03秒'、 '2019年4月4日23時22分05秒'); 

表`tb_role_permission`(CREATE 
  ` id` BIGINT(20)NOT NULL AUTO_INCREMENT、
  `role_id` BIGINT(20)NOT NULL COMMENT '角色ID'、
  'permission_id` BIGINT(20)NOT NULL COMMENT '权限ID'、
  PRIMARY KEYを( `id`)
)ENGINE = InnoDBのAUTO_INCREMENT = 43デフォルトの文字セット= UTF8コメント= '角色权限表'。
tb_role_permission` `挿入(` id`、 `role_id`、
(37,37,37)、
(38,37,38)、
(39,37,39)、
(40,37,40)、
(41,37,41)、
(42,37,42)。

`tb_user`(CREATE TABLEを
  ` id` BIGINT(20)NOT NULL AUTO_INCREMENT、
  `username`のVARCHAR(50)NOT NULL COMMENT '用户名'、
  'password` VARCHAR(64)NOT NULL COMMENT '密码、加密存储'、
  ` phone`のVARCHAR(20)DEFAULT NULLがCOMMENT '注册手机号'、
  `email`のVARCHAR(50)DEFAULT NULLがCOMMENT '注册邮箱'、
  ` created`日時、NOT NULL、
  `updated`日時NOT NULL、
  PRIMARY KEY(` id` )
  、BTREEを用いUNIQUE KEY `username`(` username`)
  UNIQUE KEY `phone`(` phone`)BTREEを使用して、
  UNIQUE KEY `email`(` email`)を用いBTREE
)ENGINE = InnoDBのAUTO_INCREMENT = 38デフォルトの文字セット= UTF8コメント= '用户表'。
`tb_user`(` id`、 `username`、` password`、 `phone`、` email`、 `created`、` updated`)の値に挿入
(37 '管理'、 '$ 2A $ 10 $ 9ZhDOBp.sRKat4l14ygu /.LscxrMUcDAfeVOEPiYwbcRkoB09gCmi','15888888888','[email protected]','2019-04-04 23時21分27'秒、 '2019年4月4日午前23時21分29秒'); 

(表`tb_user_role`をCREATE 
  id` BIGINT(20)NOT NULL AUTO_INCREMENT、` 
  `user_id` BIGINT(20)NOT NULL COMMENT '用户ID'、
  'role_id` BIGINT(20)NOT NULL COMMENT '角色ID'、
  PRIMARY KEY( `id`)
)ENGINE = InnoDBのAUTO_INCREMENT = 38デフォルトの文字セット= UTF8コメント= '用户角色表'。
`tb_user_role`(` id`、 `user_id`、` role_id`)値を挿入
(37,37,37)。

 Kefuduan表には、カスタム・テーブルのレコードを追加することができ、関連RBACも記録をカスタマイズすることができます。

おすすめ

転載: www.cnblogs.com/zsifan/p/11745712.html