スプリングセキュリティ、角度、およびMySQL
12689 ワード
OAuth 2.0 業界標準認証プロトコルです.Webアプリケーション、デスクトップアプリケーション、携帯電話、およびリビングルームデバイスの特定の承認フローを提供しながらOAuth 2.0クライアントの開発者のシンプルさに焦点を当て.このブログ記事では、OutS 2認証の実装について説明します.
OAuth役割
リソースオーナー クライアント リソースサーバ 認証サーバ
リソースオーナーは、アプリケーションに自分のアカウントにアクセスする権限を付与するユーザーです.ユーザーのアカウントへのアプリケーションのアクセスは、許可された許可の“スコープ”(例えば、読み取りまたは書き込みアクセス)に制限されます.
リソースサーバーは、保護されたユーザーアカウントをホストし、認証サーバーはユーザーのアイデンティティを検証し、アプリケーションにアクセストークンを発行します.
クライアントは、ユーザーのアカウントにアクセスしたいアプリケーションです.そうする前に、それはユーザによって認可されなければなりません、そして、承認はAPIによって有効にされなければなりません.
ワークフロー
ユーザーはhttp://localhost:4200 データと角度にアクセスするには ユーザーが資格情報を入力し、ログインをクリック 角度は、それらの資格情報を送りますhttps://localhost:8090/oauth/token そして、OAuth 2を使用しているスプリングセキュリティは彼を認証しようとします 資格情報が有効な場合は、次の応答を返します.と無効な資格情報は、エラーメッセージと同じページに彼を保持します
角度が応答を受け取るならば、それは彼をホームページにリダイレクトします.彼は役割に基づいてカテゴリ、注文などにアクセスできます.
スプリングブート2X スプリングセキュリティ2X OAuS 2 MySQLデータベース 角度8 MyAuthデータベースにOAuthトークンを格納する次の表を作成する
SPring - Security - OAuth 2 - Readクライアント(許可されているグラントの種類:読み込み) SPring - SecurityOAuS 2 - Read Write - Client (許可されているグラントの種類: read , write ) に移動website そして、パスワードとしてSPring - SecurityOAuS 2 - Read - Write - Client - Password 1234を入力して、暗号化されたパスワードを得てください.次のSQLクエリで暗号化されたパスワードフィールドをBcryptパスワードで置き換えてください.
OAuth 2 AuthorizationServerConfig.ジャバ
5 .定義
8 .定義
9 .定義
定義サービス
12章定義
14 .ユーザー、ロール、および特権テーブルに次のユーザーデータを挿入します.に移動website パスワードとして管理者を入力し、12としてのラウンドと暗号化されたパスワードをコピーします.次のSQLクエリで暗号化されたパスワードフィールドをBcryptパスワードで置き換えてください.
18 .カテゴリをクリックしてカテゴリ一覧を表示する
からダウンロードGithub
OAuth役割
OAuthは4つのロールを定義します:
リソース所有者:ユーザ
リソースオーナーは、アプリケーションに自分のアカウントにアクセスする権限を付与するユーザーです.ユーザーのアカウントへのアプリケーションのアクセスは、許可された許可の“スコープ”(例えば、読み取りまたは書き込みアクセス)に制限されます.
リソース/認証サーバ: API
リソースサーバーは、保護されたユーザーアカウントをホストし、認証サーバーはユーザーのアイデンティティを検証し、アプリケーションにアクセストークンを発行します.
クライアントアプリケーション
クライアントは、ユーザーのアカウントにアクセスしたいアプリケーションです.そうする前に、それはユーザによって認可されなければなりません、そして、承認はAPIによって有効にされなければなりません.
ワークフロー
次の図はプロセスを説明します
OAuth 2ワークフロー
{"access\_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3","token\_type":"bearer","expires\_in":3600,"refresh\_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk","scope":"create"}
次に、角度は別のリクエストを使用しますaccess_token
ユーザ情報を取得するには角度が応答を受け取るならば、それは彼をホームページにリダイレクトします.彼は役割に基づいてカテゴリ、注文などにアクセスできます.
技術
セットアップ命令
drop table if exists oauth\_client\_details;
create table oauth\_client\_details (
client\_id VARCHAR(255) PRIMARY KEY,
resource\_ids VARCHAR(255),
client\_secret VARCHAR(255),
scope VARCHAR(255),
authorized\_grant\_types VARCHAR(255),
web\_server\_redirect\_uri VARCHAR(255),
authorities VARCHAR(255),
access\_token\_validity INTEGER,
refresh\_token\_validity INTEGER,
additional\_information VARCHAR(4096),
autoapprove VARCHAR(255)
);
drop table if exists oauth\_client\_token;
create table oauth\_client\_token (
token\_id VARCHAR(255),
token LONG VARBINARY,
authentication\_id VARCHAR(255) PRIMARY KEY,
user\_name VARCHAR(255),
client\_id VARCHAR(255)
);
drop table if exists oauth\_access\_token;
create table oauth\_access\_token (
token\_id VARCHAR(255),
token LONG VARBINARY,
authentication\_id VARCHAR(255) PRIMARY KEY,
user\_name VARCHAR(255),
client\_id VARCHAR(255),
authentication LONG VARBINARY,
refresh\_token VARCHAR(255)
);
drop table if exists oauth\_refresh\_token;
create table oauth\_refresh\_token (
token\_id VARCHAR(255),
token LONG VARBINARY,
authentication LONG VARBINARY
);
drop table if exists oauth\_code;
create table oauth\_code (
code VARCHAR(255), authentication LONG VARBINARY
);
SET SQL\_MODE='ALLOW\_INVALID\_DATES';
drop table if exists oauth\_approvals;
create table oauth\_approvals (
userId VARCHAR(255),
clientId VARCHAR(255),
scope VARCHAR(255),
status VARCHAR(10),
expiresAt TIMESTAMP,
lastModifiedAt TIMESTAMP
);
drop table if exists ClientDetails;
create table ClientDetails (
appId VARCHAR(255) PRIMARY KEY,
resourceIds VARCHAR(255),
appSecret VARCHAR(255),
scope VARCHAR(255),
grantTypes VARCHAR(255),
redirectUrl VARCHAR(255),
authorities VARCHAR(255),
access\_token\_validity INTEGER,
refresh\_token\_validity INTEGER,
additionalInformation VARCHAR(4096),
autoApproveScopes VARCHAR(255)
);
2 .リソースサーバを呼び出しましょうresource-server-rest-api
つのクライアントを定義します.クライアントの秘密は4ラウンドでbcryptで暗号化.INSERT INTO OAUTH\_CLIENT\_DETAILS(CLIENT\_ID, RESOURCE\_IDS, CLIENT\_SECRET, SCOPE, AUTHORIZED\_GRANT\_TYPES, AUTHORITIES, ACCESS\_TOKEN\_VALIDITY, REFRESH\_TOKEN\_VALIDITY) VALUES ('spring-security-oauth2-read-client', 'resource-server-rest-api','Encrypted Password','read', 'password,authorization\_code,refresh\_token,implicit', 'USER', 10800, 2592000);INSERT INTO OAUTH\_CLIENT\_DETAILS(CLIENT\_ID, RESOURCE\_IDS, CLIENT\_SECRET, SCOPE, AUTHORIZED\_GRANT\_TYPES, AUTHORITIES, ACCESS\_TOKEN\_VALIDITY, REFRESH\_TOKEN\_VALIDITY) VALUES ('spring-security-oauth2-read-write-client', 'resource-server-rest-api','Encrypted Password','read,write', 'password,authorization\_code,refresh\_token,implicit', 'USER', 10800, 2592000);
3 .ユーザリクエストを許可するOAuth 2 AuthorizationServerを作成します.クラスAuthorizationServerConfig
延長すべきAuthorizationServerConfigurerAdapter
オーバーライドconfigure()
メソッド.tokenStore()
Beanを設定するconfigure(AuthorizationServerEndpointsConfigurer endpoints)
メソッドの終了点は、TokenStore、AuthenticationManager、およびUserDetailsServiceと共にポイントしますconfigure(AuthorizationServerSecurityConfigurer oauthServer)
メソッドは、アクセストークンとクライアントパスワードの暗号化アルゴリズムを設定します.configure(ClientDetailsServiceConfigurer clients)
methodクライアントのデータソースを設定する@Configuration
@EnableAuthorizationServer
@Import(SecurityConfig.class)
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter
{
private final AuthenticationManager authenticationManager;
@Qualifier("dataSource")
private final DataSource dataSource;
private final MyUserDetailsService myUserDetailsService;
private final PasswordEncoder oauthClientPasswordEncoder;
@Autowired
public OAuth2AuthorizationServerConfig(AuthenticationManager authenticationManager, DataSource dataSource, MyUserDetailsService myUserDetailsService, @Qualifier("oauthClientPasswordEncoder") PasswordEncoder oauthClientPasswordEncoder)
{
this.authenticationManager \= authenticationManager;
this.dataSource \= dataSource;
this.myUserDetailsService \= myUserDetailsService;
this.oauthClientPasswordEncoder \= oauthClientPasswordEncoder;
}
@Bean
public OAuth2AccessDeniedHandler oauthAccessDeniedHandler()
{
return new OAuth2AccessDeniedHandler();
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer)
{
oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()").passwordEncoder(oauthClientPasswordEncoder);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception
{
clients.jdbc(dataSource);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
{
endpoints.tokenStore(tokenStore()).authenticationManager(authenticationManager).userDetailsService(myUserDetailsService);
}
@Bean
public TokenStore tokenStore()
{
return new JdbcTokenStore(dataSource);
}
}
4 .SecurityConfig
クラスは、役割と特権を構成することができるprringsecurityでアプリケーションを守ります5 .定義
OAuth2CorsFilter
SecurityConfigのbeanとconfigure()
以下に示す方法.これは、基本認証の前にOAuth@Override
public void configure(HttpSecurity http) throws Exception
{
http.addFilterBefore(oAuth2CorsFilter, BasicAuthenticationFilter.class);
/\*Standard Spring Security config
\*/
...............................
}
リソースサーバはクライアントによって送られたリクエストを受け取り、認証サーバにトークンを検証するよう要求します.定義するOAuth2ResourceServerConfig
注釈付きリソースサーバとして機能するクラスEnableResourceServer
.@Configuration
@EnableResourceServer
public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter
{
@Override
public void configure(ResourceServerSecurityConfigurer resources)
{
resources.resourceId(ResourceConstants._RESOURCE\_SERVER\_REST\_API_);
}
}
7 .定義MethodSecurityConfig
拡張クラスGlobalMethodSecurityConfiguration
コントローラのメソッドの上にスプリングセキュリティ注釈を使用するのに役立つクラス8 .定義
OAuth2CorsFilter
, PasswordEncoders
コードベースに示すクラス9 .定義
MyUserDetails
スプリングセキュリティコアを拡張するクラスUserDetails
クラス定義サービス
MyUserDetailsService
これは、春のセキュリティインターフェイスを実装UserDetailsService
11 .定義CustomDaoAuthenticationProvider
認証するクラスはデータベースのユーザ名とパスワードに対する資格情報を提供しました.12章定義
CustomAuthenticationSuccessHandler
クラスとオーバーライドonAuthenticationSuccess()
メソッドは、認証成功後に行われるアクションを指定し、同様の方法で他のクラスを実装しますUsersAccessDecisionManager
, CustomAuthenticationFailureHandler
and CustomLogoutSuccessHandler
13章クローンGitHub repository アプリケーションを実行します.これはユーザ、ロール、特権などの必要なテーブルを作成します.14 .ユーザー、ロール、および特権テーブルに次のユーザーデータを挿入します.に移動website パスワードとして管理者を入力し、12としてのラウンドと暗号化されたパスワードをコピーします.次のSQLクエリで暗号化されたパスワードフィールドをBcryptパスワードで置き換えてください.
/\* Insert Data into User Table \*/
INSERT INTO springsessiondemo.user VALUES(1,1,1,1,1,'Encrypted Password','admin');
INSERT INTO springsessiondemo.user VALUES(2,1,1,1,1,'Encrypted Password','user');
/\* Insert Data into Role Table \*/
insert into springsessiondemo.role values(1,'ROLE\_USER');
insert into springsessiondemo.role values(2,'ROLE\_ADMIN');
insert into springsessiondemo.role values(3,'ROLE\_APIUSER');
insert into springsessiondemo.role values(4,'ROLE\_DBA');
insert into springsessiondemo.role values(5,'ROLE\_SELLER');
insert into springsessiondemo.role values(6,'ROLE\_BUYER');
/\* Insert Data into Privilege Table \*/
insert into springsessiondemo.privilege values(1,'READ\_PRIVILEGE');
insert into springsessiondemo.privilege values(2,'WRITE\_PRIVILEGE');
insert into springsessiondemo.privilege values(3,'DELETE\_PRIVILEGE');
/\* Insert Data into UserRole Table \*/
INSERT INTO \`springsessiondemo\`.\`user\_role\`(\`id\`,\`user\_id\`,\`role\_id\`) VALUES (1,2,1);
INSERT INTO \`springsessiondemo\`.\`user\_role\`(\`id\`,\`user\_id\`,\`role\_id\`) VALUES (2,1,2);INSERT INTO \`springsessiondemo\`.\`user\_role\`(\`id\`,\`user\_id\`,\`role\_id\`) VALUES (3,1,1);
/\* Insert Data into RolePrivilege Table \*/
insert into springsessiondemo.role\_privilege values(2,1);
insert into springsessiondemo.role\_privilege values(2,2);
insert into springsessiondemo.role\_privilege values(2,3);
insert into springsessiondemo.role\_privilege values(1,1);
15章へ移動src/webapp
アングルUIに必要な依存関係をインストールするには、次のコマンドを実行します.$ npm install
16 .次のコマンドを実行することによって角度UIを起動し、http://localhost:4200 ログイン画面を表示するには$ ng serve --watch
17 .ステップ14で作成したユーザ名とパスワードを入力します.それはホームページにあなたを取る必要があります18 .カテゴリをクリックしてカテゴリ一覧を表示する
からダウンロードGithub
Reference
この問題について(スプリングセキュリティ、角度、およびMySQL), 我々は、より多くの情報をここで見つけました https://dev.to/pavankjadda/oauth-2-0-authentication-with-spring-security-angular-and-mysql-2dd6テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol