iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
Software Development

從 Vibe Coding 到可維護專案:用 Hermes Agent 重讀 RoomRush Android 專題系列 第 19 篇

Day 19 | 進入後台之後,管理者其實有三條功能線

  • 分享至 

  • xImage
  •  

前言:管理者登入後可以去哪三條線?各自維護什麼資料?

前一天我們了解了管理者功能的入口登入功能,今天我們要繼續進入到管理者的主畫面-ManagerActivity.kt,在畫面中,我們會看到三個按鈕分別是-課表內容編輯、教室細項設定、所有教室狀態;雖然我們今天不會探究這三項功能裡面的內容,但作為一個 App 的選單入口,也是必不可少的功能。


一開始我認為

一開始設計這頁面時,我們組內就討論出可能會有三個選項來提供給管理者設定。

不過當中,其實遇到了一個問題,就是我們事先設計好管理者頁面,才在之後接上登入功能;這樣的作法上看起來沒有錯,但其中一個核心的邏輯問題我們卻忽視了:那就是進入頁面時沒有檢查 isLoggedIn 。這個重大疏忽可能造就了如果有某個地方可以啟動 ManagerActivity,代表其他地方可以繞過登入檢查。

https://ithelp.ithome.com.tw/upload/images/20260923/20177899fGatgDF0Vp.png


實際讀完後,ManagerActivity.kt 負責什麼

和 Hermes Agent 一起重讀課表管理頁面後,ManagerActivity.kt 是管理者登入成功後看到的主畫面。它負責管理者後台的選單頁,提供不同按鈕讓使用者跳到不同功能頁:課表管理、教室詳細設定、瀏覽教室狀態、離開/登出。

主要的邏輯有以下四點:

1. 課表內容編輯按鈕

val lessonSettingButton = findViewById<Button>(R.id.lesson_setting)
lessonSettingButton.setOnClickListener {
    val intent = Intent(this, LessonManageActivity::class.java)
    startActivity(intent)
}
  • 技術說明:按下「課表內容編輯」後,會開啟 LessonManageActivity。後面可以追這個頁面是否負責新增或修改課表資料。

2. 教室詳細設定按鈕

val classroomSettingButton = findViewById<Button>(R.id.classroom_setting)
classroomSettingButton.setOnClickListener {
    val intent = Intent(this, ClassroomChooseManageActivity::class.java)
    startActivity(intent)
}
  • 技術說明:按下「教室細項設定」後,會開啟 ClassroomChooseManageActivity。這條線可以修改教室的類型。

3. 瀏覽教室狀態按鈕

val browseClassroomsButton = findViewById<Button>(R.id.browse_classrooms_button)
browseClassroomsButton.setOnClickListener {
    val intent = Intent(this, AllClassroomsActivity::class.java)
    startActivity(intent)
}
  • 技術說明:按下「所有教室狀態」後,會開啟 AllClassroomsActivity。後面會接到查看所有教室的有課時段以及可以新增教室。

4. 離開 / 登出按鈕

val exitButton = findViewById<Button>(R.id.exit_button)
exitButton.setOnClickListener {
    val pref = getSharedPreferences("LoginData", Context.MODE_PRIVATE)
    pref.edit().putBoolean("isLoggedIn", false).apply()

    Toast.makeText(this, "已登出並返回主畫面", Toast.LENGTH_SHORT).show()

    val intent = Intent(this, MainActivity::class.java)
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK

    startActivity(intent)
    finish()
}
  • 技術細節:這段會清除登入狀態以及原本的頁面堆疊,把 isLoggedIn 設成 false,顯示「已登出並返回主畫面」,重新回到乾淨的 MainActivity,避免使用者按返回鍵又回到管理者頁面。

它接在哪一條流程上

       LoginActivity
       「登入成功」
             │
             ▼
      ManagerActivity
      「管理者後台」
             │
             ├──→ 課表內容編輯
             │     「修改課表時段」
             │
             ├──→ 教室細項設定
             │     「修改教室類型」
             │
             └──→ 所有教室狀態
                   「查看 / 新增教室」
             │
             ▼
          離開後台
             │
             ▼
       清除登入狀態
             │
             ▼
       MainActivity

