随笔-39  评论-33  文章-0  trackbacks-0

说明:newxyweb快速开发框架,下文说明了如果利用标签实现访问控制。第一、二、三项中的用户管理、业务管理、业务分配可下载《部门及用户权限管理(第三版)来实现。第四、五项介绍了用户登录过程获取业务操作权限信息,及如何实现访问控制。第六项的登录页面login.jsp可作参考。

下载: <nbean:right/> 标签实现访问控制 http://www.newxy.net/zh_cn/download/index.jsp

 

web 开发中,难免要对一些页面进行访问控制, newxy <nbean:right/> 可以帮助建立两种访问控制方法,首先建立三个表。

     一、建立用户、业务、用户业务关系表

/* 用户表 */

create table t_user(

  user_id int primary key,

  user_name varchar(50) not null,

  user_pass varchar(50) not null

)

;

/* 用户名的唯一索引 */

create unique index idx_user_name on t_user(user_name)

;

 

/* 业务 */

create table t_business(

    business_id int primary key,

    title varchar(255) not null,

    intro text null,

    type int null /* 分类 */

)

;

create unique index idx_business on t_business(title)

;

 

/* 用户 - 业务 */

create table r_user_business(

    user_business_id int primary key,

    user_id int not null,

    business_id int not null,

    find char(1) default '1',

    remove char(1) default '0',

    upinsert char(1) default '0',

    scope char(1) default '0',/* 操作范围 ,0: 顶级单位范围内 ,1: 本部门内 */

    type int null /* 分类 */

)

;

create unique index idx_user_business on r_user_business(user_id,business_id)

;

表结构可自定,此处的定义只作参考。

二、设定业务

假设有三个 jsp 页面,分别是 /jsp1.jsp /jsp2.jsp /jsp3.jsp 。上有三项业务,暂以 jsp 文件名作为业务名,插入三条记录。

        BaseDAO dao=new BaseDAO();

        DynaDto dto=new DynaDto();

        dto.set_table("t_business");

        dto.set(“title”,”jsp1”);

        dao.update(dto);

        dto= new DynaDto();

        dto.set_table("t_business");

        dto.set(“title”,”jsp2”);

        dao.update(dto);

        dto= new DynaDto();

        dto.set_table("t_business");

        dto.set(“title”,”jsp3”);

        dao.update(dto);

 

    三、分配权限

建一权限管理模块,维护 " 用户 - 业务 " 表。假设有一用户的 user_id=1 ,有一业务的 business_id=1 ,可分两种情况:

1.  业务操作只分有权和无权

赋给该用户操作权限,只需插入一条记录

        BaseDAO dao=new BaseDAO();

        DynaDto dto=new DynaDto();

        dto.set_table("r_user_business");

        dto.set(“user_id”,”1”);

        dto.set(“business_id”,”1”);

       dao.update(dto);

    删除该用户权限,只需删除这条记录

    String sql=”delete from r_user_right where user_id=1 and business_id=1;”

    dao.prepareCall(sql);

2.  业务操作分多种情况,如查询、删除、插入更新等

    设定该用户查询权

        BaseDAO dao=new BaseDAO();

        DynaDto dto=new DynaDto();

        dto.set_table("r_user_business");

        dto.set(“user_id”,”1”);

        dto.set(“business_id”,”1”);

        dto.set(“find”,”0”); // dto.set(“find”,”1”); 0: 无权, 1: 有权

        dao.update(dto);

    设定该用户删除权

        BaseDAO dao=new BaseDAO();

        DynaDto dto=new DynaDto();

        dto.set_table("r_user_business");

        dto.set(“user_id”,”1”);

        dto.set(“business_id”,”1”);

        dto.set(“remove”,”0”);// dto.set(“remove”,”1”); 0: 无权, 1: 有权

        dao.update(dto);

    设定该用户插入更新权

        BaseDAO dao=new BaseDAO();

        DynaDto dto=new DynaDto();

        dto.set_table("r_user_business");

        dto.set(“user_id”,”1”);

        dto.set(“business_id”,”1”);

        dto.set(“upinsert”,”0”);//dto.set(“upinsert”,”1”); 0: 无权, 1: 有权

        dao.update(dto);

 

    四、用户登录时在会话中建立有关权限 bean

    在用户登录时对用户名及口令验证,如果成功,在会话中加入权限 bean

