
2010年4月1日
巴巴運動網(wǎng)的權限模塊總結
因為巴巴運動網(wǎng)的權限設計模塊對我來說,可以實現(xiàn),打算好好整理一下思路,面試時說不定還能起點作用,看了兩遍,自己總結下:
權限定義/權限組(角色)模塊
1.對系統(tǒng)的所有功能定義相應的權限
2.由網(wǎng)管針對不同部門不同員工分配權限組(角色),在分配角色時,
可以選擇該角色具有的權限
3.權限攔截模塊
具體步驟:
1.設計權限實體
聯(lián)合主鍵(SystemPrivilegePK),該類有module和privilage兩個屬性
2.初始化權限
3.設計權限組(角色)PrivilegeGroup實體,如果我們希望通過修改權限組添加或刪除權限,那么權限和角色之間的多對多關系的維護端由角色來維護
private String groupid;
private String name;
private Set<SystemPrivilege> privileges = new HashSet<SystemPrivilege>();
同時加上到數(shù)據(jù)庫表的映射
當然由于權限和角色之間的多對多關系是雙向關聯(lián),所以要在SystemPrivilege實體bean中加上和PrivilegeGroup實體Bean之間的映射
4.實現(xiàn)權限組的添刪改
路徑:/control/
新建接口PrivilegeGroupService,繼承Dao<PrivilegeGroupService>,
新建PrivilegeGroupService,繼承DaoSupport
當然這些Bean都需要交給Spring管理,加上相應的注解即可
5.實現(xiàn)權限組的分頁,這個簡單
6.實現(xiàn)添加權限,分頁列表上的Action,新建Action,名稱為PrivilegeGroupManageAction,
①.第一個方法是AddUI,主要是顯示頁面
接下來就是增刪該操作了(...)
7.權限做完后要新建一個Action用于完成SystemPrivilege,權限組,超級管理員的初始化,初始化完成后點擊“確定”,進入登陸頁面
權限模塊的核心: 權限攔截模塊
1.員工要訪問control開頭的路徑,必須登陸,即粗粒度的權限攔截,這是通過Fileter實現(xiàn)的,這里我們定義為PrivilegeFilter,先從session范圍中得到employee對象,如果對象為空,就瀏覽器重定向到登陸界面,,如果登陸了,就chain.doFilter(request,response);之后在web.xml配置,這樣就實現(xiàn)粗粒度的權限控制了3
2.對于界面上的某些功能,不是每一個登陸到系統(tǒng)的員工對頁面的功能都有操作權限,這就是細粒度的權限攔截
關鍵是怎樣細粒度的權限控制
怎樣實現(xiàn)細粒度的權限控制?
每點擊頁面上的按鈕,都會提交給相應的Action處理,細粒度的權限攔截就是對Action攔截,在不修改原代碼情況下,增加攔截代碼,使用的是AOP技術
每一個功能Action都有相應的方法處理,我們用JDK5中的注解為Action中的方法注解相應的權限,因為我們有時會修改方法名稱,用注解維護起來比較方便比如:
@Permission(module="order",privilege="modify")
public ActionForward OrderModify(){}
實現(xiàn)過程:
①.新建注解Permission,
@Retention(PetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Permission{
String module();
String privilege();
}
為Action中的方法,加上注解
只有攔截到Action中的這個方法,才能實現(xiàn)權限攔截,現(xiàn)在我們的Action已經(jīng)交給Spring管理,所以我們可以使用Spring的AOP技術進行權限攔截,有必要復習一下AOP的知識:
在Action類上加一個注解如下:@Aspect,當然要使這個注解起作用,我們必須在Spring的配置文件里配置:
<aop:aspectj-autoproxy> <!--注解解析器-->
要實現(xiàn)切面編程,抽象過程體現(xiàn)在代碼上, 就是一個采用類來描述,要是這個類起作用,我們必須要把它交給Spring管理,很郁悶
@Aspect@Component
public class Interceptor{
@Pointcut("exception(org.apache.struts.action.ActionForward cn.itcast.web.action.. * *(org.apache.struts.actionMapping,...))")
private void actionMethod(){}
@Around("actionMethod")
public Object interceptor(ProceedingJoinPoint pjp) throw Throwable{
System.out.println("攔截到了"+pjp.getSignature().getName()+"方法");
return pjp.proceed();
}
}
注意:
通知:
前置通知,在攔截的方法前加通知,這個通知執(zhí)行后,被攔截的方法仍然會執(zhí)行。
所以使用環(huán)繞通知,但是這樣的攔截只能是攔截Action實現(xiàn)的,他不能攔截繼承自DispatchAction
原因:Spring的動態(tài)代理技術的問題
Spring不能對通過反射調(diào)用的方法應用上通知(Advice)
當Spring發(fā)現(xiàn)我們的繼承的DispatchAction的那個類符合他攔截的要求,就會生成一個代理對象,因為無接口,默認使用cglib為這個Action生成代理對象,根據(jù)cglib生成代理對象的特點,繼承目標類,并且重寫所有非final的方法來實現(xiàn)
注:spring只會為本類定義的方法應用通知
posted @
2010-04-01 07:10 d66380022|
編輯 收藏