Hermes Agent 幫我檢查出的重點

ManagerActivity 是 RoomRush 管理者登入成功後的主選單頁。

  • 它使用 manager.xml 作為畫面,提供三個主要功能入口:按下「課表內容編輯」會進入 LessonManageActivity。
  • 按下「教室細項設定」會進入 ClassroomChooseManageActivity。
  • 按下「所有教室狀態」會進入 AllClassroomsActivity。
  • 按下離開按鈕時,程式會用 SharedPreferences 把 isLoggedIn 設為 false,顯示登出提示,並用 FLAG_ACTIVITY_NEW_TASK 與 FLAG_ACTIVITY_CLEAR_TASK 清除 Activity 堆疊後回到 MainActivity。

值得注意的是,這個檔案目前沒有在 onCreate() 開頭檢查 isLoggedIn,因此如果有方式直接啟動 ManagerActivity,可能會繞過登入流程。


這個檔案帶出的維護觀察

ManagerActivity 沒有檢查 isLoggedIn,雖然有登出,但沒有在進入時明確驗證登入狀態。這代表如果有某個地方可以啟動 ManagerActivity,可能有其他地方可以繞過登入檢查。

  1. 入口缺少守衛:ManagerActivity 在建立時(onCreate)時,完全沒有驗證使用者是否已成功登入(isLoggedIn),這代表只要頁面被開啟就預設放行,缺乏最基本的身分審核。
  2. 登出機制只做半套:雖然頁面提供了登出按鈕,但因為進入時沒有檢查機制,使用者點擊登出回到登入頁後,若按系統的「返回鍵」或 Activity 未被妥善銷毀,可能依舊能看到管理內容。
  3. 存在「繞過登入」的越權風險: 只要其他地方發送 Intent、設定了未妥善保護的 Deep Link 【註1】,甚至透過 ADB(Android Debug Bridge)【註2】 指令直接指定啟動該 Activity,任何人都能跳過登入頁直接進入管理後台。

【註1】 Deep Link(深層連結): 允許外部透過自訂 URI(網址)直接啟動 App 內部特定頁面的跳轉技術。
【註2】 ADB(Android Debug Bridge): 官方除錯命令列工具,可透過指令強制跳轉啟動特定 Activity,略過正常的 UI 流程。


小結

讀完 LoginActivity 後,我接著看 ManagerActivity。這個檔案不是直接管理資料,而是管理者登入後的功能選單。它提供三條路徑:課表管理、教室詳細設定,以及瀏覽教室狀態。這讓我可以把管理者功能拆成幾條後續主線,而不是一次混在一起看。

這個檔案也讓我看到一個安全性細節:它有登出機制,按離開時會把 isLoggedIn 改成 false,並清掉頁面堆疊回到主畫面。不過,目前沒有看到它在進入頁面時檢查 isLoggedIn。也就是說,登入流程目前主要靠 LoginActivity 控制,但 ManagerActivity 本身沒有再做一道防線。這可以記成後續改善點。

一句話重點總結 ManagerActivity:

ManagerActivity 是登入後的管理者選單頁,負責提供課表管理、教室設定、瀏覽教室狀態的入口,並在離開時清除登入狀態回到主頁。


下一篇預告:管理者選擇「是 / 否」有課之後,課表資料怎麼被改掉?

大致上了解管理者主頁面後,我們發現其中很嚴重的漏洞,未來如果要開發成真的 App 時,也要注意這些小細節。

接下來我們會進入到第一個管理者功能——「課表內容編輯」,我們會讀 LessonManageActivity.kt 以及 LessonManageViewModel.kt ,理解課表管理頁如何選條件及修改「是/否」有課及刪除既有的教室,並把修改和刪除的資料庫內容交給 Repository。


上一篇
Day 18 | 管理者登入看起來能用,但安全性真的夠嗎?
下一篇
Day 20 | 管理者選擇「是 / 否」有課之後,課表資料怎麼被改掉?
系列文
從 Vibe Coding 到可維護專案:用 Hermes Agent 重讀 RoomRush Android 專題 共 23 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言