2013年3月29日

使用 Spring Security Core 快速建立 Grails 使用者與權限機制

使用 Spring Framework 作為現代 Java Web 應用開發框架,已經是相當多 Java 開發者的首選。Spring Security 是 Spring 框架提供的使用者驗證與安全機制,它的設計有彈性很容易擴充,很適合用於多數專案。

Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.

Grails 可以使用 Spring Security Core Plugin 快速增加 Spring Security 的支援,為了避免額外修改的麻煩,即使剛開始可能用不到 Spring Security 的驗證機制,仍建議在專案建立時就先加上此 Plugin,讓 Grails 的 User/Role Domain Class 設計可以相容於 Spring Security 的架構。

Spring Security Core Plugin

Official Document

安裝步驟

1) 在 grails-app/conf/BuildConfig.groovy 的 plugins 設定區加入

compile ':spring-security-core:1.2.7.3'

2) 執行 grails install-plugin spring-security-core

雖然官方已經不建議使用 install-plugin,但因為這個 Plugin 仍需要觸發 install script 才能得到 s2-quickstart 的指令檔。

3) 執行 s2-quickstart 指令,有以下參數範例

grails s2-quickstart project1 User Role

grails s2-quickstart project1 User Role Requestmap

4) 在 grails-app/conf/Config.groovy 加入一行設定,指定密碼欄位使用的加密演算法。

grails.plugins.springsecurity.password.algorithm = 'SHA-512' 

其中 project1 是專案使用的 class package 名稱,通常和 grails create-app 建立專案時的命名相同。User 和 Role 就是使用者與角色兩個 Domain Class 的名稱,用途就跟字面一樣;Requestmap 則是選項參數,用於設定進階的存取限制權限參照表。

上述的步驟依序完成後,就會得到 Spring Security Core Plugin 幫忙產生的 User 與 Role 等 Domain Class,其中已經建立的欄位是「必要」的部份,原則上是「不得修改」。

如果是已經發展一段時間的專案,就需要先將原本的 User 與 Role(Group)等 Domain Class 先做備份,然後再重新以 s2-quickstart 建立後,重新合併相關欄位,也可能需要修改 Config.groovy 設定檔的相關參數。所以建議新專案先加入 Spring Security Core,可以避免後續要花更多時間修改。

對於擴充機制的部份,Spring Security 相當有彈性:
  1. User Domain 可以依需求「增加新欄位」,例如 phone, address, nickname 等。
  2. Role Domain 也可增加欄位,例如 displayName 等。Spring Security 將 Role 的定義全部留給開發者自行定義,所以預設連常見的 ADMIN, USER 這些都不會有;可以在 Bootstrap.groovy 加入專案所需的 Role 項目。
  3. User 與 Role 之間的對映關係是:多對多。所以使用者可以同時擁有不同 Role 的角色權限。

Grails 專案整合 Spring Security 有什麼好處呢?
  1. 可以透過很方便的 @Secured 標記方式,幫 Controller 的 Action Method 設定存取權限(限定哪些 Role 才能存取此 Action)。
  2. 利用 Requestmap 對 URL Pattern(包含 Resources)設定存取權限限制。
  3. 提供很多進階的使用者管理功能,例如 User Switch(已登入的管理者暫時變身成某個會員)。
  4. 利用 Spring Security 相關的 Extension 擴充功能,例如支援 Open ID、LDAP、Facebook、Twitter 等驗證機制。

使用 Spring Security 的好處是,新專案能直接利用 Spring Framework 經驗累積的 Practical Patterns(良好的實踐作法),避免重新發明輪子或做出考慮不夠嚴謹的設計,因此更能將心力放在更重要的功能開發。

@本文作者 lyhcode 從事 Java, Groovy, Grails 軟體開發,並利用部落格分享開發經驗,歡迎訂閱 Groovy Taiwan 臉書專頁。

沒有留言:

張貼留言

lyhcode by lyhcode
歡迎轉載,請務必註明出處!