假设这过程是在 struts action 中完成的, struts 配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>

  <global-forwards>

    <forward name="index" path="/index.jsp" />

  </global-forwards>

  <action-mappings>

    <action input="/login.jsp" parameter="method" path="/actionLogin" type="test.ActionLogin" />

  </action-mappings>

</struts-config>

 

有一个 action ,登录用,这个 action 没有 formBean

这个用于登录的 action 类如下:

package action;

 

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.Action;

import org.apache.commons.beanutils.DynaBean;

import net.newxy.dbm.BaseDAO;

 

public class ActionLogin extends Action {

    public ActionForward execute(ActionMapping actionMapping,

                               ActionForm actionForm,

                               HttpServletRequest servletRequest,

                               HttpServletResponse servletResponse) {

        BaseDAO dao=new BaseDAO();

        String user=servletRequest.getParameter("user_name");

        String pass=servletRequest.getParameter("user_pass");

        String sql="select * from t_user where user_name='"

                   +user+"' and user_pass='"+pass+"'";

        // 验证过程是判断数据库中是否保存了此用户

        List list=null;

        try {

            list = dao.list(sql);

            if(list.size()==0){

                // 没查到此用户,返回到登录页面

                servletRequest.setAttribute("message"," 用户名或口令错误! ");

                return actionMapping.getInputForward();

            }

        }

        catch (Exception ex) {

            // 发生错误,返回到登录页面

            servletRequest.setAttribute("message"," 用户登录时发生错误! "+ex.getMessage());

            return actionMapping.getInputForward();

        }

 

        // 执行到此处表明 list.size>0 ,用户存在于数据库中,

        DynaBean bean=(DynaBean)list.get(0);

        servletRequest.getSession(false).setAttribute("user",bean);

 

        // 将用户的权限信息提取出,保存到会话中。

        sql="select c.*, b.find,b.remove,b.upinsert from t_user a,r_user_business b,t_business c where a.user_name='"

            +user+"' and a.user_id=b.user_id and b.business_id=c.business_id";

        try {

            list = dao.list(sql);

            servletRequest.getSession(false).setAttribute("right",list);

        }

        catch (Exception ex1) {

        }

        return actionMapping.findForward("index");

    }

}

用户登录成功后会话中的 user 保存了户用户基本信息, right 保存了用户的权限信息。

right _coll 属性是集合类型,结构如下:

Business_id

title

find

remove

upinsert

1

Jsp1

0

0

0

2

Jsp2

1

1

1

 

五、使用 <nbean:right/>

假设对 jsp1.jsp 的访问只分有权和无权,可在 jsp1.jsp 上放上 <nbean:right/> 标签:

<%@ page contentType="text/html; charset=GBK" %>

<%@ taglib uri="/WEB-INF/newxy-bean.tld" prefix="nbean"%>

 

<nbean:right name="right" fieldName="business_id" fieldValue="1"/>  

 

<html>

<head>

<title>

jsp1

</title>

</head>

<body bgcolor="#ffffff">

   ……

</body>

</html>

    标签在会话中找到名为“ right ”的 bean 后,在 bean _coll 中以 business_id 为字段名,以 ”1” 为字段值查找,如果找到,表明有权,后面代码继续,如果找不到,表明无权,打印出“没有权限”或自定义的提示信息,后面代码被忽略。

    如果会话已过期,标签会提示,并且后面内容不再显示,以免出错。

 

    假设对 jsp2.jsp 的访问分查询、删除、插入更新。可在 jsp2.jsp 页上加入 <nbean:right/> 如下:

 

<%@ page contentType="text/html; charset=GBK" %>

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

 

<%@ taglib uri="/WEB-INF/newxy-html.tld" prefix="nhtml"%>

<%@ taglib uri="/WEB-INF/newxy-logic.tld" prefix="nlogic"%>

<%@ taglib uri="/WEB-INF/newxy-bean.tld" prefix="nbean"%>

 

<nbean:right name="right" fieldName="business_id" fieldValue="2"/>

 

<html>

<head>

<title>

jsp2

</title>

</head>

<body bgcolor="#ffffff">

<logic:equal value="1" name="var1">

  <font size="3" color="blue"> 有只读权 </font>

</logic:equal>

