> For the complete documentation index, see [llms.txt](https://hychen39.gitbook.io/apex-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hychen39.gitbook.io/apex-notes/security/switch_auth_after_login.md).

# 登入後，切換另一種身份鑑別方式

在使用預設身份鑑別機制通過鑑別後，因為要切換身份，所以需要使用另一種鑑別方式。例如，原本使用 Open Door Auth，之後要因要切換成 Admin，所以需使用 Apex Account auth 鑑別身份。

## User Story

App 的預設鑑別方式為 Open Door, 使用者只需輸入帳號名稱即可，不用密碼驗證。

登入後，使用者想切換到管理員身份，所要需要使用 Apex Account Auth，以取後身份。

故事實現

1. 先使用 Open Door 登入系統

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FWYRkH8Yk9OQpFWZDTgeC%2Fimage.png?alt=media\&token=cc52e2fb-f9a9-4403-8cb4-b7d5b0a08b28)

2. 在 Nav Toolbar 上提供 Admin Login 按鈕。按下後，轉跳畫面，告知即將登出目前身份。

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FakomUsUq8FHnlCb99tSS%2Fimage.png?alt=media\&token=7d534521-8b92-4e22-b397-15793aca25bf)

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FVCOyfh6WQdZJISGUcH13%2Fimage.png?alt=media\&token=ec21c02c-73e7-4b06-8b3f-fd24f5f5c35d)

3. 使用者按下 (B)OK 後，登出目前身份，並改用 Apex Account Auth. 系統轉跳至帳號/密碼輸入頁面。

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FmkaBcb7GPHMxCuAzCqvI%2Fimage.png?alt=media\&token=a2d583a6-40a9-4dc8-b768-740c3cad83aa)

4. 成功後改用新的身份。

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2F0P6mhIeIoOF4ToCTgHUk%2Fimage.png?alt=media\&token=cd0ae8bd-27a3-4750-ac0c-2b9d5a5b25df)

## 原理

1. 一但使用某種身份鑑別機制，之要再切換到另一種，需要先登出之後再鑑別
2. 非預設的 Auth Scheme 要啟用  `Switch in Session 功能。`
3. ``在未登入系統的狀態下，使用請求參數 `APEX_AUTHENTICATION=auth_scheme_name` 切換到未預設的 `auth_scheme_name` auth scheme 執行身份鑑別。``

## 設定步驟

### Task 1. 將 App 的預設 Auth Schem 改成 Open Door&#x20;

1. Path: App Home > Shared Components > Authentication Schemes&#x20;
2. (B)Create&#x20;
3. 選擇  "Based on a pre-configured scheme from the gallery"

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FrQmuy68ArrGMDT2UWUqq%2Fimage.png?alt=media\&token=89d740e0-7d2e-4d31-9dfa-76bb75126ae7)

4. 設定 Name，及 Scheme Type
5. (B)\[Create Authentication Scheme]

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FqLRB57OGz9w8DvSqCmU3%2Fimage.png?alt=media\&token=18452c4e-89ed-4c7d-8c76-7951039c13fc)

6. 完成後，App 預設使用 Open Door Auth Scheme

### Task 2. 修改 Apex Account Scheme, 並啟用 `Switch in Session 功能。`

1. 回到 Authentication Schemes 頁面。點選 Apex Express Accounts。
2. 修改 Apex Express Accounts scheme 的名稱為 `apex`&#x20;

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FEFLPialshQahanEuYkAZ%2Fimage.png?alt=media\&token=6ae44008-b7b9-4b62-995b-80fddfc2954b)

3. 點選 ``Login Processing tab. 設定 `Switch Session` 為 Enable. 之後 (B)[Apply Changes]``

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FUM1WyXo7FU8xsx8xw1nf%2Fimage.png?alt=media\&token=ed2e1422-ea6e-43f0-8a7e-a120d9da7b47)

### `Task 3. 製作 "告知登出" 頁面。`

