dorado框架权限控制实现方案参考
String hsql = \UserInfo u left join fetch u.roleInfo where u.username='\+ username + \ List ls = ht.find(hsql); if (ls.size() == 1) { UserInfo userinfo = (UserInfo) ls.get(0); HttpSession session=request.getSession(); session.setAttribute(Sys.LOGINUSER_IN_SESSION_KEY, userinfo); forward=action.findForward(\ String[] lan=language.split(\ Locale local=LocaleHelper.getLocale(lan[1],lan[0]); DoradoContext context=DoradoContext.getContext(); ResourceManager.getInstance().setDefaultLocale(context,context.SESSION, local); }else{ flag=true; } }else{ flag=true; } if(flag){ request.setAttribute(Sys.LOGIN_ERROR_INFO, \用户名密码有误,请确认后重试\ } return forward; } public ActionForward doLogout(Action action, HttpServletRequest request, HttpServletResponse response) throws Exception { request.getSession().invalidate(); AppLog.info(\ return action.findForward(\ } }
如果是合法用户则重定向到main.jsp页面进行系统操作,否则,的调转到login.jsp页面,并且显示错误信息。
由于main页面中的视图实现类实现了dorado.common.DefaultViewModelImplement这是一个自定义的视图实现类,实现该类的目的在于,对于受保护的dorado页面,都将继承自这个视图实现类,每当我们访问受保护的dorado页面时,就会自动先访问这个自定义的视图实现类,在这里我们进行了session级别的用户验证,查看当前访问的用户是否时有效用户,从而达到“未经授权或者登陆”的用户不能够访问该页面的效果。
具体实现代码如下:
第36页 共66页
dorado框架权限控制实现方案参考
public class DefaultViewModelImplement extends DynaViewModel {
protected DBStatement dbs;
HttpDoradoContext dc = null;
public void init(int arg0) throws Exception { } /**
* 判断当前用户是否登录,如果未登录则抛出系统异常AppSecurityException
if (dc == null) { }
super.init(arg0);
dc = (HttpDoradoContext) DoradoContext.getContext();
* 如果用户合法判断它是否有访问该页面的权限,没有抛出系统异常AppSecurityException
* 如果有访问该页面权限那么要从库中遍历出所有不能访问的组件,将其Ignored属性设置为true 这样就可以实现页面级别和组件级别的权限控制 */
protected void initControls() throws Exception {
super.initControls(); dbs = new DBStatement(); /**
* 判断用户是否登录 * */
VariantSet userInfo=(VariantSet)dc.getAttribute(dc.SESSION, if(userInfo==null){ }
String sql = \* from role_view rv where rv.roleid = :roleId\; dbs.setSql(sql);
dbs.parameters().setInt(\, userInfo.getInt(\)); List views=dbs.queryForList();
String configName=this.getConfigName(); int viewId = -1;
Iterator viewsIt=views.iterator(); boolean securityFlag=true; String viewConfig=null; /**
* 判断用户是否有访问当前页面的权限
throw new AppSecurityException();
Sys.LOGINUSER_IN_SESSION_KEY);
第37页 共66页
}
* */
dorado框架权限控制实现方案参考
while(viewsIt.hasNext()){ }
if(securityFlag){ } /**
* 找到用户不能访问的组件,将其Ignored设置为true * 使其不会在页面中输出 * */
sql = \dbs.setSql(sql);
dbs.parameters().setInt(\, userInfo.getInt(\)); dbs.parameters().setInt(\, viewId); List viewControls=dbs.queryForList();
Iterator controlsIt=viewControls.iterator(); while(controlsIt.hasNext()){
VariantSet vs = (VariantSet)controlsIt.next(); throw new AppSecurityException();
VariantSet roleView=(VariantSet)viewsIt.next(); sql = \; dbs.setSql(sql);
dbs.parameters().setInt(\,
VariantSet tempviewConfig = dbs.query();
viewConfig=tempviewConfig.getString(\); System.out.println(viewConfig); if(configName.equals(viewConfig)){ }
securityFlag=false;
viewId = roleView.getInt(\); break;
roleView.getInt(\));
rvc.roleid = :roleId and rvc.viewid = :viewId\;
this.getControl(vs.getString(\)).setIgnored(true); }
}
//关闭数据库连接
dbs.close();
第38页 共66页
dorado框架权限控制实现方案参考
10 Main框架菜单树的实现
当登陆成功之后,我们就进入了系统操作的主界面,此框架界面的预览图在前面章节有介绍过,主要部分为左边的菜单和右边的操作界面。
我们是如何实现菜单的动态加载的呢?
对于框架页面而言,无论iframe里面的页面如何变化,我们会发现地址栏里面的url是不会变化的,当我们点击左边的菜单树,访问右边iframe里面的页面之前我们都必须先访问一次main.jsp这个页面,利用这个特性我们可以来作权限检查,功能类似一个验证过滤器,如果没有登陆或者权限不够的用户是无法访问到未经授权的资源。 实现main.jsp页面:
建立main页面的视图,在dorado/main/下面建立Main.view.xml模型,然后添加各种菜单的组件,具体内容见代码:
menu=\ menu=\ 然后是关键的步骤,我们在该视图的实现类中进行各种关键业务逻辑的处理。 由于该类集成自DefaultViewModulImplement这个我们自己实现的视图模型实现类,所以在这里我们不用在考虑用户session级别的验证。直接进入我们在该页面中的主要业务逻辑,这也是一种开发设计利用继承关系的开发技巧。 在此类的initControls()中我们取出所有的菜单,实现代码如下: 第39页 共66页 dorado框架权限控制实现方案参考 protected void initControls() throws Exception { super.initControls(); dbs = new DBStatement(); String sql = \dbs.setSql(sql); List Menu menu=(Menu)this.getControl(\int size=ls.size(); VariantSet temp = null; for (int i = 0; i < size; i++) { } /** temp = ls.get(i); NavigateMenu navigateMenu= new NavigateMenu(); navigateMenu.setId(temp.getInt(\ navigateMenu.setMenuName(temp.getString(\navigateMenu.setMenuLabel(temp.getString(\navigateMenu.setMenuPath(temp.getString(\navigateMenu.setMenuIcon(temp.getString(\navigateMenu.setCreateTime(temp.getDate(\navigateMenu.setParentid(temp.getInt(\ MenuItem topMenuItem=menu.addItem(navigateMenu.getMenuName()); topMenuItem.setLabel(navigateMenu.getMenuLabel()); topMenuItem.setPath(navigateMenu.getMenuPath()); topMenuItem.setIcon(navigateMenu.getMenuIcon()); recursionMenu(dbs,topMenuItem,navigateMenu); * 动态菜单的递归加载方法 * */ private void recursionMenu(DBStatement dbs,MenuItem topItem,NavigateMenu 第40页 共66页