我本来不是再研究这个问题,我是在尝试如何使用SSL连接来保护登录时用户名和密码的传输,经过两天的挣扎,终于搞出来了,但是发现一个问题,登录成功页面并不是只有在登录之后才能访问,你直接访问也行,这就没有意义了。原因是我为了方便,没有定义security role,只定义了security constraint。而开始尝试使用role时,就碰到了上面这些深刻的问题。

解决方案 »

  1.   

    不知下面的网页对你是否有帮助。
    http://www.yesky.com/20020628/1618084.shtml
      

  2.   

    问题五的补充:要提交到我自己写的程序我才好设置session里的Attribute呀!如果访问控制交给服务器管理,我怎么知道什么时候,以及是否应该设置session,如果我管,那岂不还是土办法。
      

  3.   

    J2EE的安全体制不是你想的那样使用的。所谓security role,作用是辨识网站的登陆者究竟是一般的用户,还是拥有管理网站的系统管理员。对于后者,则需要额外授予一定的权限。你用过security role就知道,security role是在web-xml里面定义的,它将指定的路径或者servlet集包裹起来,只提供给符合security role的访问者。就比如一个BBS,只有系统管理员能够访问“删除帖子”的业面而普通用户不可以。security role的作用是“安全分类”,而不是“个别用户检查”。也就是说,security role“授权”(authorization),而不是“鉴定”(authentication)----前者“检查这个人有没有某种权力”,后者“检查这个人是不是他自称的那个人”。因此,服务器相关的security role的授权名单列表并不应该将所有注册用户的名字都写入列表,而应该这么做:设置一个称为“customer”的role name,然后先后进行authentication和authorization,前者通过数据库得知用户是否注册,后者通过内部的authorization决定这个用户有何种的权限。Form形式比basic形式要好看,但本质是一样的。但是因为security role可能涉及到对服务器本身的操作,因此它的实现自然是服务器相关的。你为学校做的网站,做法并没有错。正如上面所说,你那个做法是“从一群人中辨别和追踪某个人”,而security role的作用是“人群分类”。
      

  4.   

    Sheepy你的问题我已经给你说得很清楚了。你不信算数。在这个论坛上你要找什么高手?直接给James Gosling写信去吧!快结贴了。给我200分。
      

  5.   

    好多内容啊/对于java安全机智嘛,,就去了解一下JSSE,JASS 和JCE吧参考 java core 的java安全那一章。。
      

  6.   

    alienbat(死灵巫师)说得对阿
    使用在xml中配置安全性角色的
    也就是
    <security-role/>
    至于实际的安全性实现是要映射到这个角色上的
    你可以去搜一下j2ee规范阿
    你只要把用户的实际安全性身份映射到一个逻辑安全性角色就行了
      

  7.   

    没有人有耐心看我的问题吗?你说的这些我都知道,但是没有一个项目是只用这样就做出来的呀!哪有项目说我只要用FORM登录不要设置session,由哪个项目说我不要网页form只要BASIC就可以了……
    我发现在CSDN上分数总要烂掉,没人可给!
      

  8.   

    一般性的登陆人家只用session,SSL和security都不用!你看浏览CSDN的时候浏览器下面有SSL标记不啦?比较需要保密的网站比如在线支付,SSL比security更重要;只有很少的网站的管理界面可能用到了security role。已经告诉你了:一般性的网站根本不用SSL和security,有些网站用security来建立管理界面,根本不需要security和session作为网站的基础技术全用上;你强行要全用上我已经告诉你方法了。你再弄这个就是钻牛角尖了。
      

  9.   

    你所说的security role在你初次建立用户的时候就已经确立了,如果你要想保证安全的话,应该在数据库中动动头脑了.在数据库中建立package, 用来识别登录用户的身份以及权利,达到目的.
      

  10.   

    是啊,那对于只有登录才能看到的页面怎么处理?是让他去,反正如果你没登陆的话会出exception或者内容不显示,还是在头部写代码。
      

  11.   

    我给你解释!msn:  [email protected]
      

  12.   

    其实我现在想知道的就是:
    如果出于会话跟踪的需要,自己管理登录和安全性,怎么做。是在需要登录才能看的JSP页面里写scriptlet吗?这种事情我做过,成功的,但是在页面里写scriptlet并不是很好的事情,而且不是一句就可以解决的,我写了一段,如果没有登录自动转到登录页面,结果每个要登录的页面里都有这么一段scriptlet,很不爽。
    如果要实现会话跟踪和访问控制还有其它做法,用不着像我上面说的那样,请给出做法。
      

  13.   

    不清楚搂主有没有用过任何framework,
    你现在的问题都是framework要解决的
    问题。如果直接用j2ee的办法,配置
    比较麻烦,现在通常是放在framework
    一级来处理。
      

  14.   

    Struts中没有专门解决这个问题的机制吧?其它framework不清楚。
    另外,不是配置麻烦的问题,是不能达到功能要求的说。
      

  15.   

    关注,做项目正考试认证的问题。在看JAAS
      

  16.   

    我的理解是这样:在基于角色的用户权限系统中,可以定义以下几种抽象概念:
    User: 代表一个用户本身,比如某个注册用户,或者系统管理员
    Group: 表示一个组,一个Group中有一个或多个用户,并且每个用户至少属于一个组,但也可以属于多个组。
    Role: 这个Role表示一种权限,他和Group关联,每个Group的成员都具有Role的权限比如某个用户bill,属于Administrators组(管理员组),该组对应的Role是Read/Write,那么bill就具有该权限。现在当用户访问系统时,首先要确定他是哪个User,这个工作是由表单验证完成,因为用户信息肯定都在数据库(几百万注册用户资料不可能放在LDAP),验证通过后,即可确定该用户的Group及对应的Role,这时应该在session中跟踪用户,建立如下的session-scope变量:
    class Account {
      String username; // 用户注册名
      String role; // 用户角色
    }对于简单应用,Group都可以免了,直接让一个User属于某个Role,因此你的数据库表就像:
    Username  Password  Role   其他字段...
    ---------------------------------------
    bill      1234      Admin
    tom       abcd      Guest
    ......在逻辑层,如果你使用ejb,那么每个方法调用都可以设置Role,比如一个delete()方法,指定Admin才能操作,那么在servlet/jsp中调用此方法时,把用户的Account.role传过去,不具有权限的就会抛出异常。另外在每个jsp叶面开头检查session是不好的,其实servlet本身就有filter机制,让你在每个jsp/servlet被处理前做检查。因此把所有的session检查删掉,自己写几个filter。比如:
    对于管理页面,仅管理员可访问,将所有管理叶面放在/admin/下,写一个filter,过滤/admin/*,如果session中身份验证是管理员,就通过,否则,直接
      response.sendRedirect("/error.jsp");这样就解决了在每个页面前作检查的问题。利用filter还可以处理用户自动登陆的问题,可以在用户第一次访问任何一个叶面前读取cookie。如果一个叶面要根据用户角色显示相应的内容,为了不让叶面出现过多的jsp代码,只有用标签实现,这个标签我还在研究,大概就像这样:
    <mytag:role name="admin">
      管理员可见的内容
    </mytag:role>
    <mytag:role name="guest">
      普通用户可见的内容
    </mytag:role>
      

  17.   


    关于这个, 我做的法是用 session 在用户登录后 存一个user 的对象进去。
    而不是存 一个 一个 的信息。 验证也是验证session里有没有user对象。关于验证,有两种方式
    一种是传统的, 写一个方法
    比如
    assertLogin(request,response);   加在每个jsp前面另外一种是,用web-app 里定义filter  extends class javax.servlet.Filter
    比如你可以写一个filter, 在web.xml里配置一下
    filter里面写验证什么的这样就不需要在jsp或者别的地方写验证了
      

  18.   

    我用struts,我自己实现了权限和用户模块,所有的JSP都依赖.do,这样只要把.do保护起来,就OK了。
    强烈推荐《关于用户角色权限的一点想法》http://www.csdn.net/develop/Read_Article.asp?Id=19751
      

  19.   

    如何编写自己的JAAS验证模块?服务器提供的是默认的jaas验证,只能使用预定义好的xml中的用户和角色,如果要是用自己的验证模块如rdbms或loap就需要自己实现jaas接口。要在WebLogic中实现自定义的安全验证,需要提供一个Security Provider,包括
    Authentication Provider,Login Module,Identity Assertion,Principal Validation Provider,Role Mapping Provider。大多数书仅仅写了一个Login Module是不够的。可以从BEA站点下载一个示例代码:
    http://dev2dev.bea.com/codelibrary/code/security_prov81.jsp这个示例将用户名口令放在文本文件中,可以很容易的改成数据库,然后在console中配置部署(注册自己写的Security Provider),即可实现自定义的JAAS验证。
      

  20.   

    当你自己实现了jaas后,对web资源的访问就可以在web.xml中用role限制jsp/servlet等,还可用服务器内置的request.getUserPrincipal得到当前用户身份,无需再用过滤器等,对EJB调用时,Web容器会隐含的将Principal对象传递给EJB容器,可能抛出SecurityException,这样就与ejb安全角色联系起来了,但是要求web容器和ejb容器要兼容,也就是一般只能是同一厂商的产品(如web和ejb都用weblogic server)。
      

  21.   

    这个帖子是很久之前发的了,下面是我现在的观点,不过我还是没有能够使用J2EE的安全机制。
    J2EE的安全机制只给有限的用户提供访问控制。也就是说对于一个公众网站,一个访问者可以自己注册新用户的网站,是无法使用J2EE的安全机制的。或者说,使用了也是得不偿失。
    而对于有限的用户,如果要进行对话跟踪,仍旧无法使用J2EE安全机制。比如一个网站的斑竹是从注册用户中挑选的,虽然人数是有限的,我可以为他们在LDAP或操作系统中建立帐户,但是他们也是注册用户,也要和普通注册用户一样使用会话跟踪的功能,比如修改自己的注册信息,所以还是没法用J2EE的安全机制。
    对于不需要会话根总只要访问控制,并且人数有限的应用,比如公司内部网络,有特权的人才能察看某些信息,有特权的人是有限的,这时可以使用J2EE的安全体制。但是一来,这样的应用功能有限,只有这种需求的应用是少数,并且考虑未来的功能扩展,也不会定死在这种实现上,二来,就算用了,依靠HTTP请求header实现的访问控制怎么也不能说是让人放心的,如果有定制的客户端在每个请求中都加上用户身份信息,就可以取得这个用户的访问权限,而无需登录。相比之下,session很难伪造。
    所以结论就是,J2EE的安全机制没什么用,还是要自己控制。唯一的作用是指定哪里需要加密的连接,即SSL什么的。
      

  22.   

    楼上你对JAAS的认识太肤浅了...................
      

  23.   

    纠正一下,不是肤浅,是根本不知道JAAS是什么!
    但是请问我说得有错吗?请问如果你是品德高尚的人你会只贬低人家而不教人家吗?
      

  24.   

    我只说你对jaas技术的认识,没有任何其他任何意思。我在上面已经说了我对jaas的认识,你没有看而已,我总不能一遍又一遍的贴吧?
      

  25.   

    你说:J2EE的安全机制只给有限的用户提供访问控制
    肯定是不对的,任何支持jaas的服务器比如weblogic都至少提供一种jaas验证方式,你不能要求j2ee服务器带一个数据库,然后把用户名存在里面,所以他们提供的jaas验证都是简单的配置文件的方式存几个静态的用户名。你要动态存储在数据库/loap中,就自己实现jaas接口,然后在weblogic中指定用自己的jaas验证就可以了我在上面不贴了一个链接吗?好不容易找到的,贴出来也没人看,唉!
    http://dev2dev.bea.com/codelibrary/code/security_prov81.jsp
    这个例子就是bea教你如何用自己的jaas替代系统默认的另外,关于jaas资料,国内几乎没有,以上我的理解也是在sun和bea网站搜索的,你如果在bea.com搜索jaas就可以搜到一大堆jaas资料
      

  26.   

    好,好,谢谢你。我再问一句,你所说的自己实现的JAAS与服务器是否相关?也就是在WebLogic上的这个实现能否在其它服务器上使用?
      

  27.   

    这个未知,因为我现在看bea文档只是把概念弄懂了,但是bea的示例用到了bea的包,所以移植肯定要改代码
      

  28.   

    正如我一开始所说,我一直以来用的是WebSphere,WebSphere中有一个自定义用户注册表,作为本地操作系统和LDAP的补充,不知道是不是和WebLogic的这个异曲同工。如果是的话,这些方案都是容器相关的,换个服务器就不行了。
    另外,我又想到一个问题,用了你所说的实现之后,用户列表是可以自己随意定制了,但是会话跟踪的要求能实现吗?就是登录的时候一方面是用自己的这个实现进行用户验证,另一方面根据用户信息建立session信息。
      

  29.   

    如果通过jaas认证,为什么要用session跟踪?通过jaas认证后用户就获得了一个有效的principal,代表用户身份,可以用request.getUserPrincipal获得principal(没有认证的是null),要保护某些jsp/servlets,在web.xml中指定允许访问的角色即可,并不用过滤器来重订向,容器会自动将未通过认证的用户导向到login.jsp之类的登陆叶面。这样就使用了web容器内置的安全保护。如果要调用ejb,这个principal被隐含的传了过去,如果定义了ejb安全角色,相当于在web层和ejb层都加了保护。
      

  30.   

    是这样的,通过验证了我能知道他是哪一类用户,但是我无法知道他是哪一个用户。比如公司每个employee都有自己的账号,他用自己的账号登录后就通过了认证,我可以request.getUserPrincipal知道他是employee,但是我不知道他是哪一个employee,他如果要查看自己的薪水记录我怎么办?
      

  31.   

    request.getUserPrincipal返回用户身份,比如bill, micheal,... 就是用户名
    request.isUserInRole("admin")确认用户是否在角色admin中if(request.isUserInRole("employee")) {
      // he is an employee
      out.println("welcome, " + request.getUserPrincipal());
    }
      

  32.   

    我知道了。这样做出来的东西还是可移植的。也就是说打包成WAR也好EAR也好拿到其它服务器上还是可以正常部署的,但是提供用户注册表是服务器的工作,每个服务器支持的用户注册表类型是不同的。好在这部分不是打包的应用程序所包含的,所以打出来的包还是可移植的。
    估计WebLogic那个实现方式和WebSphere是一个道理。实现一个自定义的用户注册表,用户信息想放哪里就放那里,应用程序不用知道,它是将登录提交到服务器管理的servlet,然后服务器在你指定的用户注册表里查找用户信息。
    对于会话跟踪,IBM的一本RedBook很好地阐述了方法,以前我就下载了,可是当时没有仔细看,后悔。可以用Filter,将这个Filter绑定到/j_security_check这个URL,就可以处理session之类的东西。
    可是还有一点疑惑,为什么没有getUserRole方法?为了确定用户是哪一个role我还要判断所有role?
    以上讨论基于form登录方式。
      

  33.   

    上面提到的RedBook名为IBM WebSphere V5.0 Security,编号SG24-6573-00,可从http://www.redbooks.ibm.com/
    免费获得PDF版本。其中不只讲到WebSphere相关的东西,还讲了很多J2EE通用的内容。
      

  34.   

    推荐看看<<精通EJB>>这本书,他有一章节专门的介绍J2EE的安全体系的,很详细,很不错的。
      

  35.   

    "用户信息想放哪里就放那里,应用程序不用知道"
    应用程序怎么不知道呢???
    你提供了一个Login Module, Role Mapping Provider要用jdbc连接数据库读取用户信息和它属于什么角色。<<精通EJB>>之类的书讲安全都是一笔略过,顶多把sun的一个console登陆和一个内置的j_security_check form讲一讲,根本无法集成到web应用中。推荐一本:Java Security, 2nd Edition 
    http://www.oreilly.com/catalog/javasec2/toc.html
    可惜没有电子版下载
      

  36.   

    是不用知道,因为我是在使用container managed security,容器管理,应用程序中没有牵涉到用户信息放在哪里的代码,只有获得和使用用户信息的代码。
      

  37.   

    还有两点值得注意的地方,说一下,大家谈谈看法。
    WebSphere提供了一个示例程序,Plants by WebSphere,在线商店,类似Pet Store,它没有使用J2EE的安全机制,而是完全自己搞定。
    再看Pet Store 1.3.2,奇怪的是它竟然也没用J2EE container managed security,没有在web.xml声明任何和安全性相关的东西,而是用了Blueprint的一个singon模块来管理登录和访问控制,它的登录表单是提交到j_signon_check,我始终没有找到这个servlet,web.xml中没有声明这个servlet,难道这是J2EE SDK自带的服务器特有的servlet?可是规范里没有这个内容啊!Sun倒好,自己制定的安全性规范不用,弄出这样一个无法理解的东西。
    综上所述,J2EE的安全机制还是没法用。