Dorado 5 : 10.3.角色授权 (T22)

概述

Dorado提供了角色配置文件的功能。通过角色配置文件,可以方便的实现对界面显示控制。在应用程序当中常常会需要这种功能,即同一组界面当不同的用户访问时这组界面需要以不尽相同的方式展现给用户。例如:表格中的"价格"信息只有当"部门经理"及更高职位的用户访问时才可见, 而对于其它用户则是隐藏的。这种逻辑规则可以非常方便的利用dorado中的role文件来进行描述。本示例的链接如下:

 

准备工作

新建一工程security,并且配置好数据库,具体步骤参考3.1.2节。

开发步骤

添加Dataset

步骤1:添加一Common ViewModel,文件名为RoleConfig。
步骤2:为RoleConfig添加一ViewModel实现,代码如下:

import java.util.List;
import com.bstek.dorado.common.DoradoContext;
import com.bstek.dorado.data.db.DBStatement;
import com.bstek.dorado.utils.variant.VariantSet;
import com.bstek.dorado.view.DefaultViewModel;
import com.bstek.dorado.view.control.Menu;
import com.bstek.dorado.view.control.MenuItem;
import com.bstek.dorado.view.control.MenuItemContainer;
/**
 * RoleConfigViewModel
 */
public class RoleConfigViewModel extends DefaultViewModel {
    private void createMenuItem(MenuItemContainer itemContainer, String parentId)
            throws Exception {
        DBStatement st = new DBStatement();
        try {
            st.setSql(DBStatement.SELECT, "category");
            if (parentId == null) {
                st.parameters().setString("parent_id", "$null");
            } else {
                st.parameters().setString("parent_id", parentId);
            }
            List list = st.queryForList();
            int sz = list.size();
            for (int i = 0; i < sz; i++) {
                VariantSet category = (VariantSet) list.get(i);
                String categoryId = category.getString("category_id");
                MenuItem item = itemContainer.addItem(categoryId, category
                        .getString("category_name")
                        + "[" + categoryId + "]");
                createMenuItem(item, categoryId);
            }
        } finally {
            st.close();
        }
    }
    public void init(int state) throws Exception {
        DoradoContext context = DoradoContext.getContext();
        setRole(context.getParameter("role"));
        super.init(state);
    }
    protected void initControls() throws Exception {
        super.initControls();
        Menu menu1 = (Menu) getControl("menu1");
        createMenuItem((MenuItemContainer) menu1, null);
    }
}

步骤3:添加一FormDataset,id设置为datasetRole,添加一Filed,name设置为role。
步骤4:添加一AutoSqlDataset,选择表employee,选择所有字段,属性设置如下:

属性

Id

datasetEmployee

originTable

EMPLOYEE

pageSize

20

 

添加DropDown、TextEditor

步骤1:添加一ListDropDown,属性设置如下:

属性

fixed

true

id

dropdownRole

步骤2:为dropdownRole添加4个Item,label设置为空,value分别设置为role1,role2,role3,role4.
步骤3:添加一TextEditor,属性设置如下:

属性

dataset

datasetRole

dropDown

dropdownRole

field

role

id

editorRole

 

添加RequestCommand和Button

步骤1:添加一RequestCommand,属性设置如下:

属性

dataset

datasetRole

id

commandRefresh

path

role-config.jsp

步骤2:为commandRefresh的beforeExecute事件添加如下代码:

if (!datasetRole.getValue("role")) { 
	 return new DoradoException("请选择一个角色!"); 
}

步骤3:添加一Button,属性设置如下:

属性

command

commandRefresh

id

buttonRefresh

value

使用此角色访问本页面

 

添加SubWindow和Button

步骤1:添加一SubWindow,属性设置如下:

属性

id

subwindow

title

这是角色[${Request.role}]所看到的视图

步骤2:添加一Button,属性设置如下:

属性

id

button1

value

按钮1

步骤3:添加一Button,属性设置如下:

属性

id

button2

value

按钮2

步骤4:添加一Button,属性设置如下:

属性

id

button3

value

按钮3

 

添加Menu、MenuBar和DataTable

步骤1:添加一Menu,属性设置如下:

属性

id

menu1

popupContainer

document.body

步骤2:添加一MenuBar,属性设置如下:

属性

id

menubar1

menu

menu1

步骤3:添加一DataTable,属性设置如下:

属性

id

tableEmployee

height

100%

width

100%

dataset

datasetEmployee

 

添加角色配置文件

步骤1:选中View的根节点,点击"Open Role Config"按钮,会提示要不要创建Role Config,选择是,如下图所示:

步骤2:添加一个角色,设置其角色名为role1,为其添加EL表达式,如下图所示:

为role1添加的EL表达式如下:

datasetEmployee.getField("email").setVisible(false) 
datasetEmployee.getField("cmnt").setVisible(false) 
menu1.findItem("1").setVisible(false) 
menu1.findItem("2/21").setDisabled(true) 
menu1.findItem("2/22").setVisible(false)

步骤3:添加一角色role2,设置其template为role1,为role1添加的EL表达式如下:

button1.setIgnored(true) 
button2.setDisabled(true) 
datasetEmployee.getField("salary").setReadOnly(true) 
menu1.findItem("2/1").setDisabled(true) 
menu1.findItem("2/2").setDisabled(true) 
menu1.findItem("3").setDisabled(true)

步骤4:添加一角色role3,为role1添加的EL表达式如下:

button2.setIgnored(true) 
button3.setIgnored(true) 
menubar1.setIgnored(true)

步骤5:添加一角色role4,为role1添加的EL表达式如下:

tableEmployee.setIgnored(true)

创建Jsp页面

生成Jsp页面以后再编辑一下布局,最后结果如下:

<%@ page contentType="text/html; charset=UTF-8" %> 
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %> 
 <html> 
 <head> 
 <title></title> 
 </head> 
 <body style="overflow: hidden"> 
 <d:View config="RoleConfig"> 
 <d:Layout type="border"> 
 <d:Pane position="top"> 
 <d:Layout type="hflow" height="1"> 
 <d:Pane> 
 角色 
 </d:Pane> 
 <d:Pane> 
 <d:TextEditor id="editorRole" /> 
 </d:Pane> 
 <d:Pane> 
 <d:Button id="buttonRefresh" /> 
 </d:Pane> 
 </d:Layout> 
 </d:Pane> 
 <d:Pane position="center"> 

 <d:SubWindow id="subwindow" width="100%" height="100%" 
draggable="false" resizable="false" showMinimizeButton="false" 
showMaximizeButton="false"> 
 <d:Layout type="border"> 
 <d:Pane position="top"> 
 <d:MenuBar id="menubar1" /> 
 </d:Pane> 
 <d:Pane position="center"> 
 <d:DataTable id="tableEmployee" /> 
 </d:Pane> 
 <d:Pane position="bottom"> 
 <d:Layout type="hflow" height="1"> 
 <d:Pane> 
 <d:Button id="button1" /> 
 </d:Pane> 
 <d:Pane> 
 <d:Button id="button2" /> 
 </d:Pane> 
 <d:Pane> 
 <d:Button id="button3" /> 
 </d:Pane> 
 </d:Layout> 
 </d:Pane> 
 </d:Layout> 
 </d:SubWindow> 
 </d:Pane> 
 </d:Layout> 
 </d:View> 
 </body> 
 </html>

查看运行效果

启动服务器后,浏览效果如下:

知识点

本节知识点为角色配置文件的使用。关于角色配置文件,可以参考《dorado 5 用户指南 1.1》的第13章。