2025-05-23

  開發環境: eclipse3.4.2 + weblogic10.3 + jdk1.6.0_13 + Struts2.1.8 + Spring3.0.1 + Hiberante3.3.2


    在開發權限管理系統的過程中,我使用瞭Spring security3這個開源組件。


    這個開源組件功能是比較強大的,但是對於國人開發人員來說,存在不能用數據庫動態管理用戶、角色、權限、資源的缺陷(當然有對於用戶和權限的動態管理,但不適合國人開發人員)。為瞭滿足采用數據庫動態管理用戶、角色、權限、資源這個要求,筆者擴展瞭security3,除瞭建立上述4個表之外,還建立瞭用戶和角色的關聯表、角色和權限的關聯表、權限和資源的關聯表共計7張表。並為上述的7張表開發相關的設置模塊。


就用戶和角色的關系來說,允許一個用戶關聯多個角色,它們之間是一對多的關系。
就角色和權限的關系來說,允許一個角色關聯多個權限,它們之間是一對多的關系。
就權限和資源的關系來說,允許一個權限關聯多個資源,它們之間是一對多的關系。


    限於篇附,僅介紹角色和權限維護及關聯關系維護的模塊,並且僅介紹相關的保存和刪除的代碼。角色表為Sys_Roles、權限表為Sys_Authorities、兩者的關聯表為Sys_Roles_Authorities。在角色和權限的關聯關系維護頁面,可以允許用戶添加角色;並且可以通過某個角色查找到與該角色相關的權限列表;還可以根據某個角色,通過checkbox選中多個權限列表,以保存該角色與多個權限之間的關系。


在此給出必要的相關代碼,到於SSH2如何配置,如何部署運行,請參考相關的其他文章。


一、Action-控制層代碼


public class RolesAct extends ActionSupport {


       ……省略定義的私有變量。
   
        ……省略其他如查找、保存角色的方法。
   
    /**//*
     * 保存角色和權限之間一對多的關系。
     */
    public String savePermissionAndRole(){
       
        rolesBuz.savePermissionAndRole( roleId,permisskey );


        return SUCCESS;
    }
   
    /**//*
     * 刪除角色
     */
    public String deleteRole(){


        rolesBuz.deleteRole( roleId );
       
        return SUCCESS;
    }
   
        ……省略getter和setter
}
 


二、dao-持久層代碼


public class SysRolesDao extends HibernateDaoSupport {


    /** *//**
     * 根據角色id刪除該角色。
     *
     * @author sparta
     *@param roleId
     */
    public void delete(String roleId) {
        log.debug(“根據角色id刪除該角色!角色id為 : ” + roleId);
        try {
           
            SysRoles role = findById( roleId );
           
            getHibernateTemplate().delete( role );
       
            log.debug(“角色id” + roleId + “刪除成功!”);
        } catch (RuntimeException re) {
            log.error(“角色id” + roleId + “刪除失敗!”, re);
            throw re;
        }
    }


    /**//*
     * 保存角色和權限之間一對多的關系。
     */
    public boolean savePermissionAndRole(String roleId, String[] permisskey) {


        SysRoles sysRoles = findById(roleId);
        SysAuthorities sysAuthorities = null;
        SysRolesAuthorities sysRolesAuthorities;
       
        //在重新設置之前先刪除之前所擁有的全部對應關系
        sysRolesAuthoritiesDao.deleteOldRoleAndPermissionRelative( roleId );


        try {
                        /**//*
             * 將用戶在前臺通過checkbox選中的所有權限id(參數permisskey)提取出來。
             * 在進行保存之前,首先要通過id提取該權限的實例,
             * 為角色權限關聯表sysRolesAuthorities的setSysAuthorities()提供數據。
             * 最後通過hibernate的save()方法保存新建的sysRolesAuthorities實例。
             */
            for (String perId : permisskey) {
                sysAuthorities = sysAuthoritiesDao.findById(perId);


                sysRolesAuthorities = new SysRolesAuthorities();
                sysRolesAuthorities.setId(Util.getPkId());
                sysRolesAuthorities.setSysRoles(sysRoles);
                sysRolesAuthorities.setSysAuthorities(sysAuthorities);
                sysRolesAuthorities.setEnabled(true);


                getHibernateTemplate().save(sysRolesAuthorities);
            }
           
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
        return true;
    }
}


 



三、表的hibernate配置文件SysRoles.hbm.xml


 


<hibernate-mapping>
    <class name=”avatar.base.security.entity.SysRoles” table=”SYS_ROLES” schema=”SCJDGL”>
        <id name=”roleId” type=”string”>
            <column name=”ROLE_ID” length=”32″ />
            <generator class=”assigned” />
        </id>
        <property name=”roleName” type=”string”>
            <column name=”ROLE_NAME” length=”40″ />
&nbsp

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *