開發環境: 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″ />