科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用 AppFuse 快速构建 J2EE 应用 7

使用 AppFuse 快速构建 J2EE 应用 7

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

系统安全 ??? AppFuse 使用 Acegi 进行安全管理

作者:中国IT实验室 来源:中国IT实验室 2007年9月9日

关键字: AppFuse 使用 编程 java

  • 评论
  • 分享微博
  • 分享邮件

系统安全

    AppFuse 使用 Acegi 进行安全管理。Acegi 的配置信息位于 web\WEB-INF\classes\security.xml。事实上,Acegi 是被集成到 Spring 当中的,因此这个文件是 Spring 的配置文件格式。在 web\WEB-INF\web.xml 中,该文件被指定在应用启动前会被加载:


清单 5. web.xml 关于 Spring 配置文件的定义

    ...
<!-- Context Configuration locations for Spring XML files -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-*.xml,/WEB-INF/security.xml</param-value>
    </context-param>
                  ...

本文关于系统安全的实现如下:

  1. 在数据库中增加新的角色“hr”:编辑 myapp\metadata\sample-data.xml 文件,增加如下黑体的部分:

    清单 6. sample-data.xml 中角色 “hr” 的记录
          ...
    <table name='role'>
        <column>id</column>
        <column>name</column>
        <column>description</column>
        <row>
          <value>1</value>
          <value>admin</value>
          <value><![CDATA[Administrator role (can edit Users)]]></value>
        </row>
        <row>
          <value>2</value>
          <value>user</value>
          <value><![CDATA[Default role for all Users]]></value>
        </row>
        <row>
          <value>3</value>
          <value>hr</value>
          <value><![CDATA[Role for employee mangement]]></value>
        </row>  
    </table>
                      ...

    AppFuse 使用 dbunit 加载样本数据到数据库中,sample-data.xml 为 dbunit 提供样本数据定义。修改完 sample-data.xml,在 c:\opt\myapp\ 下运行 “ant db-load”,样本数据被重新加载。这样,我们就在数据库中定义了一个新的角色记录 “hr”。
  2. 定义角色名称的中文显示文本:在 myapp/sr/web/webapp/action/UserForm.java 的方法 pageBeginRender 中找到如下代码:
    // initialize drop-downs
    if (getAvailableRoles() == null) {
    List roles = 
    (List) getServletContext().getAttribute(Constants.AVAILABLE_ROLES); setAvailableRoles(new RoleModel(roles)); }

    将其做如下修改:
    // initialize drop-downs
    if (getAvailableRoles() == null) {
        List roles = 
    (List) getServletContext().getAttribute(Constants.AVAILABLE_ROLES); for(int i=0;i<roles.size();i++){ LabelValue role=(LabelValue) roles.get(i); role.setLabel(getText("rolelabel_"+role.getValue())); } setAvailableRoles(new RoleModel(roles)); }

    并在 web\WEB-INF\classes\ApplicationResources_zh_CN.properties 中增加角色名称的定义:
    rolelabel_admin=系统管理员
    rolelabel_user=普通用户
                      rolelabel_hr=人事管理

    AppFuse 默认在用户管理界面上显示的角色的名称是表 role 中的名称,这样无论切换到何种语言,角色名称都是 “admin”、"user"、“hr” 等等,角色名称不能根据 Locale 用相应的语言显示。因此,本文将角色的名称用 Resource Bundle 文件定义,数据库中存储 “key” 值。修改后的效果见 图 10。
  3. 配置“安全策略”:在 web\WEB-INF\security.xml 的 bean "filterInvocationInterceptor" 声明中增加如下“黑体”的一行:
    <bean id="filterInvocationInterceptor" 
    class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
            <property name="authenticationManager" ref="authenticationManager"/>
            <property name="accessDecisionManager" ref="accessDecisionManager"/>
            <property name="objectDefinitionSource">
                <value>
                    PATTERN_TYPE_APACHE_ANT
                    /clickstreams.jsp*=admin
                    /flushCache.*=admin
                    /passwordHint.html*=ROLE_ANONYMOUS,admin,user
                    /reload.*=admin
                    /signup.html*=ROLE_ANONYMOUS,admin,user
                    /users.html*=admin
                    /employees.html*=hr
                    /**/*.html*=admin,user
                </value>
            </property>
                          </bean>

    “/employees.html*=hr” 的意思是:只有 hr 这个角色可以访问形如 “/employees.html*” 的 url。
  4. 将“员工信息维护”菜单关联到指定角色 hr:在 web\WEB-INF\menu-config.xml 中在 “EmployeeMenu” 的定义中增加 “roles='hr'”:
        <!--Employee-START-->
    <Menu name="EmployeeMenu" title="employeeList.title" 
    page="/employees.html" roles="hr"/> <!--Employee-END-->

    于是,“员工信息维护”的菜单入口只对属于“人事管理”角色的用户显示,对其他用户则隐藏。
  5. 分配角色 “hr” 给 tomcat:将“人事管理”角色分配给某一用户,例如 tomcat。则 tomcat能够看见并访问“员工信息维护”相关页面,而其他用户的界面上则没有“员工信息维护”这个菜单入口。并且,如果用户试图通过url访问employees.html的时候会看到如下页面:

    图 14. “访问被拒绝”页面
    “访问被拒绝”页面

    图 14是 AppFuse 提供的默认“访问被拒绝”页面,你可以通过修改 web\403.jsp 把它定制成自己喜欢的页面。

上一页  [1] [2] [3] [4] [5] [6] [7] [8] 下一页  

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章