1. 程式人生 > >許可權系統設計-day01

許可權系統設計-day01

資料庫表的設計:

 

關鍵流程思考:

許可權在SSH系統中應該表現為什麼東西?

 

 

小胖這個使用者登陸:
1,檢查使用者名稱和密碼;
2,檢查通過;
  1),得到小胖這個使用者的對應的所有的角色:R1
  2),根據所有的角色,得到小胖所有的許可權資訊:P5,P6,P7,P8
  3),把小胖所有的許可權的expression放到一個set中;
  [com.ssh.mvc.RoleAction:execute,com.ssh.mvc.RoleAction:edit,com.ssh.mvc.RoleAction:delete,com.ssh.mvc.RoleAction:save]
3,把小胖這個物件和他的許可權列表

放到session中;

 

小胖作業系統:
1,點角色管理;
2,請求被許可權檢查攔截器攔截到了(PermissionCheckInterceptor.intercepte);
  1),得到當次請求的action和方法;
  2),判斷,當前的這個方法是否是需要一個許可權的;
  3),如果當前方法不需要許可權,直接放行;
  4),如果當前方法需要許可權,
    1),把當前請求的method變成com.ssh.mvc.RoleAction:execute一個表示式;
    2),在當前使用者的permissionset中去看是否有這個表示式;
    3),如果有,放行;
    4),如果沒有,直接導向到沒有許可權那個頁面;

 

怎麼標記一個許可權?
1,我們建立一個annotation
@RequiredPermission{
String value();//這個許可權的名稱;
}
2,自動載入系統許可權(PermissionServiceImpl);
  1),讓PermissionServiceImpl注入ApplicationContext;
  2),呼叫ApplicationContext.getBeansOfType(BaseAction.class) 得到所有的Action例項;
  3),遍歷這些Action例項,得到型別和所有的方法;
    1),判斷如果方法上有@RequiredPermission標籤;
    2),得到標籤,Permission p=new Permission();
    3),permission.setName(RequiredPermission.value());
    4),permission.setExpresssion(通過方法拼出來);
    5),儲存這個permission;

RoleAction{
    @RequiredPermission("角色列表")
    String execute(){
    //com.ssh.mvc.RoleAction:execute
    }
    @RequiredPermission("編輯角色")
    String edit(){
    //com.ssh.mvc.RoleAction:edit
    }
    @RequiredPermission("刪除角色")
    String delete(){
    //com.ssh.mvc.RoleAction:delete
    }
    @RequiredPermission("新增角色")
    String save(){
    //com.ssh.mvc.RoleAction:save
    }
}

 

 

高階查詢+分頁:

PageResult:給前臺顯示的;

1,總的條數;
2,當前頁的資料;
3,當前是第幾頁;
4,每頁多少條;

效果:共有 X條記錄 當前第X/X頁 首頁 上一頁 下一頁 尾頁

共有多少頁?
Math.max((totalCount+pageSize-1)/pageSize,1);

首頁?
1
上一頁?
Math.max(currentPage-1,1);
下一頁?
Math.min(currentPage+1,totalPage());
尾頁?
totalPage();

 QueryObject:用來包裝查詢和分頁資訊;

pageSize
currentPage
List<String> conditions;
List<Object> parmas;
private boolean isInit;

abstract void customerQuery();
void addCondition(String condition,Object..params){
     this.conditions.add(condition);
     this.parmas.addAll(Arrays.asList(parmas));
}

private void init(){
    if(!isInit){
       customerQuery();
       isInit=true;
    }
}

String getQuery(){
    init();
    //把所有的condition拼成WHERE語句;
}

List<Object> getParams(){
    init();
    //返回所有的引數值;
}

分頁查詢:
在我們的dao裡面;

PageResult query(QueryObject qo){
     //首先查詢總共的條數;
      String totalCountHQL="SELECT e FROM Employee e"+qo.getQuery();
      Query query=session.createQuery(totalCountHQL);
      //設定查詢查詢
      qo.getParams();//遍歷引數,設定值;
     //如果條數>0
     //查詢當前頁的資料;
        qo.getParams();//遍歷引數,設定值;
        qo.setFirstResult();
        qo.setMaxResult();
       //用當前頁的資料和QO中相關資訊包裝成一個PageResult物件;
     //如果條數==0,返回一個空的PageResult物件
}