李ジボからオフ関連: 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 ClientDetailsService(){ // JDBCベースの実装は、クライアント情報データベースに設定する必要があります 返す新しいJdbcClientDetailsService(データソース()); } @Override 公共ボイド設定(AuthorizationServerEndpointsConfigurerエンドポイント)が例外をスロー{ //设置令牌 endpoints.tokenStore(tokenStore())。 } @Override 公共ボイド設定(ClientDetailsServiceConfigurerクライアント)は例外{スロー //读取客户端配置 clients.withClientDetails(jdbcClientDetailsを())。 } }
認定顧客サービス側:
@Configuration
パブリッククラスUserDetailsServiceConfigurationはUserDetailsService {実装
@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 プライベートUserDetailsServiceConfiguration userDetailsServiceConfigurationと、 @Bean 公共BCryptPasswordEncoder passwordEncoder(){ //设置默认的加密方式 (新BCryptPasswordEncoderを返します)。 } @Bean @Override 公共UserDetailsService userDetailsService(){ userDetailsServiceConfigurationを返します。 } @Override configure保護された(AuthenticationManagerBuilder払い)を無効にすることは例外{スロー //カスタム認証および承認の使用 auth.userDetailsService(userDetailsService()); } @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も記録をカスタマイズすることができます。