小弟从事java开发2年多,一直有个安全限制的疑问,直接上描述(环境为:SSH,不过觉得这个不是重要的)
举例:
在项目中会配有不同的角色,每个角色会动态配有不同的模块(功能),这样可以实现不同身份的人登陆系统(或网站)时,看到的模块不一样,如,当超级管理员的角色登陆系统时,看到的功能有:1,2,3,4,5号模块,而当普通用户登陆系统时,可能看到的只有1,2,3号模块,这毫无疑问是完全可以做到的,而且,当你没有用户名and密码时,是不能登陆系统的,解决方案,只要随便一个过滤器就可以搞定,但是呢,问题的关键来了,假如某用户以一个普通身份的角色登陆,当看到1,2,3号模块后,无意间猜到了属于超级管理员的4号模块URL,于是乎,直接在IE中输入一回车,想必想象就不用我多说了,这个问题呢,自己的开发经验或解决方案有2个:
1〉在每个Action中分别调用封装好的,身份验证,如,判断是否已经有该用户Session,并且根据Session的身份信息,查数据库,是否匹配将要显示的界面或是否给予逻辑处理的功能。
注:对于方案1,自我感觉,每个Action中写的话,有点累,而且开发的时候每个Action都写,怎么感觉都不是高水平代码
2〉当然是写过滤器了或拦截器,如Session拦截器,将其拦截到的Session信息,与实现配置好的XML中所述角色URL匹配,如果能匹配,ok,可以继续,否则,返回。
注:对于方案2,维护起来又是个很麻烦的事情,如:假如存在20个角色,每个角色又不同的模块展示,加上那些普通的Jsp_Url,配置起来也不是一个简单的事情
有朋友拍砖说,学习一下Spring的安全框架,但我和同事搞了一段时间(我并没有坚持到最后),听他说,那个根本不是解决这个问题的。
希望各位IT朋友交流一下,提一下各自在项目当中的解决方案。

