`
holdbelief
  • 浏览: 706151 次
  • 性别: 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
分享到:
评论

相关推荐

    j2ee安全体系架构

    J2EE安全体系架构中,还包括以下关键组件和机制: - **角色与权限**:通过定义不同的角色(如管理员、用户等),并分配相应的权限,控制不同用户可以访问的资源和服务。 - **认证**:验证用户身份,如使用用户名/...

    j2ee课件 JavaEE安全机制,主要讲解Java安全模型、基本、Java安全体系结构、扩展Java安全体系结构、J2EE安全策略

    4. **J2EE安全策略**:在JavaEE环境中,安全策略更加复杂,涉及到角色、身份验证、授权等多个方面。例如,Servlet和JSP的安全配置可以通过部署描述符(web.xml)设定,包括定义安全角色、URL模式的访问控制,以及...

    J2ee平台安全技术架构

    J2EE提供多种身份验证机制,如基于表单的认证、基本认证(HTTP Basic Auth)和摘要认证(HTTP Digest Auth)。容器管理的身份验证(Container-Managed Authentication, CMA)通过web.xml配置文件进行设置,而应用...

    J2EE认证考试复习资料

    9. **J2EE安全**:包括角色基线访问控制(RBAC)、容器管理的权限(CMP)和应用程序管理的权限(BMP),以及HTTPS、SSL/TLS加密和认证机制。 复习J2EE认证考试的资料,例如题目集如“IT CLASS 2009 试题--CIF2”、...

    acegi应用安全J2EE安全

    Acegi Security是Spring社区早期开发的一个安全框架,用于增强J2EE应用程序的安全性。这个框架在Spring Security(之前称为Acegi Security)的后续版本中得到了发展和改进,成为了Spring生态中的核心组件。本文将...

    J2EE架构师认证指南 .rar

    6. 安全性:理解并实施各种安全机制,如SSL/TLS加密、身份验证、授权、审计等。 7. 部署和运维:熟悉持续集成/持续部署(CI/CD)流程,能处理生产环境的部署和监控问题。 8. 项目管理和沟通:优秀的架构师还需要...

    j2ee真的认证复习完整版

    - **解析**:在J2EE中,通常使用**`java.sql.DataSource`** 来管理数据库连接,它提供了一个高效的连接池机制。 ### 19. XML 配置文件 - **题目描述**:XML配置文件在J2EE中的作用是什么? - A. B. 配置 - C. ...

    j2EE权限管理项目

    J2EE提供了多种认证机制,如基于表单的认证、基本认证和摘要认证等。开发者可以根据应用需求选择合适的认证方式,并通过`web.xml`配置文件进行设置。 2. **授权**:授权是指决定认证后的用户可以访问哪些资源或执行...

    J2EE架构师认证指南

    10. **Security**:J2EE提供了一套完整的安全框架,包括角色、认证、授权和加密。理解如何配置容器安全和编程式安全是保证应用安全的关键。 11. **Design Patterns**:熟悉常见的设计模式如工厂模式、单例模式、...

    企业级java安全性(构建安全的j2ee应用) PDF

    J2EE安全模型主要基于两个核心概念:角色和权限。角色是具有特定权限的用户集合,而权限则定义了用户或角色可以执行的操作。例如,管理员角色可能有权限访问所有数据,而普通用户可能只能查看部分信息。这种模型使得...

    j2EE实现安全的AXIS Web服务

    通常,j2EE容器如Tomcat、WebLogic或GlassFish提供了内置的安全机制,如JAAS(Java Authentication and Authorization Service)和SSL/TLS协议来保障通信安全。 4. **身份验证与授权**:使用j2EE的安全框架,可以...

    企业级java安全性(构建安全的j2ee应用)

    J2EE提供了一套完整的认证机制,如容器管理的认证(Container-Managed Authentication,CMA),通过Jaas(Java Authentication and Authorization Service)进行用户身份验证。同时,授权机制如角色基础的访问控制...

    J2EE_5.0 api J2EE_5.0 api J2EE_5.0 api

    9. **Java Authentication and Authorization Service (JAAS) 1.0**: JAAS提供了安全认证和授权框架,支持多种认证模块,增强了J2EE应用的安全性。 10. **Java Remote Method Invocation (RMI) & Java Naming and ...

    J2EE网上购物系统

    1. **Struts2**:Struts2是一个强大的MVC框架,通过拦截器机制处理HTTP请求,提供了一系列的拦截器来实现如认证、授权、异常处理等功能。它的Action类负责接收并处理请求,然后返回结果到视图。Struts2还支持多种...

    企业中的Java安全策略 建立安全可靠的J2EE应用程序.zip

    2. **J2EE安全组件**:J2EE提供了多种安全组件,如身份验证(Authentication)、授权(Authorization)、加密(Cryptography)和安全管理(Security Management)。理解它们的工作原理,例如Servlet和JSP的安全配置...

    J2EE平台安全(原著是《J2EE Tutorial》)

    ### J2EE平台安全——SSL支持的安装与配置 #### 一、SSL技术概述 **Secure Socket Layer (SSL)** 是一种广泛使用的网络安全技术,旨在确保客户端(如Web浏览器)与服务器之间的通信安全。该技术的核心功能包括数据...

    J2EE tutorial 中文版

    - **事务和安全性**:涵盖JTA和JTS(Java Transaction Service),以及J2EE的安全模型和认证机制。 - **分布式服务**:讲解JMS、JNDI和其他服务,如何实现跨服务器的通信和资源查找。 - **应用程序部署**:介绍部署...

Global site tag (gtag.js) - Google Analytics