之前讲过基于webservice的权限管理系统的数据库设计,
今天我们就来介绍一下,用户登录功能
我们以用户发送一个xml的报文的形式作为程序的入口之处,如用户发送以下报文
<?xml version="1.0" encoding="utf-8"?>
<data>
<userNo>1</userNo>
<userPwd>111111</userPwd>
</data>
其中userNo是用户名,userPwd是密码。
下面是调用本地客户端程序进行测试
//测试程序
//放入不同的报文以测试不同的功能模块
//测试时需要更改待输入的xml文件(第一行),和待调用的webservice方法(最后一行)
public static void main(String[] args) throws Exception {
Document document = new SAXReader().read(new File("resource/userService.xml"));
String xmlPara = document.asXML();
// 创建WebService客户端代理工厂
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// 注册WebService接口
factory.setServiceClass(MyService.class);
// 设置WebService地址
factory.setAddress("http://localhost:9000/MyService");
MyService service = (MyService) factory.create();
System.out.println(service.userService(xmlPara));
}
其中最后一行的是调用MyService中的userService方法,具体代码如下:
public String userService(String xmlPara) throws Exception {
String result=null;
SAXReader reader = new SAXReader();
Document document = null;
try {
//将xml信息解析为doucument对象
document = reader.read(new ByteArrayInputStream(xmlPara.getBytes("UTF-8")));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Element root = document.getRootElement();
Element userNo=root.element("userNo");
Element userPwd=root.element("userPwd");
System.out.println(userNo.getText());
UserDao userDao=new UserDao();
ObjectDao objDao=new ObjectDao();
int i=0;
int count=objDao.objListCount(userNo.getText());
if(userDao.userCount(userNo.getTextTrim(),userPwd.getTextTrim())>0){
Document document2 = DocumentHelper.createDocument();
Element root2 = document2.addElement("data");
Element rtnCode = root2.addElement("rtnCode");
rtnCode.addText("0000");
Element rtnMsg = root2.addElement("rtnMsg");
rtnMsg.addText("登陆成功");
Element userName=root2.addElement("userName");
userName.addText(userNo.getText());
Element departName=root2.addElement("departName");
departName.addText(userDao.query(userNo.getText()));
Element authSet=root2.addElement("authSet");
for(i=0;i<count;i++){
Element objNo = authSet.addElement("objNo");
objNo.addText(objDao.objList(userNo.getText()).get(i).getObjectNo()+"");
Element objName = authSet.addElement("objName");
objName.addText(objDao.objList(userNo.getText()).get(i).getObjectName());
Element description=authSet.addElement("description");
description.addText(objDao.objList(userNo.getText()).get(i).getDescription());
}
result=document2.asXML();
return result;
}
else{
Document document2 = DocumentHelper.createDocument();
Element root2 = document2.addElement("data");
Element rtnCode = root2.addElement("rtnCode");
rtnCode.addText("0001");
Element rtnMsg = root2.addElement("rtnMsg");
rtnMsg.addText("登陆失败");
Element userName=root2.addElement("userName");
userName.addText(userNo.getText());
Element departName=root2.addElement("departName");
departName.addText("无");
result=document2.asXML();
return result;
}
}
登陆模块可以看做是本系统的核心,比如A是一个管理员
登陆成功后,会返回他的用户信息(通过t_user表查得),返回他所在的部门名称,先获取他的部门编号,再根据t_depart获取他的部门名称
最后还要获取此用户下的所有操作列表,这个过程很复杂,大概涉及到4个表的查询操作,以下是它的数据库查询代码(查询用户名为1的用户下的操作列表)
select a.f_objectNo,a.f_objectName,a.f_description from t_object a,t_permission b,t_rolegrant c,t_roletouser d where d.f_userno='1' and c.f_roleno=
d.f_roleno and b.f_permissionno=c.f_permissionno and a.f_objectNo=b.f_objectNo
附上几个数据库查询的操作程序。
第一步。首先判断用户名和密码是否正确
/**
* 查询用户名和密码是否正确
* trim() 因为password在数据库中定义时是char(128)的,而实际过程中传进来的密码没有128位,因此就要去掉数据库中存储密码后面的空格,这样比对才能成功
* @param name 用户名
* @param password 密码
* @return 是否正确
* @throws Exception
*/
public int userCount(String name,String password)throws Exception{
int total=0;
conn = C3P0ConnentionProvider.getConnection();
ps = conn.prepareStatement("select count(*) as total from t_user where trim(f_userno) = ? and trim(f_userpwd) = ?");
ps.setString(1, name);
ps.setString(2, password);
rs = ps.executeQuery();
if(rs.next()){
total=rs.getInt(1);
return total;
}else{
return total;
}
}
第二步。根据他的用户名获取他的部门名称
/**
* 查询该用户名所在的部门
* @param no 用户名
* @return 部门名
*/
public String query(String no) {
String departname=null;
try {
conn = C3P0ConnentionProvider.getConnection();
ps = conn.prepareStatement("select f_departname from t_depart where f_departno= (select f_departno from t_user where f_userno=?)");
ps.setString(1, no);
rs = ps.executeQuery();
if(rs.next()){
departname=rs.getString(1);
}
}catch(Exception ex){
ex.printStackTrace();
}
return departname;
}
第三步:根据用户名获取他下面所拥有的菜单列表
/**
* 查询该用户下的菜单操作列表
* @param userno
* @return
* @throws SQLException
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public List<Obj> objList(String userno) throws SQLException{
List objList = new ArrayList();
conn = C3P0ConnentionProvider.getConnection();
String sql = "select a.f_objectNo,a.f_objectName,a.f_description from t_object a,t_permission b,t_rolegrant c,t_roletouser d
where d.f_userno=? and c.f_roleno=d.f_roleno and b.f_permissionno=c.f_permissionno and a.f_objectNo=b.f_objectNo" ;
ps = conn.prepareStatement(sql);
ps.setInt(1,Integer.parseInt(userno));
rs = ps.executeQuery() ;
while(rs.next()){
// 查询出内容,之后将查询出的内容赋值给obj对象
Obj obj=new Obj();
obj.setObjectNo(rs.getInt(1));
obj.setObjectName(rs.getString(2));
obj.setDescription(rs.getString(3));
//将查询出来的结果,放到objList之中
objList.add(obj);
}
return objList;
}
希望大家仔细品味,这是此权限管理系统的最重要之处。
以下是登陆用户发送的报文形式
<?xml version="1.0" encoding="UTF-8"?>
<data>
<userNo>1</userNo>
<userPwd>19910402</userPwd>
</data>
执行以上测试代码。会返回如下的形式
<?xml version="1.0" encoding="UTF-8"?>
<data><rtnCode>0000</rtnCode><rtnMsg>登陆成功</rtnMsg><userName>1</userName><departName>国光总公司</departName>
<authSet><objNo>2</objNo><objName>单位管理</objName><description>单位管理模块</description>
<objNo>1</objNo><objName>成员管理</objName><description>成员管理模块</description>
<objNo>3</objNo><objName>角色管理</objName><description>角色管理模块</description>
<objNo>4</objNo><objName>权限控制</objName><description>权限控制模块</description>
</authSet></data>
输入不同的用户名和密码会返回不同的部门和菜单列表
若用户名或密码不正确会返回以下形式
<?xml version="1.0" encoding="UTF-8"?>
<data>
<rtnCode>0001</rtnCode>
<rtnMsg>登陆失败</rtnMsg>
<userName>4</userName>
<departName>无</departName>
</data>