我现在只是一个小的BBS项目,怎么自己写代码来控制权限呢(可以通过spring security来控制权限,不过现在不想去搞那个,那个打算以后去研究),想通过资源,角色,用户他们来管理,它们之间的关系我懂,只是资源这部份怎么写呢?最好
能贴出点代码
能贴出点代码
解决方案 »
- session 关闭问题
- 北京软件公司比较好的有那些啊?
- struts2 <s:if>传值比较的问题o(╯□╰)oo(╯□╰)oo(╯□╰)oo(╯□╰)oo(╯□╰)oo(╯□╰)oo(╯□╰)oo(╯□╰)o
- 从缓存中查询数据!
- javaee Hibernate 入门提问
- Struts2无法在Tomcat里运行,直接报404
- 有关JBoss的课题
- 新人请教下哪位师兄有struts基础点的电子书籍啊?谢谢帮下忙顺便问下struts到底是怎么学才最好呢?
- 高手请教 10帖内结帖 高分相送!·!
- j2ee开发ejb不成功,sun的j2ee开发文档看了好几遍!如果有人有成功经验,请指教,分数我有多少给多少?
- 求大大们了,刚进公司就遇到难题了!
- 做到一半突然间Myeclipse不见了,怎么回事?
`model` varchar(255) NOT NULL,
`privilegeValue` varchar(255) NOT NULL,
`name` varchar(255) default NULL,
PRIMARY KEY (`model`,`privilegeValue`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
权限表
CREATE TABLE `privilegegroup` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
权限组表CREATE TABLE `group_privilege` (
`groupid` int(11) NOT NULL,
`model` varchar(255) NOT NULL,
`privilegeValue` varchar(255) NOT NULL,
PRIMARY KEY (`groupid`,`model`,`privilegeValue`),
KEY `FK185614F148DC23E8` (`model`,`privilegeValue`),
KEY `FK185614F1971AE06B` (`groupid`),
CONSTRAINT `FK185614F148DC23E8` FOREIGN KEY (`model`, `privilegeValue`) REFERENCES `systemprivilege` (`model`, `privilegeValue`),
CONSTRAINT `FK185614F1971AE06B` FOREIGN KEY (`groupid`) REFERENCES `privilegegroup` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
权限-权限组 中间表create table
CREATE TABLE `employee` (
`username` varchar(20) NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8人员表CREATE TABLE `employee_role` (
`username` varchar(20) NOT NULL,
`groupid` int(11) NOT NULL,
PRIMARY KEY (`username`,`groupid`),
KEY `FK87184F6719550807` (`username`),
KEY `FK87184F67971AE06B` (`groupid`),
CONSTRAINT `FK87184F6719550807` FOREIGN KEY (`username`) REFERENCES `employee` (`username`),
CONSTRAINT `FK87184F67971AE06B` FOREIGN KEY (`groupid`) REFERENCES `privilegegroup` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8角色表基本可以满足大多数应用了。
轻量级J2EE系统的权限控制的原理与实现
【摘 要】
在实现J2EE系统的权限控制时,很多人会想到利用J2EE基于容器的安全机制,将基于角色的访问控制(Role-Based Access Control RBAC)融到J2EE安全之中。在大型系统下,这种方式很适合,在小型系统中,就没必要进行复杂的配置和牺牲庞大性能代价了, 在J2EE轻量级框架下,利用简单的拦截器机制也可以实现RBAC。【正文】
1. 概论
目前,J2EE技术已经相当完善和成熟,开源的轻量级框架也非常出色。应用J2EE及其框架可以很快的开发出高可伸缩性,灵活性和易维护性的企业应用系统。然而在开发J2EE应用时,安全的实现也是一个不可忽视的问题。
在信息访问控制方面,基于角色的访问控制(Role-Based Access Control RBAC)占主导。它是90年代的一种新的模型,基本上是对矩阵模型的扩展。它把权限(Permission)和角色联系在一起。管理员可以对角色自由分配权限,用户通过扮演相应的角色获得相应的权限。对于RBAC,美国国家标准化和技术委员会(NIST)成立专门的RBAC机构,提过了比较系统的RBAC96模型族。其中以RBAC3为最高等级。
RABC3是RABC1和RABC2的结合,具有角色分级和继承的能力.
图表 1 RBAC3模型图[1]
本文将基于RABC3,对J2EE下权限控制进行论述.
2. 系统框架层次
2.1 struts2
struts作为MVC模型的web框架,很早就受到开发者的青睐.但其缺点也不少:需要编写很多代码,单元测试困难等.随着WEB的发展,最终导致了struts2的诞生.
struts2是通过Filter(过滤器)对每个请求进行拦截,其中FilterDispatcher(过滤分发器)拦截原始的请求,解析请求的内容,从而调用相应的Action,在Action被调用之前,Interceptor(拦截器)又要对请求进行过滤一遍,最后执行Action中的方法。Action执行了相应的方法以后,返回视图(view)的名称给FilterDispatcher,FilterDispatcher通过名称在struts.xml配置文件中找到相应的视图的地址,返回给web容器。
2.2 JPA
JPA全名Java Persistence API (Java持久层API), 是由EJB专家组开发,做为JSR-220的一部分,但它并不局限与EJB,也可以做为web应用.它是一种POJO持久化标准规范.因此,它作为一个标准的规范,使得杂乱的ORM框架统一,以至数据库访问的java代码与ORM框架解耦.
JPA的原理跟ORM框架是一致的,不过它只是提供接口,实现上是由ORM框架完成.
JPA支持3个核心技术:
1) JPA API:提供统一的接口,可以调用多种ORM框架
2) ORM映射:支持XML和Annotation两种元数据方式,实现对象向表的映射.
3) JQL:面向对象的查询语言,与数据库SQL解耦.
2.3 Spring2
Spring采用完全的面向对象设计理念,降低了接口使用的复杂度,易配置的pojo,适量的异常捕获等特性使得J2EE开发变得更加简单[2]。Spring框架实际上是提供了一个bean容器,负责管理所有的bean,从生成到销毁.依赖注入(DI),控制反转(IOC),面向切面编程(AOP)是其三个核心技术。
通过Spring,我们可以显式地将属性注入到某个bean中,而不需要在bean中实例化一个类以后赋值给这个属性。同时类的实例化由容器来管理,而不是调用类的构造方法,这样就实现了bean的统一管理,避免了对象过多而导致占用内存过大,提高了系统性能。2.4 整合
Struts负责表示层,spring负责业务逻辑层,JPA负责持久层。Spring作为一个容器,来管理struts和JPA.当用户发送请求给web服务器以后,struts中的FilterDispatchor便会接收到已经对象化了的请求(Request),FilterDispatchor通过解析请求,通过struts.xml找到相应的Action的方法的别名(即在spring配置文件中的名字),从而通过spring找到Action对象而执行相应的方法。如果Action有拦截器设置,那么会先执行拦截器里的方法,与此相似也要通过struts.xml找到拦截器的别名以后到spring容器中找相应的拦截器,然后执行相应的方法。
与JPA的整合也相似。Spring是通过两个类来实现与JPA结合的,entityManageFactory和transactionManager,entityManageFactory负责根据持久化单元名和persistence.xml来获取实体管理器。transactionManager则负责管理JPA事务。3. 权限控制原理3.1 粗粒度的权限控制
对未登录或未授权的用户的请求进行过滤.利用Filter(过滤器)在执行相应的业务逻辑之前检查session中是否有相应的用户登陆信息,如果有则通过,没有则重定向到登陆页面.
在基于OSS(单点登陆)的系统中,用户的验证过程是交给CAS Server的.
3.2 细粒度的权限控制
这是整个系统的核心,整个系统能否很好的实现权限的控制就靠这个了.
关于权限拦截有两种:
1) struts2的拦截器
struts2的Interceptor实际上是个过滤器,FilterDepatcher拦截到用户的请求以后,就会去先去寻找并执行对应 action的interceptor,然后再根据Interceptor中的逻辑决定是否执行action,因此可以利用struts2中这种机制来设计一个权限拦截器.
2) spring AOP
AOP(Aspect -Oriented Program 面向方面编程)是1997年由Gregor Kiczale在施乐的Palo Alto研究中心提出的一种编程思想。它与传统的OOP编程思想截然不同。AOP从关注点出发分析问题,把系统分成一个个关注点,业务逻辑比较集中的成为核心关注点,比较分散的成为横切关注点。将横切关注点进行模块化,把功能相同,目标相同的关注点集中的到一个模块中就是切面。通过切面,就可以动态的给已有的类添加新特性,从类的外部动态的改变程序的运行流程,改变其静态结构。AOP就是通过切面来解决横切关注点的问题,以另一种思维来解决OOP不能解决的问题,弥补了OOP的不足。
Spring AOP是一个AOP框架,
4. 权限控制的实现
4.1 数据库设计
根据RABC3的原则,对于权限控制模块,创建两个映射类,权限组(PrivilegeGroup),权限(Privilege)。管理员可以创建相应的权限组,对权限组进行管理,同时又可以将一类用户纳入到相应的权限组中。这样就实现了角色分级。同时权限组设置一个父权限组属性,就可以实现角色继承。
代码如下:
@Entity
public class Privilege{
private String id;
private String name;
private String note;
@Id
public String getId(){..}
}
@Entity
public class PrivilegeGroup{
private String id;
private String name;
private PrivilegeGroup parent;
private String note;
@Id
public String getId(){}
}@Entity
public class Employee{
private String id;
private String name;
private PrivilegeGroup role;
}
4.2 权限标识
细粒度的权限控制将每个Action的方法做为一个权限,在每个方法被执行前检查其请求用户的权限。我这里采用注释的方式。
注释代码
public @interface PrivilegeAnnotation{
public String name();//权限名
}
将Action的方法用注释标识
public class UserManageAction{
@PrivilegeAnnotation(name=”addUser”)
public String addUser{
//…
}
}
4.3 权限拦截
我这里采用struts2的拦截器
权限拦截器代码:
@Component
public class PrivilegeInterceptor extends AbstractInterceptor{
public String intercept(Config cfg){
}
}
strut.xml配置:
<package name=”privilegeControl” namespace=”/”>
<interceptors>
<interceptor name=”privilegeInterceptor” class=”privilegeInterceptor” >
<interceptor>
</interceptors>
<default-Interceptor>privilegeInterceptor<default-Interceptor>
</package>
5. 总结与展望
本文围绕基于Struts2,Spring2和JPA的轻量级J2EE技术,并结合改进的RABC3模型讨论并实现了系统的权限控制功能。系统采用struts2为作为表示层框架,以struts2的Action中每个方法为一个权限,通过struts2的Interceptor对请求进行拦截,实现权限的检查。通过Spring对Interceptor和Action进行管理,减轻了服务器的压力,提高了系统的整体性能。数据持久化方面,采用的是JPA规范,实现了系统与持久化框架的解耦,系统具有更高的可修改性和可移植性,对权限的持久化不需要依赖ORM框架和数据库管理系统软件。整体上看,实现了声明式权限控制以及权限控制与业务逻辑的解耦。
这种权限控制策略虽然实现上比较简单,但它的安全性还是有限的,其功能上是没法与专门的安全框架相比的,如Spring Security。如果单独采用这种权限控制来保证系统安全也是远远不够的,需要结合SSL技术来保证传输的安全,OSO来保证登陆的安全等。
6. 参考文献
[1] Spring Security 开发手册 [书籍] / 作者 不明.
[2] SpringSource http://www.springsource.org/ 2009