`
holdbelief
  • 浏览: 697029 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

J2EE的安全认证机制

阅读更多

  实现Web应用程序的安全机制是Web应用程序的设计人员和编程人员必须面对的任务。在J2EE中,Web容器支持应用程序内置的安全机制。

  Web应用程序的安全机制有二种组件:认证和授权。基于J2EE的Web容器提供三种类型的认证机制:基本认证、基于表单的认证、相互认证。由于能够对认证用户界面进行定制,大多数的Web应用程序都使用基于表单的认证。Web容器使用在Web应用程序的部署描述符中定义的安全角色对应用程序的Web资源的访问进行授权。

  在使用基于表单的认证机制中,应用程序的设计人员和开发人员会遇到3类问题:

  1. 基于表单的认证如何与数据库和LDAP等其他领域的安全机制协同工作。(这是非常必要的,因为许多组织已经在数据库和LDAP表单中实现了认证机制。)
  2. 如何在Web应用程序的部署描述符(web.xml)中增加或删除授权角色。
  3. Web容器在Web资源层次上进行授权;应用程序则需要在单一的Web资源中执行功能层次上的授权。

  尽管有许多与基于表单的认证有关的文档和例子,但都没有能够阐明这一问题。因此,大多数的应用程序都以自己的方式襀安全机制。

  本篇文章说明了基于表单的认证如何与其他方面的安全机制,尤其是数据库中的安全机制协作的问题。它还解释了Web窗口如何使用安全角色执行授权以及应用程序如何扩展这些安全角色,保护Web资源中的功能。

 

      基于表单的认证

 

      基于表单的认证能够使开发人员定制认证的用户界面。web.xml的login-config小节定义了认证机制的类型、登录的URI和错误页面。

 

      <login-config>
            <auth-method>FORM</auth-method>
            <form-login-config>
                  <form-login-page>/login.jsp</form-login-page>
                  <form-error-page>/fail_login.html</form-error-page>
            </form-login-config>
      </login-config>

 

  登录表单必须包含输入用户姓名和口令的字段,它们必须被分别命名为j_username和j_password,表单将这二个值发送给j_security_check逻辑名字。

      下面是一个该表单如何在HTML网页中实现的例子:

 

      <form method="POST" action="j_security_check">
            <input type="text" name="j_username">
            <input type="password" name="j_password">
      </form>

 

  除非所有的连接都是在SSL上实现的,该表单能够透露用户名和口令。当受保护的Web资源被访问时,Web容器就会激活为该资源配置的认证机制。

  为了实现Web应用程序的安全,Web容器执行下面的步骤:

  1. 在受保护的Web资源被访问时,判断用户是否被认证。
  2. 如果用户没有得到认证,则通过重定向到部署描述符中定义的注册页面,要求用户提供安全信任状。
  3. 根据为该容器配置的安全领域,确认用户的信任状有效。
  4. 判断得到认证的用户是否被授权访问部署描述符(web.xml)中定义的Web资源。

  象基本的安全认证机制那样,在Web应用程序的部署描述符中,基于表单的认证不指定安全区域。也就是说,它不明确地定义用来认证用户的安全区域类型,这就会在它使用什么样的安全区域认证用户方面引起混淆。

  要对用户进行验证,Web窗口需要完成下面的步骤:

  1. 判断该容器配置的安全区域。
  2. 使用该安全区域进行认证。

  由于数据库和LDAP在维护信息方面提供了更大的灵活性,因此大多数组织都会希望继续使用它们维护安全认证和授权信息。

  许多Web窗口都支持不同类型的安全区域:数据库、LDAP和定制区域。例如,在Tomcat Web容器中,server.xml将数据库配置为其安全区域。

 

      <Realm className="org.apache.catalina.realm.JDBCRealm"
                    debug="99"
                    driverName="oracle.jdbc.driver.OracleDriver"
                    connectionURL="jdbc:oracle:thin:@{IPAddress}:{Port}:{Servicename}"
                    connectionName="{DB Username}"
                    connectionPassword="{Password}"
                    userTable="users"
                    userNameCol="username"
                    userCredCol="password"
                    userRoleTable="user_roles"
                    roleNameCol="rolename" />

 

  Tomcat的server.xml的<Realm>标志定义了窗口用来识别一个用户的安全区域的类型。注意,容器对Web应用程序使用该区域,应用程序的认证机制是基于表单的。

 

  授权

 

  一旦用户被识别后,容器就会得到认证用户的安全角色,看用户是否属于在部署描述符中的<auth-constraint>标志中定义的安全角色之一。如果用户不属于任何一个安全角色,则容器会返回一个错误。
      部署描述符(web.xml)的<security-constraint>标志定义了被保护的Web资源和能够访问这些资源的安全角色清单。

 

      <security-constraint>
            <web-resource-collection>
                  <web-resource-name>AdminPages</web-resource-name>
                  <description> accessible by authorised users </description>
                  <url-pattern>/admin/*</url-pattern>
                  <http-method>GET</http-method>
            </web-resource-collection>
            <auth-constraint>
                  <description>These are the roles who have access</description>
                  <role-name>manager</role-name>
            </auth-constraint>
      </security-constraint>

 

  Web窗口在网页层次上执行认证。然而,商业性应用程序可能还希望对一个网页内的功能进行认证,这会要求在应用程序中定义一些新的附加的与应用程序有关的安全角色。为了控制对功能的访问,应用程序需要理解角色的权限概念。Web容器标准没有解决权限的问题。

  由于授权角色是动态的,开发人员常常会感到迷惑,即这些安全角色是否需要添加到部署描述符中。为了使应用程序充分利用安全支持,Web容器只需要在部署描述符中定义的一个角色。因此,应用程序可以定义一个高层次的角色,然后将所有的用户都指派给该角色。这将使该角色中的所有用户都拥有能够访问Web资源的权限。

  另外,应用程序还可以定义额外的角色,执行对一种Web资源中较低层次的功能的授权。由于应用程序已经配置有一个包含应用程序中所有用户的高层次安全角色,这些低层次的安全角色也就不需要在部署描述符中进行定义。这使得Web应用程序能够利用容器的授权支持,实现与指定应用程序有关的授权。

  我们可以在部署描述符中为所有用户定义一个高层次的管理员角色,保护管理类Web资源,这使得管理员角色中的所有用户都能够访问管理网页。为了控制管理网页中的其他功能,我们可以在应用程序中创建 sysadmin或appadmin等新的角色。

  应用程序可以对这些安全角色进行扩展,使它们拥有一定的权限。然后,应用程序可以使用这些权限来控制对其功能的访问。

  尽管与特定应用程序相关的安全角色不是定义在部署描述符中的,这些角色仍然可以在isUserInRole方法中使用,判断用户是否在这些安全角色中。

 

      优点

 

  1. Web应用程序无需实现认证机制,简化Web应用程序的配置。
  2. Web应用程序能够使用getRemoteUser、IsUserInRole和getUserPrincipal方法实现有规划的安全。
  3. Web应用程序能够将认证信息传播给EJB容器。

     

      在Tomcat中配置数据库安全区域

 

      1. 创建用户表。
          该数据库表需要有username和password二个字段。

 

          create table users (username varchar(20) not null, password(20) not null)


      2. 创建角色表

          该表维护着应用程序中角色的清单,它仅仅有rolename一个字段。

 

          create table roles (rolename varchar(20) not null)

 

      3. 创建用户-角色关联表

          该表维护着一个用户和各个角色之间的关联,一个用户可以属于一个或多个角色。

 

          create table user_roles (username varchar(20) not null, rolename varchar(20) not null)

 

      4. 在表中插入数据

 

          insert into users values('user1', 'password')

          insert into role values('manager')

          insert into user_roles values('user1', 'manager')

 

      5. 通过将下面的信息拷贝到{tomcat}\conf\文件夹的server.xml文件中,配置Tomcat。(本例使用了薄客户端驱动程序,Tomcat使用内存区域作为缺省的安全区域,我们使用基于数据库的安全区域)

 

      <Realm className="org.apache.catalina.realm.JDBCRealm"
                   debug="99"
                   driverName="oracle.jdbc.driver.OracleDriver"
                   connectionURL="jdbc:oracle:thin:@{IP address}:{Port}:{Servicename}"
                   connectionName="{DB Username}"
                   connectionPassword="{Password}"
                   userTable="users"
                   userNameCol="username"
                   userCredCol="password"
                   userRoleTable="user_roles"
                   roleNameCol="rolename"
      />

 

  用环境变量替换下面的值:

  {IP Address} ━━数据库服务器的IP地址

  {Port} ━━端口号

  {Servicename} ━━服务名字

  {DB Username} ━━数据库登录

  {Password} ━━数据库登录的口令

 

      6. 将Oracle的薄客户机驱动程序JAR文件或数据库的JDBC驱动程序拷贝到{tomcat_home}/server/lib目录中。

      7. 用下面的安全约束配置Web应用程序的部署描述符

 

      <security-constraint>
            <web-resource-collection>
            <web-resource-name>Protected Area</web-resource-name>
            <!-- 定义需要被保护的URL -->
                  <url-pattern>/*</url-pattern>
                  <http-method>DELETE</http-method>
                  <http-method>GET</http-method>
                  <http-method>POST</http-method>
                  <http-method>PUT</http-method>
            </web-resource-collection>
            <auth-constraint>
                        <role-name>manager</role-name>
            </auth-constraint>
            <user-data-constraint>

                        <transport-guarantee>
                                    NONE

                        </transport-guarantee>

            </user-data-constraint>
      </security-constraint>

      <!-- 缺省的登录配置使用基于表单的认证 -->

      <login-config>
            <auth-method>FORM</auth-method>
            <realm-name>Example Form-Based Authentication Area</realm-name>
            <form-login-config>
                  <form-login-page>/jsp/login.jsp</form-login-page>
                  <form-error-page>/jsp/error.jsp</form-error-page>
            </form-login-config>
      </login-config>

 

  需要注意的是,<auth-constraint>中<role-name>的值应当是用户-角色关联表中中角色之一。

 

  在Tomcat中配置例子文件

 

  1. 使用上面介绍的命令配置Tomcat。
  2. 打包你的工程,并将它拷贝到Tomcat的webapps目录。
  3. 启动Tomcat服务器
  4. 打开一个浏览器,输入下面的地址:http://localhost:8080/useProjectName/index.jsp
  5. 输入用户名和口令。

  在WebLogic中配置数据库安全区域

 

  配置Web应用程序的部署描述符,这一过程与在Tomcat中配置非常相似。Tomcat和WebLogic的配置描述符之间的一个差别是,WebLogic配置描述符要求下面的小节,而Tomcat不需要下面的小节:

 

      <security-role>
            <description>
                  Manager security role
            </description>
            <role-name>
                  manager
            </role-name>
      </security-role>

 

      结论

 

  通过本篇文章,读者应该会对基于表单的认证、以及它如何与数据库安全区域配合进行认证有个比较深刻的认识。Web应用程序能够利用基于表单的认证机制,保护它的资源,同时允许使用以前的安全认证机制。

  另外,本篇文章还描述了J2EE Web提供的授权支持层次,以及在不修改Web应用程序的部署描述符的情况下如何定义新的安全角色。

 

 

      自己的话:我是按照上面的步骤一步一步完成的,当然某些方面也有所不同,例如:我用的是SQL SERVER数据库,并且在配置安全区域时将driverName, connectionURL等信息直接写入server.xml, 而不是通过环境变量.

      我遇到的问题有: 当配置完基于数据库的安全区域后, 当使用"admin/空密码"进入Tomcat的管理界面时, 无法登录, 必须使用数据库中配置的用户名和密码: "user1/password" 登录.

 

      我打开了"{tomcat}\server\webapps\manager\WEB-INF\web.xml " 察看它的配置

 

      <security-constraint>
            <web-resource-collection>
                  <web-resource-name>HTMLManger and Manager command</web-resource-name>
                        ...
                        <url-pattern>/html/* </url-pattern>  <!-- 这个是Tomcat管理界面的URL -->
                        ...
            </web-resource-collection>
            <auth-constraint>
            <!-- NOTE:  This role is not present in the default users file -->
                  <role-name>manager </role-name>
            </auth-constraint>

      </security-constraint>

 

      它使用的也是manager 的角色。

      我又查看了server.xml, 我们上面已经看到了, 我们在server.xml 里加了一个基于数据库的安全区域, 而server.xml里原先有一个基于内存的安全区域:

 

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                   resourceName="UserDatabase"/>

      和

      <Resource name="UserDatabase"

                        auth="Container"
                        type="org.apache.catalina.UserDatabase"
                        description="User database that can be updated and saved"
                        factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                        pathname="conf/tomcat-users.xml" />

 

      这里的"conf/tomcat-users.xml" 就是我们通常的 "admin/空密码" 的来源, 我猜想不能使用"admin/空密码"进入管理页面肯能使因为Tomcat下只能配置一个安全区域造成的.

      这个答案是我猜想的,如果有哪位高人知道答案还请不吝赐教.

 

      附件里是BASIC和FORM认证的两个例子, 安全区域都是基于数据库的

 

      <Realm className="org.apache.catalina.realm.JDBCRealm"
                   debug="99"
                   driverName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
                   connectionURL="jdbc:microsoft:sqlserver://localhost:1433;databaseName=TomcatAuthentication;SelectMethod=cursor"
                   connectionName="sa"
                   connectionPassword=""
                   userTable="users"
                   userNameCol="username"
                   userCredCol="password"
                   userRoleTable="user_roles"
                   roleNameCol="rolename"/>

 

要把上面这段配置这个加到server.xml 中. 并将msutil.jar msbase.jar mssqlserver.jar 复制到 "Tomcat 安装目录/server/lib" 下

 

  • 大小: 13.4 KB
分享到:
评论

相关推荐

    使用 Apache HttpClient 突破 J2EE 站点认证.docx

    出于安全性的需要和用户授权管理的考虑,常见的 J2EE 站点对特定资源都会加入认证/授权机制。...为了实现这样的功能,J2EE 站点通常会采用某种站点认证机制,其中常见的有 HTTP Basic 认证和 J2EE Form-Based 认证。

    基于J2EE的介绍

    ava 2,企业版 (J2EE) 平台在过去的几年一直是全球市场领先的企业平台。但是,像任何大型的技术、 J2EE 需要投入大量的时间来学习。水平技术: ...•JAAS(Java认证和授权):用于管理安全性的接口。

    Spring集成Acegi安全框架在J2EE中的应用

    然而对于一个完整的应用系统,完善的认证和授权机制是必不可少的,Acegi是一个基于Spring的安全框架,探讨了Spring框架集成Acegi的方法,即在Spring的IOC配置文件中定义所有的安全逻辑,改变了传统的通过编写代码的...

    基于J2EE在分布式环境下的底层结构(外文翻译+文献综述).rar

    这个.rar文件包含了一份关于...此外,这份资料对于理解J2EE的安全性、事务管理、持久化机制等方面也至关重要。它可能会提供关于如何在分布式系统中实现认证、授权、数据加密的最佳实践,以及如何使用JTA(Java Transac

    Java2环境下身份认证和授权机制的研究

    针对目前 Java技术的广泛应用, 特别是很多基于 J2EE 平台的电子商务系统的开发, 文中介绍了 Java2下的一种身 ...由于身份认证和授权与安全机制密切相关, 同时也对 Java的安 全及权限访问控制做了一些阐述

    基于Spring Security的虚拟实验安全机制的研究与实现

    在授权访问层面,通过整合Spring Security安全框架与J2EE构架来保证得到授权的用户访问Web资源时的安全性;在信息传送安全性层面,对XML加/解密算法改进设计,提高信息传送的安全性和快捷性。从以上3个层面确立的...

    Axis的安全访问机制

    J2EE Web 服务中的Handler技术特点非常像Servlet技术中的Filter Web服务中的Handler通常也提供一下的功能: 对客户端进行认证、授权; 把用户的访问写入系统日志; 对请求的SOAP消息进行加密,解密; 为Web Services...

    ibm_java(ibm课程系列)

    通过提供统一的开发平台,J2EE降低了开发多层应用的费用和复杂性,同时提供对现有应用程序集成强有力支持,完全支持Enterprise JavaBeans,有良好的向导支持打包和部署应用,添加目录支持,增强了安全机制,提高了...

    基于远程服务的Android平台下SQlite数据库安全机制的研究与实现 (2013年)

    基于客户端/服务器的模型,对Android操作系统下的SQlite数据库提出了一个安全保障机制.客户端除了基于Blowfish算法实现了SQlite数据库的加解密接口以外,还实现了一个本地服务器和一个身份认证应用程序.远程服务器基于...

    Spring Security 中文教程.pdf

    18.2.2. J2EE容器认证 19. LDAP认证 19.1. 综述 19.2. 在Spring Security里使用LDAP 19.3. 配置LDAP服务器 19.3.1. 使用嵌入测试服务器 19.3.2. 使用绑定认证 19.3.3. 读取授权 19.4. 实现类 ...

    SpringSecurity 3.0.1.RELEASE.CHM

    17.2.2. J2EE容器认证 18. LDAP认证 18.1. 综述 18.2. 在Spring Security里使用LDAP 18.3. 配置LDAP服务器 18.3.1. 使用嵌入测试服务器 18.3.2. 使用绑定认证 18.3.3. 读取授权 18.4. 实现类 18.4.1. ...

    依时利一卡通单机版

    我们提供的统一认证与授权中心是基于J2EE、 JAVA、 WEB、 SERVICES等技术开发的,拥有完全的自主版权,可以满足客户加强一卡通的安全控制和使用的方便性,又可有效地降低一卡通系统的部署成本。 4.一卡通和数字化...

    Spring Security-3.0.1中文官方文档(翻译版)

    18.2.2. J2EE 容器认证 19. LDAP 认证 19.1. 综述 19.2. 在Spring Security 里使用LDAP 19.3. 配置LDAP 服务器 19.3.1. 使用嵌入测试服务器 19.3.2. 使用绑定认证 19.3.3. 读取授权 19.4. 实现类 ...

    数据交换平台规范

     数据交换平台服务器采用满足J2EE规范的应用服务器实现  数据交换平台包含的数据交换服务使用纯Java接口作为统一的抽象接口描述 ... 数据交换平台要求提供安全认证和授权访问机制,确保数据交换的安全

    实现基于Spring框架应用的权限控制系统

    摘要Spring框架是一个优秀的多层J2EE系统框架,Spring本身没有提供对系统的安全性支持。Acegi是基于SpringIOC和AOP机制实现的一个安全框架。本文探讨了Acegi安全框架中各部件之间的交互,并通过扩展Acegi数据库设计...

    基于Spring框架应用的权限控制系统的研究和实现

    摘要Spring框架是一个优秀的多层J2EE系统框架,Spring本身没有提供对系统的安全性支持。Acegi是基于SpringIOC和AOP机制实现的一个安全框架。本文探讨了Acegi安全框架中各部件之间的交互,并通过扩展Acegi数据库设计...

    超级有影响力霸气的Java面试题大全文档

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    基于jbpm与activiti的工作流平台技术架构介绍

    系统的安全认证机制如下所示: 【图五】系统安全拦截原理 4.动态表单管理 BPMX3提供了基于数据库内部表、外部表、视图等来生成在线的流程表单的功能,其生成是基于模板,模板可由开发人员进行自定义,也可以采用...

Global site tag (gtag.js) - Google Analytics