解决方案 »

  1.   

    单纯的进行判断完了把东西隐藏了,我觉得这样做很欠妥
    最少要在必要的方法上进行拦截判断,判断用户是否有这样的权限
    最基本的就是判断你的session中所带的标志是否是admin或者之类的听说有个东西叫ACEGI
      

  2.   

    将访问资源的url信息配置在数据库表中,角色分配时和其关联,在拦截器中进行校验,可以将权限控制在按钮级别
      

  3.   

    楼主,我是一个学生,学习java 2个月,刚刚开始搞web开发,目前手上一个项目有4种角色,跟你的描述很相似,你的方案我都考虑过,我还看过一种,就是把各种角色能访问的页面存到表中,请求的时候用filter拦截,查表。不知道还有什么好办法,希望大牛们给点意见
      

  4.   

    对于你的问题用第二种方法即可实现,具体做法在维护的时候不是按照每个url进行维护的,而是按照模块进行url分组,比如模块1的url模式为root/模块1/*,(其中root为你模块的跟目录),模块二的url模式为root/模块2/*,其它依次类推,对于公用的大家都可以访问的url的页面单独放在一个文件件中,这样,加入角色1,可以访问1.2.3三个模块,则其可访问的url模式几位root/模块1/*、root/模块2/*、root/模块3/*,对于其它角色也类似,然后对于每个url请求你判断它是否满足这个角色所有的模块中一个一个url模式即可(实现用正则式很容易)。spring的安全框架有包含这个部分,(你所说的没有权限的角色通过贴他没有权限的模块url是安全要考虑的一个方面),这是通过二次权限认证实现的,也就是每次对心的url请求都按照上述所说进行判断,没有权限则通知他。
    以上方面解决的都是功能权限(包括模块、菜单、功能按钮这些),
    至于具体的数据权限,你也要进行二次权限的判断。那就跟业务逻辑有关系了。
      

  5.   

    我初学java,但是感觉那个搞定用过滤器完全可以实现,你可以把需要不同权限的页面放在不同的包中,利用过滤器判断要进入的页面,并在相应的filter中判断用户的权限,选择是否有访问页面的权限,说的不对,还请指点,本人没实际开发过东西。
      

  6.   


    感谢kaynezhang的回答,记得以前做Asp.Net的时候也是按文件夹控制的,但是,这不仅让我想起一个问题,假如说一个页面中有增删改查,四个按钮的话,又该怎样控制呢?角色1为普通用户,只有查看的权限,而角色2位高级权限,可以定位到增删改查。这是否又增加了难度呢?希望kaynezhang,或其他IT朋友给出交流意见!
      

  7.   

    为什么不用WWW-Authenticate,action配置里面直接用roles
      

  8.   


    你提到的方案的原理,和把URl写道XML当中是一样的,只不过换了个存储方式,呵呵,希望大牛们能高抬贵手,指点一番。
      

  9.   


    WWW-Authenticate有听说过,不过大多数朋友都觉得它不安全,必须采用https的方法屏蔽,所以,就本话题而言,个人觉得不是最佳解决方案。
      

  10.   


    shine333回答的有点简单,或许对于一个不懂WWW-Authenticate得程序员来说,有点过于迷茫,还往shine333提出宝贵的尽量详细的意见,供大家参考,谢谢!
      

  11.   

    对asp.net就可以按照文件夹控制权限,但是asp.net本身在系统级别(我是说.net的框架规范)就包含按照文件夹控制权限,但是j2ee这个没有,所以你只能在你的应用级别进行处理(其实我觉得也是好事,更灵活,你可以按照你的应用设计你的权限模型)你说的增删改查,就是功能按钮级别的权限了,就像我上面说的那样,其实你系统要进行安全控制的资源是一个树状结构,我是用xml实现的,叶子一层是按钮,按钮的父节点是模块了。当然模块上还可以有节点(比如子系统),对于子系统以及模块的控制是按照URL模式的匹配,对于功能模块的判断就是当一个角色有权进入模块后,对具体的按钮进行权限判断了,有权则在页面显示,没权则不显示。上面所说的是功能权限的讨论,数据权限不知道你有没有需求,有需求可以继续讨论。祝你好运。
      

  12.   


    或许是因为发表的人过于少吧,目前,除了shine333的回答,我不能真实理解外,kaynezhang得方案虽然有点复杂,但原理还是很简单的。继续期待各位牛人的发言,交流时最大的进步。
      

  13.   

    f u c k,打了半天的内容,不小心碰到触摸板把网页关了。 c a o .........
      

  14.   

    目前我们在开发的系统是 在个访问每个资源的时候对他进行权限验证的。
    1、对于action:通过拦截器,在拦截器里获取action的名字,然后都数据库里验证用户是否有权限。2、对于.jsp资源:只有用户有权限时才显示出链接
    如:
    if(auth.check(user, "xxx.jsp")){
         <a herf="xxx.jsp"><a/>
    }这样做虽然做到了权限的控制。但把所有的action名字和jsp文件的名字维护到数据库中,也是一个比较麻烦的工作。特别是action和jsp文件比较多的时候。还有这种方式在权限分配的时候也是比较麻烦的。还有因为导航区的那个页面,有很多的jsp文件链接。所有这个页面的生产要进行很多次的数据库访问,明显感觉很慢。
    和LZ一样很期望大牛们,说说其他的更方便的解决方案
      

  15.   

    方案2.在拦截器中加入ACTIONNAME
      

  16.   

    听说spring security 很牛X, 但是不是怎么会用。
      等高人
      

  17.   

    spring security做的是挺不错的,但是不太适合咱们的习惯。
      

  18.   

    对,Spring的安全框架security,是在2年前听说的,当时出于自己肚子里的墨水太少,一直没有去研究,前段时间我把这个问题讲给了同事,同事对这个很感兴趣,最终交流的时候他说,Spring的安全框架解决此类问题时不是特别专一,而且感觉很笨重,另外,不知道怎么和现有的三大框架(ssh)整合,很令人郁闷,继续期待大牛的见解!
      

  19.   

    acegi(现在叫Spring security了)的源码我看过,不太适合咱们的习惯。
      

  20.   

    3天的时间了,一直没有等到更好的解决方案,不得不结贴了,很感谢kaynezhang,由于分不多,按回复数与方案的可行性,各自散了。