一、在本系统中,权限管理分为两种,功能权限和数据权限。
1、功能权限。即用户是否对某一功能是否有操作权限的控制。
(1)菜单控制:当用户不具备某一菜单操作权限时,看不到相应的菜单。
(2)操作控制:可以控制是否可看到某个按钮。例如当一个用户对只有查看权限,没有增加、修改、删除的权限,则进入菜单后,看不到增加、修改、删除的按钮。
(3)链接控制:如果你不具备某操作的访问权限,但你知道这个操作的链接地址,直接在地址栏中输入地址访问时,也会被拦截。
2、数据权限。即可以访问哪些数据,是针对特定功能的。如对于客户数据,可控制能看到本人的、本部门的、还是全公司的数据。
二、功能权限定义。
1、在struts.xml中,定义了两个过滤器,分别用于是否登录验证和权限验证。其中权限验证中包含有是否登陆的验证。如果一个action访问只需要验证用户是否已登陆,则用前者验证。如果一个action还需要验证用户是否有访问该action的权限,则用后者验证。
<interceptors>
<interceptor name="loginInterceptor" class="com.abc.domain.common.util.LoginInterceptor"></interceptor>
<interceptor name="accessInterceptor" class="com.abc.domain.common.util.AccessInterceptor"></interceptor>
<!-- 是否登录控制 -->
<interceptor-stack name="isLogin">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="loginInterceptor"/>
</interceptor-stack>
<!-- 是否有操作权限,包含有是否登录的功能 -->
<interceptor-stack name="canAccess">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="accessInterceptor"/>
</interceptor-stack>
</interceptors>
2、LoginInterceptor.java中的登录验证
UserInfoLogin userInfo = (UserInfoLogin) ActionContext.getContext().getSession().get("userInfo_login");
if (userInfo != null)
{//正确登录,验证是否重复提交
//......(略)
}
else
{//未正确登录
ActionContext.getContext().getSession().put("errorInfo","登录信息丢失,请重新登录!");
return "gotoLogin";
}
3、AccessInterceptor.java中的权限验证
List<CandoDto> CandoList = userInfo.getCandoList(); // 所有可以访问的功能点
String methodName = invocation.getProxy().getMethod(); //所访问方法的名称
Class cls=invocation.getAction().getClass();//所访问的action类
Method m=cls.getMethod(methodName); //所访问的方法
//重复提交验证
Token token = m.getAnnotation(Token.class);
if (token != null)
{
return super.doIntercept(invocation);
}
//是否需要权限限制,只有有Access注释标签 的方法才会进行验证
Access annotation = m.getAnnotation(Access.class); //找到方法的权限代码
if(annotation==null) //如果为null,没有权限注释,无需控制
{
return invocation.invoke();
}
//方法访问权限验证
String accName=cls.getName()+"."+methodName;//所访问的类全名+方法名
boolean canAcc=false;//是否通过验证
if(CandoList!=null && CandoList.size()>0)
{
for(CandoDto candoDto:CandoList)
{
String classMethod=candoDto.getClassMethod();
if(classMethod!=null && classMethod.indexOf(accName)!=-1)
{//找到匹配项,说明有该方法权限
canAcc=true;
break;
}
}
}
if(!canAcc)
{
ActionContext.getContext().put("errorInfo", "你没有访问权限,请与管理员联系!");
return "noAccess";
}
return invocation.invoke();
4、Access.java
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Access
{
}
5、ModuleFere类中定义了对按钮的权限过滤方法。
public static Button[] getCanShowButton(Button[] buttons,String moduleId)
{
Module module=moduleMap.get(moduleId);
List<Operation> operations=module.getOperations();
//当前模块未定义动作的,不进行控制
if(operations==null || operations.size()==0)
{
return buttons;
}
//开发人员和系统管理员 不作权限控制
UserInfoLogin userInfo = (UserInfoLogin) ActionContext.getContext().getSession().get("userInfo_login");
if(userInfo.isAdmin() || userInfo.isDev())
{
return buttons;
}
List<Button> ls=new ArrayList<Button>();//存放可使用的按钮
Map<String,String> myOpeMap=userInfo.getMyOpeMap();
for(Button button:buttons)
{
String type=button.getType();
if(type==null || "".equals(type.trim()))
{//按钮无类型时,不需要控制
ls.add(button);
continue;
}
for(Operation ope:operations)
{//当前模块定义的操作
if(ope.getType().equals(button.getType()))
{//操作类型与按钮类型相匹配时,表示同一动作
if(myOpeMap.get(ope.getId())!=null)
{//如果当前用户的所有操作中有该操作权限,则可使用此按钮。
ls.add(button);
}
break;
}
}
}
Collections.sort(ls);
return ls.toArray(new Button[ls.size()]);
}
三、模块中对功能权限的使用。
1、在需要使用登录验证的action类之前,加入isLogin过滤器,需要进行权限验证的action类之前,加入canAccess验证。
@InterceptorRef("isLogin ")
public class MyClientAction
{}
或者
@InterceptorRef("canAccess")
public class MyClientAction
{}
2、在action类的方法中,有需要进行权限验证的方法前,加入access注释。这个注释只有在加有canAccess过滤器的类中才有效。
@Access
public String add() throws Exception
3、action方法中,需要对按钮进行权限验证过滤。
queryFere.setTopButtons(ModuleFere.getCanShowButton(buttonArr,ModuleFactory_myClient.moduleId));
4、在模块定义中的按钮定义。
如:ModuleFactory_myClient.java中在按钮的定义中,有该按钮功能所需要访问的action的方法,该参数会在AccessInterceptor.java过滤器中使用,以验证用户是否有访问的权限。
ops.add(new Operation(moduleId+"_01", "增加", "add", "com.abc.domain.kh.main.inside.action.MyClientAction.add,com.abc.domain.kh.main.inside.action.MyClientAction.addDone"));
ops.add(new Operation(moduleId+"_02", "修改", "update", "com.abc.domain.kh.main.inside.action.MyClientAction.update,com.abc.domain.kh.main.inside.action.MyClientAction.updateDone"));
四、角色维护中对权限的管理。
1、相关的类
(1)Module和Operation,模块类和操作类,分别对应模块的定义和模块下面操作(按钮)的定义。
(2)Menu,菜单类,里面记录有一个菜单使用的是哪个模块。
(3)Role,Cando,DataAccess分别是角色类,角色可操作的功能权限,角色可操作的数据权限。
(4)DataAccessFere,数据权限管理辅助类。
2、源码查看
(1)Role.java
public class Role implements Comparable<Role>
{
@Id
@GeneratedValue(generator = "uuidGenerator")
@GenericGenerator(name = "uuidGenerator", strategy = "uuid")
@Column(length = 32)
private String id;
@Column(length = 20)
private String name;//名称
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = "role")
private List<Cando> candoes; //可以进行的操作
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = "role")
private List<DataAccess> dataAccesss; //数据权限
}
(2)Cando.java
public class Cando implements Comparable<Cando>
{
@Id
@GeneratedValue(generator = "uuidGenerator")
@GenericGenerator(name = "uuidGenerator", strategy = "uuid")
@Column(length = 32)
private String id;//标识
@Column(length = 10)
private String menuCode;//对应的菜单编码
@Column(length = 32)
private String moduleId;//模块ID
@Column(length = 32)
private String operationId;//对应的操作ID
@Column
private int moduleVer = 1; //模块版本
@Column(length = 500)
private String classMethod; //由Operation冗余来,多处使用
@ManyToOne
@JoinColumn(name = "role", insertable = true, updatable = true)
private Role role; //对应的角色
}
(3)DataAccess.java
public class DataAccess
{
@Id
@GeneratedValue(generator = "uuidGenerator")
@GenericGenerator(name = "uuidGenerator", strategy = "uuid")
@Column(length = 32)
private String id;//标识
@Column(length = 20)
private String type;//类型(控制的那个数据项)
@Column
private int value;//值
@Column(length = 50)
private String des;//描述
@ManyToOne
@JoinColumn(name = "role", insertable = true, updatable = true)
private Role role; //对应的角色
}
(4)DataAccessFere.java,需要增加一个新数据权限管理时,只需要在该类中加入如下一段代码即可。
{//客户数据权限
String name=kh;
String des="客户信息";
List<DataAccessDto> ls = new LinkedList<DataAccessDto>();
ls.add(new DataAccessDto(1, "本人的数据", true));
ls.add(new DataAccessDto(2, "本部门及所有下级部门的数据", false));
ls.add(new DataAccessDto(3, "全公司的数据", false));
accMap.put(name, ls);
nameMap.put(name, des);
}
五、UserInfoLogin.java中对权限的支持的。
该类是用户登录信息保存类,在一个用户登录时,就会创新一个这样的类,放在用户session中,里面存放的是当前用户的一系列相关信息。和权限有关的属性有:
private List<CandoDto> CandoList;//用户所有可操作的Cando
private Map<String, Integer> dataAccessMap; //数据权限
private Map<String, String> myOpeMap;//我的操作map(操作ID,操作ID)
返回《易道客》主页
分享到:
相关推荐
ISO 10005:2018 质量管理 - 质量计划的准则 - 完整英文版.pdf
3. **风险管理过程**:这是标准的核心部分,详细描述了风险管理的五个阶段: - **风险分析**:识别医疗器械在整个生命周期内的潜在危害及其原因。 - **风险评价**:评估已识别危害可能导致的风险水平。 - **风险...
由于客巴经常更新,故专门做了一个下载道巴的专版。软件下载的是图片格式的PDF,所以想下原版的还是别下载了。另外,再重申一下,软件完全免费,但为防止被不良商家非法倒卖,加了一点小限制,介意的也不要下了,...
新版完整标准 EN 62133-2-2017+A1-2021.pdf
例如,车载充电器、电池管理系统、传感器和其他电子组件都需要满足相应的IP等级要求,以确保其安全性和耐用性。 "一键改名.bat"可能是一个批处理文件,用于批量更改文件或文件夹的名称,这在处理大量相关文件时非常...
一、电气安全要求 设备设计与制造: 充电桩的设计应符合国际和新加坡的电气安全标准,确保在正常使用和故障条件下均不会对人员、车辆或电网造成危害。 充电桩的制造应采用高质量的材料和工艺,确保设备的稳定性和...
五、内部审核和管理评审 * 内部审核是指组织对环境管理体系的内部审核,以评估环境管理体系的有效性和遵守性。 * 管理评审是指最高管理者对环境管理体系的审核和评估,以确保环境管理体系的有效性和连续性。 六、...
IEC 61851-23-2023_中文版.pdf
在现代企业管理中,OA(Office Automation)系统已成为提升工作效率、优化管理流程的重要工具。OA系统管理制度作为确保系统高效运行的基石,其重要性不言而喻。本文将深入探讨OA系统管理制度的关键要素,以及如何在...
IEC 62264-6:2020(E)为一组抽象服务定义了一个技术独立的模型,它位于OSI模型的应用层之上,用于交换基于IEC 62264-5中定义的交易模型的交易信息。该模型被称为信息服务模型(MSM),旨在实现制造运营领域的应用和...
"道客下载器"是一款专为用户设计的网络资源下载工具,它主要的功能是帮助用户高效、便捷地下载网络上的各种文件,包括但不限于文档、视频、音频、软件等。这款下载器以其强大的下载能力和易用性深受用户喜爱。在本文...
新版思修法第五章遵守道德规范锤炼高尚品格 新版思修法第五章的主要内容是关于社会公德、职业道德、家庭美德和个人品德等方面的道德规范和要求。其中,社会公德是指人类群体在公共场合的社会生活,即人们在社会公共...
2020年世界发展报告:在全球价值链时代-以贸易促发展(中英)-世界银行-2019.11-312页(4).pdf
ISO 643-2019.pdf
《医疗器械生产质量管理规范附录独立软件》是针对独立软件在医疗器械行业中生产和质量管理的特殊规定,旨在确保医疗器械软件的安全性、有效性和合规性。本规范遵循软件生存周期过程和网络安全的基本原则,涵盖了人员...
本软件实现了将文档上传到道客巴巴网站的功能,支持账号切换,文档批传,标签自动获取等功能。是网赚最受欢迎的工具,真正做到灵活赚钱。
3. **风险管理**:标准要求制造商进行风险评估和风险管理,识别潜在的危险源并采取措施减少或消除风险,确保设备的安全性。 4. **电磁兼容性(EMC)**:医疗电气设备应能抵抗外部电磁干扰,并且自身产生的电磁辐射不...
泡泡玛特的市场表现和策略与乐高有着相似之处,即通过汇集头部IP、持续创新以及扩展产品矩阵,依托互联网和线下渠道加速品牌知名度的建设。泡泡玛特的成功同样源于其构建的品牌力护城河和在潮玩市场中的龙头地位。...
"BS 1363-1-2016+A1-2018.pdf知识点" BS 1363-1-2016+A1-2018.pdf是英国标准机构(BSI)发布的一份关于插头、插座、适配器和连接单元的规范。该规范的主要内容包括: 1. 范围:该规范适用于英国的插头、插座、...