我现在只是一个小的BBS项目,怎么自己写代码来控制权限呢(可以通过spring security来控制权限,不过现在不想去搞那个,那个打算以后去研究),想通过资源,角色,用户他们来管理,它们之间的关系我懂,只是资源这部份怎么写呢?最好
能贴出点代码

解决方案 »

  1.   

    CREATE TABLE `systemprivilege` (
       `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角色表基本可以满足大多数应用了。
      

  2.   

    用struts2的拦截器做权限管理哈~~~
      

  3.   

           
                       轻量级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
      

  4.   

    在jsp中的话自定义一个标签是比较好的方法。所有逻辑都可以写到tag里面去