ThinkPHP是一個開源的PHP框架,是為了簡化企業級應用開發和敏捷的WEB應用開發而誕生。最早誕生於 2006年初,原名FCS,2007年元旦正式更名為ThinkPHP,並遵循Apache2開源協定發布。早期的思想架構來自Struts,後來經過不斷改進和完善,同時也藉鑒了國外許多優秀的框架和模式,使用物件導向的開發結構和MVC模式,融合了Struts的Action和DAO思想和JSP 的TagLib(標籤庫)、RoR的ORM映射和ActiveRecord模式,封裝了CURD和一些常用操作,單一入口模式等,在模版引擎、快取機制、 認證機制和擴充性方面均有獨特的表現
#
課程播放網址:http://www.php.cn/course/350.html
該老師講課風格:
講課親切自然,樸實無華,沒有矯揉造作,也不刻意渲染,而是娓娓而談,細細道來,師生之間在一種平等、協作、和諧的氣氛下,進行默默的情感交流,將對知識的渴望與探索融於簡樸、真實的教學情景之中,學生在靜靜的思考、默默的首肯中獲得知識
本影片中較為困難是ThinkPHP-RBAC介紹了:
RBAC是Role-Based Access Control的首字母,譯成中文即基於角色的權限存取控制,說穿了也就是使用者透過角色與權限進行關聯[其架構靈感來自作業系統的GBAC(GROUP-Based Access Control)的權限管理控制]。簡單的來說,一個使用者可以擁有一個若干角色,每個角色擁有若干權限。這樣,就建構成「使用者-角色-權限」的授權模型。在這種模型中,使用者與角色之間,角色與權限之間,一般者是多對多的關係。
在許多的實際應用中,系統不只是需要使用者完成簡單的註冊,還需要對不同層級的使用者對不同資源的訪問具有不同的操作權限。而在企業開發中,權限管理系統也成了重複開發效率最高的一個模組之一。而在多套系統中,對應的權限管理只能滿足自身系統的管理需要,無論是在資料庫設計、權限存取和權限管理機制方式上都可能不同,這種不致性也就存在如下的憋端:
維護多套系統,重複造輪子,時間沒用在刀片上
使用者管理、組織機制等資料重複維護,資料的完整性、一致性很難得到保障
權限系統設計不同,概念理解不同,及相應技術差異,系統之間整合存在問題,單點登入難度大,也複雜的企業系統帶來困難
RBAC是基於不斷實踐之後,提出的一個比較成熟的存取控制方案。實踐表明,採用基於RBAC模型的權限管理系統具有以下優勢:由於角色、權限之間的變化比角色、用戶關係之間的變化相對要慢得多,減小了授權管理的複雜性,降低管理開銷;而且能夠靈活地支援應用系統的安全策略,並對應用系統的變化有很大的伸縮性;在操作上,權限分配直觀、容易理解,便於使用;分級權限適合分層的用戶級形式;重用性強。
ThinkPHP中RBAC實作體系
ThinkPHP中RBAC基於Java的Spring的Acegi安全系統作為參考原型,並做了相應的簡化處理,以適應當前的ThinkPHP結構,提供一個多層、可自訂的安全系統來為應用開發提供安全控制。安全系統中主要有以下幾個部分:
安全攔截器
認證管理器
決策存取管理員
執行身分識別管理器
安全攔截器
安全攔截器就好比一道道門,在系統的安全防護系統中可能存在很多不同的安全控制環節,一旦某個環節你未通過安全體系認證,那麼安全攔截器就會實施攔截。
認證管理器
防護體系的第一道門就是認證管理器,認證管理器負責決定你是誰,一般它透過驗證你的主體(通常是一個使用者名稱)和你的憑證(通常是一個密碼),或更多的資料來做到。更簡單的說,認證管理器驗證你的身分是否在安全防護系統授權範圍內。
存取決策管理
雖然通過了認證管理器的身份驗證,但是並不代表你可以在系統裡面肆意妄為,因為你還需要透過存取決策來管理這道門。存取決策管理器對使用者進行授權,透過考慮你的身分認證資訊和與受保護資源關聯的安全屬性決定是是否可以進入系統的某個模組,和進行某項操作。例如,安全規則規定只有主管才允許存取某個模組,而你並沒有被授予主管權限,那麼安全攔截器會攔截你的存取操作。
決策存取管理器不能單獨執行,必須先依賴認證管理器進行身份確認,因此,在載入存取決策過濾器的時候已經包含了認證管理器和決策存取管理器。
為了滿足應用程式的不同需要,ThinkPHP 在進行存取決策管理的時候採用兩種模式:登入模式和即時模式。登入模式,系統在使用者登入的時候讀取改用戶所具備的授權資訊到 Session,下次不再重新取得授權資訊。也就是說即使管理員對該使用者進行了權限修改,使用者也必須在下次登入後才能生效。即時模式就是為了解決上面的問題,在每次存取系統的模組或操作時候,進行即使驗證該使用者是否具有該模組和操作的授權,從更高程度上保障了系統的安全。
運行身份管理器
運行身份管理器的用處在大多數應用系統中是有限的,例如某個操作和模組需要多個身份的安全需求,運行身份管理器可以用另一個身份取代你目前的身份,從而允許你存取應用系統內部更深處的受保護物件。這一層安全體系目前的 RBAC 中尚未實現。
ThinkPHP中RBAC認證流程
對應上面的安全體系,ThinkPHP 的RBAC 認證的過程大致如下:
判斷目前模組的目前操作是否需要認證
如果需要認證且尚未登錄,跳到認證網關,如果已經登入執行5
透過委託認證進行使用者身分認證
取得使用者的決策存取清單
#判斷目前使用者是否具有存取權限
權限管理的具體實作過程
RBAC相關的資料庫介紹
在ThinkPHP完整包,包含了RBAC處理類別RBAC.class .php文件,位於Extend/Library/ORG/Util。開啟文件,其中就包含了使用RBAC必備的4張表,SQL語句如下(複製後請替換表前綴):
CREATE TABLE IF NOT EXISTS `ly_access` ( `role_id` smallint(6) unsigned NOT NULL, `node_id` smallint(6) unsigned NOT NULL, `level` tinyint(1) NOT NULL, `module` varchar(50) DEFAULT NULL, KEY `groupId` (`role_id`), KEY `nodeId` (`node_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `ly_node` ( `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `title` varchar(50) DEFAULT NULL, `status` tinyint(1) DEFAULT '0', `remark` varchar(255) DEFAULT NULL, `sort` smallint(6) unsigned DEFAULT NULL, `pid` smallint(6) unsigned NOT NULL, `level` tinyint(1) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `level` (`level`), KEY `pid` (`pid`), KEY `status` (`status`), KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `ly_role` ( `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `pid` smallint(6) DEFAULT NULL, `status` tinyint(1) unsigned DEFAULT NULL, `remark` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `pid` (`pid`), KEY `status` (`status`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; CREATE TABLE IF NOT EXISTS `ly_role_user` ( `role_id` mediumint(9) unsigned DEFAULT NULL, `user_id` char(32) DEFAULT NULL, KEY `group_id` (`role_id`), KEY `user_id` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
這裡也推薦了原始碼資源的下載:http://www.php.cn/xiazai/learn/2134
素材
文件
原始碼
圖解
範本
#以上是ThinkPHP開發大型商城計畫實戰影片的源碼課程分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!