编写自己的登录与访问控制模块

2014-11-23 23:14:05 · 作者: · 浏览: 0
小按:第一次写心得笔记,手都有点抖,班门弄斧啊,呵呵~~~欢迎各位大侠扔砖

安全性是 Java鼓吹得最多的特性之一,的确, Java的安全特性涵盖了从应用级别到语言级别乃至 JVM本身。以前大家都知道有个 Sandbox,但仅有Sandbox尚不能满足,或者说不能很方便地做到我们所需要的全部安全需求,譬如现在一个系统首先起码需要一个登录功能,更进一步的话,还需要对用户访问资源的行为进行约束,下面我想大致讲一下Java是怎样做这些事情的,基本上是一个总结或者说是“读后感”的性质,同时给出一个简单的实现例子,这个例子其实还是模仿人家的,呵呵……

1.Java的访问控制机制


谈到访问控制,或者说“授权”,这里有两层含义,一是从资源的角度,这个socket端口是否被允许操作?这个文件是可读的?可写的?还是可执行的?还是以上都行?这就是我们在UNIX下用“ls l”命令列出当前目录下文件时,那些“-rwx-”之类的含义;二是从访问者的角度,我想通过80端口看Web上新浪欧洲杯的新闻,在这个系统中有没有这个资格?我想播放D盘上一个名为“friends.rm”的视频文件,我得到了访问这个文件的权限了吗?我有运行播放器的权限吗?
Java在访问控制策略上同时考虑了这两方面内容,你说“不对呀,我用 FileOutputStream写文件,用 Socket类连接远程主机都用得好好的,没什么限制呀”,这我们得先谈谈什么叫做“ 安全管理器”( SecurityManger)。安全管理器从JDK 1.0就开始有了,多古老啊!Java从设计的那一天开始就考虑了安全因素,安全管理器是Sandbox的最重要的一个部分,也是访问控制的总协调者,我们能够在通常情况下正常使用网络和文件,那是因为当启动application的时候( 注意是application,不是applet!),如果你不加“ -Djava.security.manager”选项,JVM是不会启动Sandbox的,这时你可以“为所欲为”,而不会碰到 SecurityException之类的异常;一旦加入了“-Djava.security.manager”选项,你就会发现有一连串的异常出现喽!

  1. Exception in thread "main" java.security.AccessControlException: access denied (……)
  2. ……


Java内置了一个默认的安全策略,这种情况下安全管理器首先装载的是这个默认的策略,不信啊,不信你检查一下你的“%JAVA_HOME%jrelibsecurity”目录,是不是有个叫“ java.policy”的文件?用notepad打开看看:

  1. // Standard extensions get all permissions by default
  2. grant codeBase "file:${java.home}/lib/ext/*" {
  3. permission java.security.AllPermission;
  4. };
  5. // default permissions granted to all domains
  6. grant {
  7. // Allows any thread to stop itself using the java.lang.Thread.stop()
  8. // method that takes no argument.
  9. // Note that this permission is granted by default only to remain
  10. // backwards compatible.
  11. // It is strongly recommended that you either remove this permission
  12. // from this policy file or further restrict it to code sources
  13. // that you specify, because Thread.stop() is potentially unsafe.
  14. // See "http://java.sun.com/notes" for more information.
  15. permission java.lang.RuntimePermission "stopThread";
  16. // allows anyone to listen on un-privileged ports
  17. permission java.net.SocketPermission "localhost:1024-", "listen";
  18. // "standard" properies that can be read by anyone
  19. permission java.util.PropertyPermission "java.version", "read";
  20. permission java.util.PropertyPermission "java.vendor", "read";
  21. permission java.util.PropertyPermission "java.vendor.url", "read";
  22. permission java.util.PropertyPermission "java.class.version", "read";
  23. permission java.util.PropertyPermission "os.name", "read";
  24. permission java.util.PropertyPermission "os.version", "read";
  25. permission java.util.PropertyPermission "os.arch"<