之前讲过基于webservice的权限管理系统的数据库设计,
今天我们就来介绍一下,用户登录功能
我们以用户发送一个xml的报文的形式作为程序的入口之处,如用户发送以下报文
<?xml version="1.0" encoding="utf-8"?> <data> <userNo>1</userNo> <userPwd>111111</userPwd> </data>
下面是调用本地客户端程序进行测试
//测试程序 //放入不同的报文以测试不同的功能模块 //测试时需要更改待输入的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>