这是我完成的数据库的实现,在DBPermission里的main方法实现,数据库为Postgresql,连接在dbpermission里可以修改成相应的.
用户,群组,角色,权限分别存储在tbluser,tblgroup,tblrole,tblpermission里,它们之间的关系在tblx1x2里,比如用户与群组的关系在tblgroupuser,依此类推.
=========DBGroup.java================
package org.fswan.permission.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Properties;
import org.fswan.Identity;
import org.fswan.IdentityImpl;
import org.fswan.ImplementIdentity;
import org.fswan.exception.IdentityMappingError;
import org.fswan.permission.AbstractGroup;
import org.fswan.permission.Group;
import org.fswan.permission.Role;
import org.fswan.permission.User;
/**
* @author Swan Fong(方志文)
* E-mail: fswan@yeah.net
* Site: http://blog.csdn.net/fswan
* 2005-1-3
*/
public class DBGroup extends AbstractGroup implements ImplementIdentity
{
public Object newInstance(Identity id)
{
prop= new Properties();
propMap = new HashMap();
role = new Identity[1];
this.group = new Identity[1];
try {
Connection conn = DBPermission.getConnection();
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select * from tblgroup where id = "+id.getIdName());
if(rs.next())
{
this.id = id;
this.name = rs.getString("name");
this.description = rs.getString("description");
int props = rs.getMetaData().getColumnCount();
for (int i = 0; i < props; i++) {
prop.setProperty(rs.getMetaData().getColumnName(i+1),rs.getString(i+1));
}
}
//初始化父群组
rs = st.executeQuery("select count(*) from tblgroupgroup where child_id = " + id.getIdName());
if (rs.next())
{
this.group = new Identity[rs.getInt(1)];
}
rs = st.executeQuery("select * from tblgroupgroup where child_id = " + id.getIdName());
int i = 0;
while (rs.next())
{
group[i] = new IdentityImpl(Identity.GROUP, "DBGroup", rs.getString("parent_id"));
i++;
}
//初始子群组
rs = st.executeQuery("select count(*) from tblgroupgroup where parent_id = " + id.getIdName());
if (rs.next())
{
this.subGroup = new Identity[rs.getInt(1)];
}
rs = st.executeQuery("select * from tblgroupgroup where parent_id = " + id.getIdName());
i = 0;
while (rs.next())
{
subGroup[i] = new IdentityImpl(Identity.GROUP, "DBGroup", rs.getString("child_id"));
i++;
}
//初始化用户
rs = st.executeQuery("select count(*) from tblgroupuser where group_id = " + id.getIdName());
if (rs.next())
{
this.user = new Identity[rs.getInt(1)];
}
rs = st.executeQuery("select * from tblgroupuser where group_id = " + id.getIdName());
i = 0;
while (rs.next())
{
user[i] = new IdentityImpl(Identity.GROUP, "DBUser", rs.getString("user_id"));
i++;
}
//角色
rs = st.executeQuery("select count(*) from tblgrouprole where group_id="+id.getIdName());
if(rs.next())
{
role = new Identity[rs.getInt(1)];
}
rs = st.executeQuery("select * from tblgrouprole where group_id="+id.getIdName());
i = 0;
while(rs.next())
{
role[i] = new IdentityImpl(Identity.ROLE,"DBRole",rs.getString("role_id"));
i++;
}
conn.close();
return this;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args)
{
try {
Class.forName("org.fswan.permission.db.DBPermission");
IdentityImpl id = new IdentityImpl(Identity.GROUP,"DBGroup","1");
DBGroup group = (DBGroup)id.newInstance();
User[] users = group.getUsers();
Group[] groups = group.getGroups();
Group[] subGroup = group.getSubGroup();
Role[] role = group.getRoles();
for (int i = 0; i < users.length; i++)
{
System.out.println("==============");
System.out.println(users[i]);
}
for (int i = 0; i < groups.length; i++)
{
System.out.println("===================");
System.out.println(groups[i]);
}
for (int i = 0; i < subGroup.length; i++)
{
System.out.println("================");
System.out.println(subGroup[i]);
}
for (int i = 0; i < role.length; i++)
{
System.out.println("====================");
System.out.println(role[i]);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IdentityMappingError e) {
e.printStackTrace();
}
}
}
==========DBPermission.java==================
/*
* Created on 2005-1-3
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.fswan.permission.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import org.fswan.Identity;
import org.fswan.IdentityImpl;
import org.fswan.ImplementIdentity;
import org.fswan.exception.IdentityMapHadExist;
import org.fswan.exception.IdentityMappingError;
import org.fswan.permission.Permission;
import org.fswan.permission.Rule;
import org.fswan.permission.RuleImpl;
import org.fswan.permission.User;
/**
* @author Swan Fong(方志文)
* E-mail: fswan@yeah.net Site:
* http://blog.csdn.net/fswan
* 2005-1-3
* 权限名和子权限名不能包含:(冒号),属性用分号分隔,类型为contain
*/
public class DBPermission extends Permission implements ImplementIdentity {
public static final String DBGROUP = "DBGroup";
public static final String DBUSER = "DBUser";
public static final String DBROLE = "DBRole";
public static final String DBPERMISSION = "DBPermission";
static
{
try
{
IdentityImpl.register("DBGroup", "org.fswan.permission.db.DBGroup");
} catch (IdentityMapHadExist e)
{
System.out.println("DBGroup had registered");
}
try
{
IdentityImpl.register("DBUser", "org.fswan.permission.db.DBUser");
} catch (IdentityMapHadExist e)
{
System.out.println("DBUser had registered");
}
try
{
IdentityImpl.register("DBRole", "org.fswan.permission.db.DBRole");
} catch (IdentityMapHadExist e)
{
System.out.println("DBRole had registered");
}
try
{
IdentityImpl.register("DBPermission", "org.fswan.permission.db.DBPermission");
} catch (IdentityMapHadExist e)
{
System.out.println("DBPermission had registered");
}
}
public static Connection getConnection()
{
try
{
Class.forName("org.postgresql.Driver");
return DriverManager.getConnection("jdbc:postgresql://localhost:5432/hrms", "sa", "760522");
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (SQLException e)
{
e.printStackTrace();
}
return null;
}
/* (non-Javadoc)
* @see org.fswan.ImplementIdentity#newInstance(org.fswan.Identity)
*/
public Object newInstance(Identity identity)
{
try {
Connection conn = DBPermission.getConnection();
Statement st = conn.createStatement();
String sql = null;
if(identity.getIdName().indexOf(":")!=-1)
{
String name = identity.getIdName();
String subName = name.substring(name.indexOf(":")+1);
name = name.substring(0,name.indexOf(":"));
sql = "select * from tblpermission where subname ='"+subName+"' and name = '"+name+"' and /"type/" = 'contain'";
}else
{
sql = "select * from tblpermission where subname is null and name = '"+identity.getIdName()+"' and /"type/" = 'contain'";
}
ResultSet rs = st.executeQuery(sql);
if(rs.next())
{
permission = rs.getString("name");
subPermission = rs.getString("subname");
String props = rs.getString("property");
if(props!=null)
{
prop = new ArrayList();
String[] items = props.split(";");
for (int i = 0; i < items.length; i++)
{
prop.add(items);
}
}
conn.close();
return this;
}
}catch(SQLException e)
{
e.printStackTrace();
}
return null;
}
/* (non-Javadoc)
* @see org.fswan.permission.Permission#getDenyRule()
*/
public Rule[] getDenyRule()
{
return null;
}
/* (non-Javadoc)
* @see org.fswan.permission.Permission#getAcceptRule()
*/
public Rule[] getAcceptRule()
{
return new Rule[]{new RuleImpl()};
}
public static void main(String[] args)
{
Identity id = new IdentityImpl(Identity.PERMISSION,"DBPermission","spc.machine");
try
{
Permission p = (Permission)id.newInstance();
Identity id2 = new IdentityImpl(Identity.USER,"DBUser","2");
User user = (User)id2.newInstance();
System.out.println(p);
System.out.println(user);
HashMap oldData = new HashMap();
oldData.put("department","1");
System.out.println(p.hasPermission(user,oldData,null));
} catch (IdentityMappingError e)
{
e.printStackTrace();
}
}
}
========================DBRole.java=================
/*
* Created on 2004-4-21
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package org.fswan.permission.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Properties;
import org.fswan.Identity;
import org.fswan.IdentityImpl;
import org.fswan.ImplementIdentity;
import org.fswan.exception.IdentityMappingError;
import org.fswan.permission.AbstractRole;
import org.fswan.permission.User;
/**
* @author Swan Fong(方志文)
* E-mail: fswan@yeah.net
* Site: http://blog.csdn.net/fswan
* 2005-1-3
*/
public class DBRole extends AbstractRole implements ImplementIdentity {
public Object newInstance(Identity id)
{
prop = new Properties();
try
{
permissionMap = new HashMap();
Connection conn = DBPermission.getConnection();
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select * from tblrole where id = " + id.getIdName());
if (rs.next())
{
this.id = id;
this.name = rs.getString("name");
this.description = rs.getString("description");
int props = rs.getMetaData().getColumnCount();
for (int i = 0; i < props; i++)
{
prop.setProperty(rs.getMetaData().getColumnName(i + 1), rs.getString(i + 1));
}
}
// 初始化用户
int userNum = 0;
rs = st.executeQuery("select count(*) from tblgrouprole where role_id = " + id.getIdName());
if (rs.next())
{
userNum = rs.getInt(1);
}
rs = st.executeQuery("select count(*) from tbluserrole where role_id = " + id.getIdName());
if (rs.next())
{
userNum += rs.getInt(1);
}
users = new Identity[userNum];
//群组
rs = st.executeQuery("select * from tblgrouprole where role_id = " + id.getIdName());
int i = 0;
while (rs.next())
{
users[i] = new IdentityImpl(Identity.GROUP, "DBGroup", rs.getString("group_id"));
i++;
}
rs = st.executeQuery("select * from tbluserrole where role_id = " + id.getIdName());
while (rs.next())
{
users[i] = new IdentityImpl(Identity.USER, "DBUser", rs.getString("user_id"));
i++;
}
//权限属性
rs = st.executeQuery("select * from tblrolepermission where role_id=" + id.getIdName());
while (rs.next())
{
String pro = rs.getString("properties");
String permission = rs.getString("permission");
Properties tmpP = new Properties();
ArrayList tmpA = null;
if (permissionMap.get(permission) != null)
{
tmpA = (ArrayList) permissionMap.get(permission);
} else
{
tmpA = new ArrayList();
permissionMap.put(permission, tmpA);
}
if (pro != null)
{
String[] tmpArray = pro.split(":");
for (int j = 0; j < tmpArray.length-1; j += 2)
{
tmpP.setProperty(tmpArray[j], tmpArray[j + 1]);
}
}
tmpA.add(tmpP);
}
conn.close();
return this;
} catch (SQLException e)
{
e.printStackTrace();
}
return null;
}
public static void main(String[] args)
{
try
{
Class.forName("org.fswan.permission.db.DBPermission");
IdentityImpl id = new IdentityImpl(Identity.ROLE, "DBRole", "2");
DBRole role = (DBRole) id.newInstance();
System.out.println(role);
User[] users = role.getUsers();
for (int i = 0; i < users.length; i++)
{
System.out.println("===============");
System.out.println(users[i]);
}
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (IdentityMappingError e)
{
e.printStackTrace();
}
}
}
=================DBUser.java==============
/*
* Created on 2005-1-3
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.fswan.permission.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Properties;
import org.fswan.Identity;
import org.fswan.IdentityImpl;
import org.fswan.ImplementIdentity;
import org.fswan.exception.IdentityMappingError;
import org.fswan.permission.AbstractUser;
/**
* @author Swan Fong(方志文)
* E-mail: fswan@yeah.net
* Site: http://blog.csdn.net/fswan
* 2005-1-3
* 初始化了id,name,description,role,group,properties等属性,propMap没初始化.此包中不使用此属性
*/
public class DBUser extends AbstractUser implements ImplementIdentity {
public Object newInstance(Identity id)
{
prop = new Properties();
propMap = new HashMap();
try
{
Connection conn = DBPermission.getConnection();
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select * from tbluser where id = " + id.getIdName());
if (rs.next())
{
this.id = id;
this.name = rs.getString("name");
this.description = rs.getString("description");
int props = rs.getMetaData().getColumnCount();
for (int i = 0; i < props; i++)
{
prop.setProperty(rs.getMetaData().getColumnName(i + 1), rs.getString(i + 1));
}
}
rs = st.executeQuery("select count(*) from tblgroupuser where user_id = " + id.getIdName());
if (rs.next())
{
this.group = new Identity[rs.getInt(1)];
}
rs = st.executeQuery("select * from tblgroupuser where user_id = " + id.getIdName());
int i = 0;
while (rs.next())
{
group[i] = new IdentityImpl(Identity.GROUP, "DBGroup", rs.getString("group_id"));
i++;
}
rs = st.executeQuery("select count(*) from tbluserrole where user_id="+id.getIdName());
if(rs.next())
{
role = new Identity[rs.getInt(1)];
}
rs = st.executeQuery("select * from tbluserrole where user_id="+id.getIdName());
i = 0;
while(rs.next())
{
role[i] = new IdentityImpl(Identity.ROLE,"DBRole",rs.getString("role_id"));
i++;
}
conn.close();
return this;
} catch (SQLException e)
{
e.printStackTrace();
}
return null;
}
public static void main(String[] args)
{
try
{
Class.forName("org.fswan.permission.db.DBPermission");
IdentityImpl id = new IdentityImpl(Identity.USER, "DBUser", "1");
System.out.println(id.newInstance());
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (IdentityMappingError e)
{
e.printStackTrace();
}
}
}
===============SQL ================
CREATE TABLE tblgroup
(
id serial NOT NULL,
name varchar(80),
description varchar(400),
manager varchar(20)
)
CREATE TABLE tblgroupgroup
(
id serial NOT NULL,
parent_id int4 NOT NULL,
child_id int4 NOT NULL
)
CREATE TABLE tblgrouprole
(
id serial NOT NULL,
group_id int4 NOT NULL,
role_id int4 NOT NULL
)
CREATE TABLE tblgroupuser
(
id serial NOT NULL,
user_id int4 NOT NULL,
group_id int4 NOT NULL
)
CREATE TABLE tblpermission
(
id serial NOT NULL,
name varchar(50) NOT NULL,
subname varchar(50),
property varchar(2000),
"type" varchar(200) NOT NULL
)
CREATE TABLE tblrole
(
id serial NOT NULL,
name varchar(50) NOT NULL,
description varchar(200)
)
CREATE TABLE tblrolepermission
(
id serial NOT NULL,
role_id int4 NOT NULL,
permission varchar(400) NOT NULL,
properties varchar(2000)
)
CREATE TABLE tbluser
(
id serial NOT NULL,
name varchar(50) NOT NULL,
description varchar(400),
email varchar(50),
mobile varchar(50)
)
CREATE TABLE tbluserrole
(
id serial NOT NULL,
user_id int4 NOT NULL,
role_id int4 NOT NULL
)