[03]基于webservice的权限系统

之前讲过基于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>


 
 
 
 

你可能感兴趣的:(java,xml,webservice,登陆验证,权限系统)