1. 建立 new page. Page Mode 設為 Modal Dialog.\
   確認頁面需要身份鑑別: \
   ![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FdkMNQTilNg3hzrqQ521X%2Fimage.png?alt=media\&token=5a03d027-4429-4b81-82fe-9b220d2ec2d9)
2. 加入一個 Static Content Region 至 page body.&#x20;
3. 在 Region 的 Source > Text 撰寫告知訊息
4. 加入 Cancel button, 放置 Page template 的 CLOSE position; 加入 OK button, 放置到 CREATE position.&#x20;

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2Fip31LBMVrJ5qbvTsby04%2Fimage.png?alt=media\&token=abd5ac1f-2cbf-4c2e-a573-4fbbfb508b59)

5. 切換至 Processing tab
6. 加入第一個 procss, 當使用者按下 (B)OK 時登出目前身份。\
   執行的 PL/SQL Code:

```plsql
apex_authentication.logout(:SESSION, :APP_ID);
```

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2F9waFtqAiXvhN9n0uNOIP%2Fimage.png?alt=media\&token=4fd07a26-4332-4aea-82a8-3a99f3f0f272)

5. 加入第二個 process, 當使用者按下 (B)Cancel 時，關閉對話框。

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2F2TKZdC4en4B9z1jF8Qai%2Fimage.png?alt=media\&token=69383432-e711-4665-b013-1582841edcda)

6. 在 After Processing 節點，加入 Branch, 鑑別成功後，轉跳 Page 1 (Home)\
   設定 branch target 時，Request 欄位的值要設定成 \`APEX\_AUTHENTICATION=apex`，其中` apex 是要使用的非預設的 Auth Scheme.&#x20;

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FQteRk87xgsrjlPVDbQ7f%2Fimage.png?alt=media\&token=0983adc2-3c20-4e6c-9a8e-ca2e5aa73832)

![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2F3ffN3bMmxfyRM7G2ogBq%2Fimage.png?alt=media\&token=cb00279c-3bc3-48af-87e1-e04c17aef1f4)

### Task 4 在 Navigation Bar 加入 Admin Login 按鈕

1. Nav Path: App Home > Shared Components > Navigation > Navigation Bar List
2. 點擊 "Desktop Navigation Bar"\
   ![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FIkLuTd4n86aOYagh9KMZ%2Fimage.png?alt=media\&token=74996fbb-a77d-436b-8a16-88ecbc3a2a45)
3. (B)Create 建新 entry.
4. 輸入 List Entry Label 及 Target Page.\
   Target Page 為在 Task 3 建立的 page. \
   ![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2Fvu47SAtsbpJNjtDNzqnP%2Fimage.png?alt=media\&token=c81eeed8-8f06-4785-b050-9e4651903c71)

### Task 5 測試

1. 先使用 Open Door 身份鑑別登入 App.
2. 按下 Nav Toolbard 上的 (B)\[Admin Login], 應出現 "告知登出" 的對話框。\
   ![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FVicixZl8gmO5gsIFGKUS%2Fimage.png?alt=media\&token=2e6d3b5d-a58b-495e-b238-b566d289f686)\
   ![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2F7FkBgUbN2yAOoemQMRab%2Fimage.png?alt=media\&token=ff3d75e7-a6fa-41a9-84ca-ac6602a11b26)
3. 點擊 (B)Cancel 應會關閉對話框；點擊 (B)OK 應會轉到身份鑑別畫面：\
   ![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2FTvgOVLXa79OzEKWmRzmp%2Fimage.png?alt=media\&token=77da03c3-9c5a-493c-ae6e-474898d08021)
4. 成功登入後，轉挑到 Page 1. \
   ![](https://741116744-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5JWGStknepZGULjX5Vhv%2Fuploads%2F050NZXGOaI0JSXxThL2v%2Fimage.png?alt=media\&token=4de2c818-37cd-40a2-abf5-512719551ae9)

{% hint style="info" %}
2023/10/03 released
{% endhint %}
