<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    1+1=2,0+0=0

    日月累積
    posts - 7, comments - 50, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
    在上文中我們提到了一個資源對應一個數據庫表,在T_ResourceInfo表中我們也提到了有一個字段專門來記錄表名,然后我書寫一個資源配置文件,用來配置我的業務類與資源的對應關系,代碼如下:
    1<?xml?version="1.0"?encoding="GB2312"?>
    2<data>
    3????<mapping?SysName="s">
    4????????<module?BusinessClass="com.ideal.framework.business.businessface.IBLogin"?TableName="user_info"/>
    5????</mapping>
    6</data>
    其中BusinessClass代表業務接口,TableName代表該業務接口所要操作的數據實體(數據表),此處的TableName必須與T_ResourceInfo中的Module_Code一致。
    用戶登錄后,需要操作T_UserInfo這個表時,我們的邏輯將會把請求帶入IBLogin這個業務邏輯中,在我們的AOP模塊中,可以用MethodInterceptor來截獲當前用戶想要操作的業務邏輯,當AOP模塊截獲了用戶的請求,并判斷用戶想要操作IBLogin這個業務邏輯,它將在上述的mapping文件中去找該業務邏輯對應的資源user_info,然后去資源表中判斷該用戶是否有操作user_info的權限。
    (注:上述xml文件在系統初始化時候加載入內存中,我們也可以將權限信息也加載在內存中,不會很大,一切資源在內存中操作,非常快)
    下面我貼點代碼,在系統初始化時:
    ?1package?com.ideal.framework;
    ?2
    ?3import?java.util.*;
    ?4import?java.sql.*;
    ?5import?com.ideal.framework.dao.daoface.*;
    ?6import?com.ideal.framework.po.*;
    ?7
    ?8public?class?ResourceContainer
    ?9{
    10????public?static?boolean?change_resource;?//更新資源??系統持久
    11????public?static?Vector?resource_container?=?new?Vector();?//資源容器??用戶持久
    12????private?IUserRoleDAO?m_user_role_dao;
    13????private?IRoleResourceDAO?m_role_resource_dao;
    14????private?IUserDAO?m_user_dao;
    15
    16????public?ResourceContainer()
    17{
    18????}

    19
    20????public?void?setUserResource()
    21????{
    22????????System.out.println("initialize?resource:");
    23????????List?user_list?=?m_user_dao.getAllUser();
    24????????for?(int?i?=?0;?i?<?user_list.size();?i++)
    25????????{
    26????????????UserInfo?user?=?(UserInfo)?user_list.get(i);
    27????????????List?role_list?=?m_user_role_dao.getRoleInfo(user);
    28????????????for?(int?j?=?0;?j?<?role_list.size();?j++)
    29????????????{
    30????????????????RoleInfo?role?=?(RoleInfo)?role_list.get(j);
    31????????????????List?resource_list?=?m_role_resource_dao.
    32????????????????????getResourceInfo(role);
    33????????????????for?(int?k?=?0;?k?<?resource_list.size();?k++)
    34????????????????{
    35????????????????????Hashtable?hash?=?new?Hashtable();
    36????????????????????hash.put(user.getLoginId(),?resource_list.get(k));
    37????????????????????hash.put("Unit_"+user.getLoginId(),?user.getUnit());
    38????????????????????hash.put("Role_"+user.getLoginId(),?role.getRoleName());
    39????????????????????ResourceContainer.resource_container.add(hash);
    40????????????????}

    41????????????}

    42????????}

    43????}

    44
    45????public?Vector?getResource_container()
    46????{
    47????????return?resource_container;
    48????}

    49
    50????public?void?setResource_container(Vector?resource_container)
    51????{
    52????????this.resource_container?=?resource_container;
    53????}

    54
    55????public?IRoleResourceDAO?getM_role_resource_dao()
    56????{
    57????????return?m_role_resource_dao;
    58????}

    59
    60????public?IUserDAO?getM_user_dao()
    61????{
    62????????return?m_user_dao;
    63????}

    64
    65????public?IUserRoleDAO?getM_user_role_dao()
    66????{
    67????????return?m_user_role_dao;
    68????}

    69
    70????public?void?setM_role_resource_dao(IRoleResourceDAO?m_role_resource_dao)
    71????{
    72????????this.m_role_resource_dao?=?m_role_resource_dao;
    73????}

    74
    75????public?void?setM_user_dao(IUserDAO?m_user_dao)
    76????{
    77????????this.m_user_dao?=?m_user_dao;
    78????}

    79
    80????public?void?setM_user_role_dao(IUserRoleDAO?m_user_role_dao)
    81????{
    82????????this.m_user_role_dao?=?m_user_role_dao;
    83????}

    84
    85????public?void?setChange_resource(boolean?change_resource)
    86????{
    87????????this.change_resource?=?change_resource;
    88????}

    89
    90????public?boolean?isChange_resource()
    91????{
    92????????return?change_resource;
    93????}

    94}

    95
    將用戶對應的角色,資源信息加載如內存,另外在初始化時候的xml文件的樹形結構也加載入內存,這邊就不貼代碼了
    下面是AOP模塊的advice代碼:
    package?com.ideal.framework.sys.advice;

    /**
    ?*?<p>Title:?BusinessAccessAdvisor</p>
    ?*?<p>Description:?業務模塊AOP權限監聽器</p>
    ?*?<p>Copyright:?Copyright?(c)?2006</p>
    ?*?<p>Company:?ideal</p>
    ?*?
    @author?alex
    ?*?
    @version?1.0
    ?
    */


    import?org.aopalliance.intercept.MethodInterceptor;
    import?org.aopalliance.intercept.MethodInvocation;
    import?com.ideal.framework.InitResource;
    import?com.ideal.framework.util.XMLUtil;
    import?java.util.ArrayList;
    import?java.util.Hashtable;
    import?com.ideal.framework.sys.accesscontrol.GenericAccessBase;
    import?java.lang.reflect.Field;
    import?com.ideal.framework.po.*;
    import?java.lang.reflect.Method;
    import?java.util.*;
    import?java.io.*;
    import?javax.servlet.http.HttpServletRequest;

    public?class?BusinessAccessAdvisor
    ????
    implements?MethodInterceptor
    {

    ????
    public?BusinessAccessAdvisor()
    ????
    {
    ????}


    ????
    public?Object?invoke(MethodInvocation?invocation)?throws
    ????????Throwable
    ????
    {
    ????????String?user_name?
    =?"";
    ????????Object?obj?
    =?invocation.getArguments()[1];
    ????????
    if?(obj?instanceof?HttpServletRequest)
    ????
    {
    ????????????HttpServletRequest?request?
    =?(HttpServletRequest)obj;
    ????????????user_name?
    =?(String)request.getSession().getAttribute("UserName");//取出用戶名
    ????????}

    ????????String?bean_name?
    =?invocation.getMethod().getDeclaringClass().getName();//取出用戶想要操作的業務邏輯
    ????????XMLUtil?xml?
    =?(XMLUtil)?InitResource.context.getBean("XMLUtil");
    ????????ArrayList?list?
    =?xml.getFieldList("mapping",?"s",?xml.doc);
    ????????
    for?(int?i?=?0;?i?<?list.size();?i++)
    ????
    {
    ????????????Hashtable?hash?
    =?(Hashtable)?list.get(i);
    ????????????
    if?(hash.get("BusinessClass").equals(invocation.getMethod().//判斷用戶是否有權操作該業務邏輯所對應表
    ?????????????????????????????????????????????????getDeclaringClass().getName()))
    ????????
    {
    ????????????????String?table_name?
    =?(String)?hash.get("TableName");
    ????????????????GenericAccessBase?access_controller?
    =?(GenericAccessBase)
    ????????????????????InitResource.context.getBean(
    "GenericAccessBase");
    ????????????????
    if?(access_controller.CheckAccessPrivilege(user_name,?table_name))//若用戶有權操作該表,則讓程序進入業務邏輯
    ????????????
    {
    ????????????????????
    return?invocation.proceed();
    ????????????????}

    ????????????}

    ????????}

    ????????System.out.println(
    "no?permission?.reject?by?"?+?bean_name);
    ????????
    return?null;
    ????}

    }

    下面是判斷用戶是否具有操作該表權限的類:
    ?1package?com.ideal.framework.sys.accesscontrol;
    ?2
    ?3import?com.ideal.framework.InitResource;
    ?4import?com.ideal.framework.util.XMLUtil;
    ?5import?com.ideal.framework.po.UserInfo;
    ?6import?com.ideal.framework.ResourceContainer;
    ?7import?java.util.*;
    ?8//import?com.ideal.framework.po.ResourceInfo;
    ?9
    10public?class?GenericAccessBase
    11{
    12????UserInfo?user;
    13
    14????public?GenericAccessBase()
    15????{
    16????}

    17
    18????public?void?setUser(UserInfo?user)
    19????{
    20????????this.user?=?user;
    21????}

    22
    23????public?boolean?CheckAccessPrivilege(String?user_name,?String?table_name)
    24????{
    25????????for?(int?i?=?0;?i?<?ResourceContainer.resource_container.size();?i++)
    26????????{
    27????????????Hashtable?temp_hash?=?(Hashtable)ResourceContainer.resource_container.get(i);//從內存中取出用戶資源信息
    28????????????if?(temp_hash.containsKey(user_name))
    29????????????{
    30????????????????ResourceInfo?resource?=?(ResourceInfo)temp_hash.get(user_name);
    31????????????????if?(table_name.trim().toLowerCase().equals(resource.getModuleCode().trim().toLowerCase()))//比對用戶擁有的資源和當前的table_name
    32????????????????{
    33????????????????????return?true;
    34????????????????}

    35????????????}

    36????????}

    37????????return?false;
    38????}

    39}

    40
    ok,到此為止,我們的底層攔截就完成了,接下來就是界面權限處理,界面權限比較復雜,因為用戶可能具有添加權限,沒有上傳權限,有下載權限卻沒有更新權限等,情況很復雜,所以我們這邊必須有一個判斷當前用戶是否具有這些復雜權限的類:
    ??1package?com.ideal.framework.sys.privilege;
    ??2
    ??3/**
    ??4?*?<p>Title:?GenericPrivilegeBase</p>
    ??5?*?<p>Description:?通用權限法則</p>
    ??6?*?<p>Copyright:?Copyright?(c)?2006</p>
    ??7?*?<p>Company:?ideal</p>
    ??8?*?@author?alex
    ??9?*?@version?1.0
    ?10?*/

    ?11
    ?12public?class?GenericPrivilegeBase
    ?13{
    ?14????public?final?static?int?NO_PRIVILEGE?=?0;
    ?15????public?final?static?int?QUERY_OR_USE_PRIVILEGE?=?1;//察看權限
    ?16????public?final?static?int?CREATE_PRIVILEGE?=?2;//添加權限
    ?17????public?final?static?int?DELETE_PRIVILEGE?=?4;//刪除權限
    ?18????public?final?static?int?UPDATE_PRIVILEGE?=?8;//更新權限
    ?19????public?final?static?int?ALL_PRIVILEGE?=?QUERY_OR_USE_PRIVILEGE?|
    ?20????????CREATE_PRIVILEGE?|?DELETE_PRIVILEGE?|?UPDATE_PRIVILEGE;//增刪改查權限
    ?21
    ?22????public?GenericPrivilegeBase()
    ?23????{
    ?24????}

    ?25
    ?26????public?static?boolean?isValidPrivilege(int?privilege)//判斷是否具有權限
    ?27????{
    ?28????????if?(?(privilege?&?QUERY_OR_USE_PRIVILEGE)?!=?0)
    ?29????????{
    ?30????????????return?true;
    ?31????????}

    ?32
    ?33????????if?(?(privilege?&?CREATE_PRIVILEGE)?!=?0)
    ?34????????{
    ?35????????????return?true;
    ?36????????}

    ?37
    ?38????????if?(?(privilege?&?DELETE_PRIVILEGE)?!=?0)
    ?39????????{
    ?40????????????return?true;
    ?41????????}

    ?42
    ?43????????if?(?(privilege?&?UPDATE_PRIVILEGE)?!=?0)
    ?44????????{
    ?45????????????return?true;
    ?46????????}

    ?47
    ?48????????return?false;
    ?49????}

    ?50
    ?51????public?static?boolean?checkQueryPrivilege(int?privilege)//判斷是否具有察看權限
    ?52????{
    ?53????????if?(?(privilege?&?QUERY_OR_USE_PRIVILEGE)?!=?0)
    ?54????????{
    ?55????????????return?true;
    ?56????????}

    ?57????????else
    ?58????????{
    ?59????????????return?false;
    ?60????????}

    ?61????}

    ?62
    ?63????public?static?boolean?checkUsePrivilege(int?privilege)
    ?64????{
    ?65????????if?(?(privilege?&?QUERY_OR_USE_PRIVILEGE)?!=?0)
    ?66????????{
    ?67????????????return?true;
    ?68????????}

    ?69????????else
    ?70????????{
    ?71????????????return?false;
    ?72????????}

    ?73????}

    ?74
    ?75????public?static?boolean?checkCreatePrivilege(int?privilege)//判斷是否有添加權限
    ?76????{
    ?77????????if?(?(privilege?&?CREATE_PRIVILEGE)?!=?0)
    ?78????????{
    ?79????????????return?true;
    ?80????????}

    ?81????????else
    ?82????????{
    ?83????????????return?false;
    ?84????????}

    ?85????}

    ?86
    ?87????public?static?boolean?checkDeletePrivilege(int?privilege)//判斷是否有刪除權限
    ?88????{
    ?89????????if?(?(privilege?&?DELETE_PRIVILEGE)?!=?0)
    ?90????????{
    ?91????????????return?true;
    ?92????????}

    ?93????????else
    ?94????????{
    ?95????????????return?false;
    ?96????????}

    ?97????}

    ?98
    ?99????public?static?boolean?checkUpdatePrivilege(int?privilege)
    100????{
    101????????if?(?(privilege?&?UPDATE_PRIVILEGE)?!=?0)
    102????????{
    103????????????return?true;
    104????????}

    105????????else
    106????????{
    107????????????return?false;
    108????????}

    109????}

    110}

    111
    然后我們自定義兩個標簽,Privilege與noPrivilege用來判斷用戶是否具有權限,這兩個標簽必須具有三個基本的attribute,beanName:當前所要操作的哪個資源;scope:用戶信息存放在哪個域;operation:用戶想要進行什么操作
    貼一個privilege標簽的代碼:
    ??1package?com.ideal.framework.tag;
    ??2
    ??3import?javax.servlet.jsp.tagext.BodyTagSupport;
    ??4import?javax.servlet.jsp.tagext.*;
    ??5import?javax.servlet.http.*;
    ??6import?javax.servlet.jsp.*;
    ??7import?java.sql.*;
    ??8import?java.io.*;
    ??9import?com.ideal.framework.*;
    ?10import?com.ideal.framework.po.ResourceInfo;
    ?11import?java.util.Hashtable;
    ?12import?com.ideal.framework.sys.privilege.GenericPrivilegeBase;
    ?13
    ?14public?class?PrivilegeTag
    ?15????extends?BodyTagSupport
    ?16{
    ?17????String?operation;
    ?18????private?String?beanName;
    ?19????private?String?scope;
    ?20
    ?21????public?PrivilegeTag()
    ?22????{
    ?23????????super();
    ?24????}

    ?25
    ?26????public?void?setOperation(String?operation)
    ?27????{
    ?28????????this.operation?=?operation;
    ?29????}

    ?30
    ?31????public?void?setBeanName(String?beanName)
    ?32????{
    ?33????????this.beanName?=?beanName;
    ?34????}

    ?35
    ?36????public?void?setScope(String?scope)
    ?37????{
    ?38????????this.scope?=?scope;
    ?39????}

    ?40
    ?41????public?int?doStartTag()?throws?JspTagException
    ?42????{
    ?43????????if?(scope?==?null?||?scope.equals(""))
    ?44????????????return?SKIP_BODY;
    ?45????????else
    ?46????????{
    ?47????????????String?user_name?=?"";
    ?48????????????if?(scope.equalsIgnoreCase("session"))
    ?49????????????{
    ?50????????????????HttpSession?session?=?pageContext.getSession();
    ?51????????????????user_name?=?(String)?session.getAttribute("UserName");
    ?52????????????}

    ?53????????????else
    ?54????????????{
    ?55????????????????HttpServletRequest?request?=?(HttpServletRequest)?pageContext.
    ?56????????????????????getRequest();
    ?57????????????????user_name?=?(String)?request.getAttribute("UserName");
    ?58????????????}

    ?59
    ?60????????????for?(int?i?=?0;?i?<?ResourceContainer.resource_container.size();?i++)
    ?61????????????{
    ?62????????????????Hashtable?temp_hash?=?(Hashtable)?ResourceContainer.
    ?63????????????????????resource_container.get(i);
    ?64????????????????if?(temp_hash.containsKey(user_name))
    ?65????????????????{
    ?66????????????????????ResourceInfo?resource?=?(ResourceInfo)?temp_hash.get(
    ?67????????????????????????user_name);
    ?68????????????????????if?(beanName.trim().toLowerCase().equals(resource.
    ?69????????????????????????getModuleCode().trim().toLowerCase()))
    ?70????????????????????{
    ?71????????????????????????if(this.checkPrivilege(resource.getPrivilegeCode())?==?EVAL_BODY_TAG)
    ?72????????????????????????????return?EVAL_BODY_TAG;
    ?73????????????????????}

    ?74????????????????}

    ?75????????????}

    ?76
    ?77????????}

    ?78????????return?SKIP_BODY;
    ?79return?EVAL_BODY_TAG;
    ?80????}

    ?81
    ?82????public?int?checkPrivilege(String?privilege)
    ?83????{
    ?84????????int?int_privilege?=?0;
    ?85????????try
    ?86????????{
    ?87????????????int_privilege?=?Integer.parseInt(privilege);
    ?88????????}

    ?89????????catch?(NumberFormatException?ex)
    ?90????????{
    ?91????????????System.out.println(ex.getMessage());
    ?92????????}

    ?93????????GenericPrivilegeBase?gpb?=?new?GenericPrivilegeBase();
    ?94????????if?(operation.equals("NONE"))
    ?95????????????return?EVAL_BODY_TAG;
    ?96????????if?(operation.equals("QUERY"))
    ?97????????????if?(gpb.checkQueryPrivilege(int_privilege))
    ?98????????????????return?EVAL_BODY_TAG;
    ?99????????if?(operation.equals("CREATE"))
    100????????????if?(gpb.checkCreatePrivilege(int_privilege))
    101????????????????return?EVAL_BODY_TAG;
    102????????if?(operation.equals("DELETE"))
    103????????????if?(gpb.checkDeletePrivilege(int_privilege))
    104????????????????return?EVAL_BODY_TAG;
    105????????if?(operation.equals("UPDATE"))
    106????????????if?(gpb.checkUpdatePrivilege(int_privilege))
    107????????????????return?EVAL_BODY_TAG;
    108????????if?(operation.equals("USE"))
    109????????????if?(gpb.checkUsePrivilege(int_privilege))
    110????????????????return?EVAL_BODY_TAG;
    111????????return?SKIP_BODY;
    112????}

    113
    114????public?int?doAfterBody()?throws?JspTagException
    115????{
    116????????return?SKIP_BODY;
    117????}

    118
    119????public?int?doEndTag()?throws?JspTagException
    120????{
    121????????try
    122????????{
    123????????????if?(bodyContent?!=?null)
    124????????????{
    125????????????????bodyContent.writeOut(bodyContent.getEnclosingWriter());
    126????????????}

    127????????}

    128????????catch?(IOException?ex)
    129????????{
    130????????????throw?new?JspTagException("IO?Error:"?+?ex.getMessage());
    131????????}

    132????????return?EVAL_PAGE;
    133????}

    134
    135????public?void?doInitBody()?throws?JspTagException
    136????{
    137????}

    138
    139????public?void?setBodyContent(BodyContent?bodyContent)
    140????{
    141????????this.bodyContent?=?bodyContent;
    142????}

    143}

    144
    在頁面上,我們如此使用該標簽:
    1<privilege?beanName="user_info"?scope="session"?operation="create">
    2????<input?type="button"?value="添加">
    3</privilege>

    如此,系統會自動根據當前session中的用戶來判斷是否需要顯示當前的添加按鈕。
    到此所有權限的代碼完成,在此套權限設計中,我始終抱著AOP的想法:讓他屬于一個系統切面,以后再開發其他系統時,作為一個模塊就可以加載上去,與系統無關

    評論

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2007-01-03 15:54 by errorfun
    代碼沒仔細看,不過你的判斷是否有權限方法,感覺可以只是地判斷是否值大于1就行了,不過搞四個那么多,就像你原來所說的,如果擴展了權限,那你不是每次要加一個判斷?

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2007-01-03 17:04 by 江上一葉舟
    @errorfun
    判斷是否具有權限,那么的確只要判斷是否但與1就可以了,目前那個權限類存在的目的不僅是判斷是否具有權限,還要判斷是否具有添加的權限、刪除的權限等等

    另外我個人感覺如果每擴展一種權限就需要在里面加一個權值和一個函數,權值我們可以用其他方式來處理,譬如propeties文件,xml文件,數據庫,常量類等,但函數我覺得挺有必要增加的的:如增加上傳權限,我們需要加個函數checkUplodaPrivilege(),我覺得是有必要的,但如果您有更好的辦法,我們可以拿出來探討一下:)

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2007-01-03 19:12 by errorfun
    @江上一葉舟
    我是對你這個方法而說的:
    public static boolean isValidPrivilege(int privilege)//判斷是否具有權限
    27 {
    28 if ( (privilege & QUERY_OR_USE_PRIVILEGE) != 0)
    29 {
    30 return true;
    31 }
    32
    33 if ( (privilege & CREATE_PRIVILEGE) != 0)
    34 {
    35 return true;
    36 }
    37
    38 if ( (privilege & DELETE_PRIVILEGE) != 0)
    39 {
    40 return true;
    41 }
    42
    43 if ( (privilege & UPDATE_PRIVILEGE) != 0)
    44 {
    45 return true;
    46 }
    47
    48 return false;
    49 }
    isValidPrivilege方法要是有任何一個權限都會返回TRUE,但結果與return privilege >0是一樣的。難道不是?

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2007-01-03 22:39 by 江上一葉舟
    @errorfun
    不是這樣的,可以看到,我的權限中有一個是QUERY_OR_USE_PRIVILEGE權限,也就是最基本的使用權限,如果沒有這個權限,那其他的就不用檢查了,若有這個權限,我們就說他對該資源是有使用權,即有權限的。

    另外我們其實也無需這樣來判斷用戶是否具有該資源的操作權限,我們可以在資源表(T_ResourceInfo)中查看,若該角色沒有對應到該資源,自然就沒有權限了,這個類僅僅是用來在頁面上判斷是否顯示某些元素,譬如添加按鈕的時候用的,如頁面上有這種標簽的時候,我們就需要用到這個類中的CheckDeletePrivilege函數

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2007-01-04 09:57 by Tendy
    @江上一葉舟
    你的代碼沒有體現出你所說的檢查方法
    errorfun說的沒錯~~

    by the way:
    if ( (privilege & QUERY_OR_USE_PRIVILEGE) != 0)
    {
    return true;
    }
    else
    {
    return false;
    }

    寫成:
    return (privilege & QUERY_OR_USE_PRIVILEGE) != 0;
    簡潔一點。。。

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2007-01-04 10:06 by ronghao[匿名]
    權限操作本來就是對業務而言的,控制到數據庫再映射回來,呵呵,麻煩.
    直接使用acegi對業務方法攔截,頁面使用標簽,效果和你一樣,還可以動態擴展用戶直接實現增加刪除權限

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2007-01-04 10:13 by 江上一葉舟
    @ronghao[匿名]
    acegi我考慮過,對業務類權限控制不夠靈活.

    @Tendy
    isValidPrivilege方法本身只要判斷QUERY_OR_USE_PRIVILEGE就夠了,至于代碼是否簡潔,我覺得不在我想討論的范圍

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2007-01-04 16:01 by 1

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2007-01-10 13:43 by K.G
    請教: 若一個業務邏輯需要和底層的多個表操作,會不會引入配置和程序的復雜性?還是需要重新考慮數據庫設計合理性?

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2007-01-10 13:49 by 江上一葉舟
    @K.G
    恩,我考慮過這個問題,我們現在的做法主要是把一個表作為一個資源來控制,自然控制的業務邏輯也是針對一個表的,若我們一個業務邏輯涉及到多個資源,也就是多個表,那我們就需要考慮這個業務邏輯主要是針對那張表的,譬如說我們添加人員信息,添加人員信息勢必要涉及到給人員配置角色,那么就要涉及到人員表、人員角色對應表兩個數據庫表。一種方法是我們可以把兩個業務邏輯分開,第二種是我們就把這個添加人員的業務邏輯看成是針對人員信息資源的業務邏輯,只考慮這個業務邏輯的主要針對資源,不考慮分支。這樣的話也可以解決這個問題

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2007-01-11 10:57 by 康康[匿名]
    檢查權限功能時,如果功能代號大于32,計算不到..

    "&"移位運算符只支持Integer類型的運算..

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2007-10-19 09:51 by ehoole
    資源指代業務邏輯而不是數據表,這樣不是操作起來不是更清晰?

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2008-04-30 15:06 by piter
    表里存表名,垃圾,
    不過作者挺認真能把它這寫完,態度還是值的肯定的

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2009-04-14 08:53 by jsfMe
    “(注:上述xml文件在系統初始化時候加載入內存中,我們也可以將權限信息也加載在內存中,不會很大,一切資源在內存中操作,非常快)”,請問具體如何操作才能將其加載如內存,請指教,謝謝

    # re: web開發中的權限設計拙見一二(3) ----資源配置與權限判斷  回復  更多評論   

    2009-08-10 16:35 by pantu0914
    拜讀了你的文章,有一點小小的疑問請教:
    List user_list = m_user_dao.getAllUser();
    初始化的時候把所有的用戶的都取出來放入內存中,這樣可取嗎?如果
    主站蜘蛛池模板: 亚洲va久久久噜噜噜久久男同| 色吊丝免费观看网站| 亚洲一区精品伊人久久伊人| 99在线精品视频观看免费| 一区二区三区免费视频观看| 亚洲熟妇少妇任你躁在线观看| 久久青青草原亚洲AV无码麻豆| 亚洲高清无码在线观看| 91在线品视觉盛宴免费| 国产成人AV片无码免费| www免费插插视频| 亚洲av成本人无码网站| 激情亚洲一区国产精品| 亚洲视频在线观看| 亚洲人成亚洲人成在线观看 | 亚洲人成精品久久久久| 免费人成视频在线观看不卡| 在线观看AV片永久免费| 亚洲一区二区三区免费在线观看| 两个人看的www高清免费观看| 深夜福利在线视频免费| 亚洲AV无码精品国产成人| 亚洲国产熟亚洲女视频| 亚洲AV无码一区二区三区人| 精品亚洲成a人片在线观看少妇 | 国产成人亚洲毛片| 亚洲中文字幕精品久久| 亚洲AV无码乱码麻豆精品国产 | 亚洲黄色免费网址| 久久99热精品免费观看动漫| 91免费福利视频| 国产精品永久免费| eeuss草民免费| 免费看一级高潮毛片| 黄网站色视频免费观看45分钟| 精品无码专区亚洲| 国产亚洲午夜精品| 一级做受视频免费是看美女 | 午夜无遮挡羞羞漫画免费| 一二三四免费观看在线电影| 一二三四视频在线观看中文版免费|