<logic:equal value="2" name="var1">

  <font size="3" color="blue"> 有读写权 </font>

</logic:equal>

<h3>

  本页文件: jsp2.jsp

  <logic:present name="user" scope="session">

    ,用户: <bean:write name="user" property="user_name"/>

  </logic:present>

</h3>

 

<hr />

可在“有权”的地方插入相关代码

<p></p>

 

<nbean:right name="right" fieldName="business_id" fieldValue="2" lookupField="find" var="varFind"/>

<logic:equal value="0" name="varFind">

  无查询权 <br />

</logic:equal>

<logic:equal value="1" name="varFind">

  有查询权 <br />

</logic:equal>

 

<nbean:right name="right" fieldName="business_id" fieldValue="2" lookupField="remove" var="varRemove"/>

<logic:equal value="0" name="varRemove">

  无删除权 <br />

</logic:equal>

 

<logic:equal value="1" name="varRemove">

  有删除权 <br />

</logic:equal>

 

<nbean:right name="right" fieldName="business_id" fieldValue="2" lookupField="upinsert" var="varUpInsert"/>

<logic:equal value="0" name="varUpInsert">

  无插入更新权 <br />

</logic:equal>

 

<logic:equal value="1" name="varUpInsert">

  有插入更新权 <br />

</logic:equal>

</body>

</html>

 

标签在会话中找到名为“ right ”的 bean 后,在 bean _coll 中以 ”business_id” 为字段名,以 ”1” 为字段值查找,如果找不到,表明无权,打印出“没有权限”或自定义的提示信息,后面代码被忽略。如果找到这条记录,以属性 var 的属性值 ( ”varFind”) 为变量,将 lookupField 属性值(如 “find” )为字段名的值赋给此变量,保存到 toScope 中。

标签得到名为 “varFind” bean 后,根据 varFind 的值是 0 还是 1 ,判断用户是否有查询权。

 

六、参考页面

登录页面 login.jsp 代码:

<%@ page contentType="text/html; charset=GBK" %>

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>

<html>

<head>

<title>

login

</title>

</head>

<body bgcolor="#ffffff">

<h1>

登录

</h1>

 

<!-- 显示用户登录失败时的提示信息 -->

<logic:notEmpty name="message" scope="request">

   <bean:write name="message"/>

</logic:notEmpty>

<hr />

<form method="post" action="/MyWeb/actionLogin.do">

  <input type="text" name="user_name"/>

  <input type="text" name="user_pass"/><br />

  <input type="submit" name="Submit" value=" 登录 ">

  <input type="reset" value=" 取消 ">

</form>

</body>

</html>

 

主页面 index.jsp 代码:

<%@ page contentType="text/html; charset=GBK" %>

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

 

<%@ taglib uri="/WEB-INF/newxy-html.tld" prefix="nhtml"%>

<%@ taglib uri="/WEB-INF/newxy-logic.tld" prefix="nlogic"%>

<%@ taglib uri="/WEB-INF/newxy-bean.tld" prefix="nbean"%>

 

<html>

<head>

<title>

index

</title>

</head>

<body bgcolor="#ffffff">

<h1>

  主页面

  <logic:present name="user" scope="session">

    ,用户: <bean:write name="user" property="user_name"/>

  </logic:present>

</h1>

<logic:notEmpty name="message" scope="request">

  <bean:write name="message"/>

</logic:notEmpty>

<hr />

<logic:present name="right" scope="session">

  <ul>

    <li>

      <html:link page="/jsp1.jsp">jsp1.jsp

      </html:link>

    </li>

    <li>

      <html:link page="/jsp2.jsp">jsp2.jsp

      </html:link>

    </li>

    <li>

      <html:link page="/jsp3.jsp">jsp3.jsp

      </html:link>

    </li>

  </ul>

</logic:present>

<logic:notPresent name="right" scope="session">

  <html:link page="/login.jsp"> 登录

  </html:link>

</logic:notPresent>

</body>

</html>

 

 

newxy 新坐标网站: http:/www.newxy.net

 

posted on 2007-03-04 09:17 newxy新坐标 阅读(1642) 评论(1)  编辑  收藏

评论:
# hclplfrb 2007-06-14 09:53 | hclplfrb
fmdmqrsf http://wypryorc.com iehdrbcu xvcsyktz  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问