スプリングセキュリティ、角度、およびMySQL


OAuth 2.0 業界標準認証プロトコルです.Webアプリケーション、デスクトップアプリケーション、携帯電話、およびリビングルームデバイスの特定の承認フローを提供しながらOAuth 2.0クライアントの開発者のシンプルさに焦点を当て.このブログ記事では、OutS 2認証の実装について説明します.

OAuth役割


OAuthは4つのロールを定義します:
  • リソースオーナー
  • クライアント
  • リソースサーバ
  • 認証サーバ
  • リソース所有者:ユーザ


    リソースオーナーは、アプリケーションに自分のアカウントにアクセスする権限を付与するユーザーです.ユーザーのアカウントへのアプリケーションのアクセスは、許可された許可の“スコープ”(例えば、読み取りまたは書き込みアクセス)に制限されます.

    リソース/認証サーバ: API


    リソースサーバーは、保護されたユーザーアカウントをホストし、認証サーバーはユーザーのアイデンティティを検証し、アプリケーションにアクセストークンを発行します.

    クライアントアプリケーション


    クライアントは、ユーザーのアカウントにアクセスしたいアプリケーションです.そうする前に、それはユーザによって認可されなければなりません、そして、承認はAPIによって有効にされなければなりません.

    ワークフロー


    次の図はプロセスを説明します

    OAuth 2ワークフロー
  • ユーザーはhttp://localhost:4200 データと角度にアクセスするには
  • ユーザーが資格情報を入力し、ログインをクリック
  • 角度は、それらの資格情報を送りますhttps://localhost:8090/oauth/token そして、OAuth 2を使用しているスプリングセキュリティは彼を認証しようとします
  • 資格情報が有効な場合は、次の応答を返します.と無効な資格情報は、エラーメッセージと同じページに彼を保持します
  • {"access\_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3","token\_type":"bearer","expires\_in":3600,"refresh\_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk","scope":"create"}
    
    次に、角度は別のリクエストを使用しますaccess_token ユーザ情報を取得するには
    角度が応答を受け取るならば、それは彼をホームページにリダイレクトします.彼は役割に基づいてカテゴリ、注文などにアクセスできます.

    技術

  • スプリングブート2X
  • スプリングセキュリティ2X
  • OAuS 2
  • MySQLデータベース
  • 角度8
  • セットアップ命令

  • MyAuthデータベースにOAuthトークンを格納する次の表を作成する
  • 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で暗号化.
  • SPring - Security - OAuth 2 - Readクライアント(許可されているグラントの種類:読み込み)
  • SPring - SecurityOAuS 2 - Read Write - Client (許可されているグラントの種類: read , write )
  • に移動website そして、パスワードとしてSPring - SecurityOAuS 2 - Read - Write - Client - Password 1234を入力して、暗号化されたパスワードを得てください.次のSQLクエリで暗号化されたパスワードフィールドを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クライアントのデータソースを設定する
  • OAuth 2 AuthorizationServerConfig.ジャバ
    @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 これは、春のセキュリティインターフェイスを実装UserDetailsService11 .定義CustomDaoAuthenticationProvider 認証するクラスはデータベースのユーザ名とパスワードに対する資格情報を提供しました.
    12章定義CustomAuthenticationSuccessHandler クラスとオーバーライドonAuthenticationSuccess() メソッドは、認証成功後に行われるアクションを指定し、同様の方法で他のクラスを実装しますUsersAccessDecisionManager , CustomAuthenticationFailureHandler and CustomLogoutSuccessHandler13章クローン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