ThinkPHP的RBAC

基於角色的訪問控制(Role-Based Access Control)node

在RBAC中,權限與角色相關聯,用戶經過成爲適當角色的成員而獲得這些角色的權限。數據庫

ThinkPHP經過5張表實現權限控制數組

  think_user (用戶表)app

  think_role (用戶分組表)加密

  think_node (操做節點)spa

  think_role_user (用戶和用戶分組的對應)3d

  think_access (各個操做和用戶組的對應)調試

認證過程code

1.判斷當前模塊的當前操做是否須要認證
2.若是須要認證而且還沒有登陸,跳到認證網關,若是已經登陸 執行5
3.經過委託認證進行用戶身份認證
4.獲取用戶的決策訪問列表
5.判斷當前用戶是否具備訪問權限

 

配置config文件blog

array(
        'APP_AUTOLOAD_PATH'=>'@.TagLib',
        'SESSION_AUTO_START'     =>true,
        'USER_AUTH_ON'              =>true,
        'USER_AUTH_TYPE'            =>1,        // 默認認證類型 1 登陸認證 2 實時認證
        'USER_AUTH_KEY'             =>'authId',    // 用戶認證SESSION標記
        'ADMIN_AUTH_KEY'            =>'administrator',
        'USER_AUTH_MODEL'           =>'User',    // 默認驗證數據表模型
        'AUTH_PWD_ENCODER'          =>'md5',    // 用戶認證密碼加密方式
        'USER_AUTH_GATEWAY'         =>'/Public/login',// 默認認證網關
        'NOT_AUTH_MODULE'           =>'Public',    // 默認無需認證模塊
        'REQUIRE_AUTH_MODULE'       =>'',        // 默認須要認證模塊
        'NOT_AUTH_ACTION'           =>'',        // 默認無需認證操做
        'REQUIRE_AUTH_ACTION'       =>'',        // 默認須要認證操做
        'GUEST_AUTH_ON'             =>false,    // 是否開啓遊客受權訪問
        'GUEST_AUTH_ID'             =>0,        // 遊客的用戶ID
        'DB_LIKE_FIELDS'            =>'title|remark',
        'RBAC_ROLE_TABLE'           =>'think_role',
        'RBAC_USER_TABLE'           =>'think_role_user',
        'RBAC_ACCESS_TABLE'         =>'think_access',
        'RBAC_NODE_TABLE'           =>'think_node',
        'SHOW_PAGE_TRACE'       =>1      //顯示調試信息
    );

  注:

    Public模塊是無需認證的

    默認網關地址就是認證失敗,沒有權限跳轉到此處,從新登錄

    ADMIN_AUTH_KEY表示超級管理員權限,不用分配權限,它什麼權限都有

重要的方法:

  authenticate($map,$model=」)  傳入查詢用戶的條件和用戶表的MODEL 返回數組包含用戶的信息

  saveAccessList($authId=null)  傳入用戶的ID,無返回值,只是設置 $_SESSION[‘_ACCESS_LIST’]的值

  checkAccess()  檢測當前模塊和操做是否須要驗證

  checkLogin()   檢測登陸

  AccessDecision($appName=APP_NAME)  檢測當前項目模塊操做 是否在$_SESSION[‘_ACCESS_LIST’]數組中

        $_SESSION[‘_ACCESS_LIST’][‘當前操做’][‘當前模塊’][‘當前操做’]是否存在,存在,表示有權限

  getAccessList($authId)  經過查詢數據庫 返回權限列表,$_SESSION[‘_ACCESS_LIST’]的值

相關文章
相關標籤/搜索