AndroMDA Getting started(九)-大结局

来源:互联网 发布:淘宝黑号查询 编辑:程序博客网 时间:2024/05/16 18:32
19.与Acegi安全系统集成

在这一章我们会在timetracker中增加安全,通过集成Acegi安全系统。集成会确保只有认证的用户才能访问安全的页面。当前在timetracker中的所有页面都要求是安全的,除了登录页面。即使用户收藏一个页面并且不通过他的证书来访问,那么acegi也会拦截请求并且提供登录界面。一旦证书被提供并且被认证通过,用户可以直接访问他们试图访问的页面。

我们选择Acegi安全系统因为它为企业应用提供了一种轻便和高效的安全框架。察看Acegihttp://www.acegisecurity.org/ 网站了解关键特性。也可以查看Frequently Asked Questions 来了解在可选的解决方案之上提供的内容,如web.xml安全和JAAS。你可能已经想阅读Acegi参考手册的Overall Architecure章节。

SecurityService

我们首先创建一个新的服务叫做SecurityService,允许前台用来验证用户证书。我们没有选择把这个功能增加到UserService因为这个信息是包含秘密规则。UserService可能有一些你想暴露给外部世界的东西,但是没有密码和相近的其他安全信息。下面的步骤增加SecurityServiceTimeTracker

1.  Domain Objects图中,增加一个枚举叫做Role。这个枚举提供了认证的用户能应用的角色。确认Role被创建在org.andromda.timetracker.domain包下。

2.  接着,在Domain Objects图中,增强User实体用额外的属性来支持安全。注意Acegi仅需要用户名和密码项,我们增加了其他的属性仅仅能显示acegi如何能支持额外的安全需求。

3.  现在增加UserRole实体,在UserUserRole增加一对多的关系。

4.  我们现在准备创建要被SecurityService使用的value objects。在Value Objects图中创建UserDetailsVOUserRoleVOUserRoleVO[]。注意UserDetailsVO集成UserVO使用泛化关系。接下来创建依赖关系,如图所示。

5.我们最后准备创建SecurityService。增加SecurityServiceServices图中。增加到User实体的依赖关系。

5.  增加方法到User实体中来允许读取User和它的角色-所有在一个数据库中。这里是这个方法的描述:

+getUserDetails(username:String):User

因为我们想要这个方法在DAO中被生成,改变它的范围为classifier

6.  现在完成了模型中的所有变更。现在让我们生成代码:mvn install ,测试会失败因为数据库schema没有变化。

7.  删掉数据库schema并且创建一个新的:

Mvn –f core/pom.xml andromdapp:schema –Dtasks=drop,create

8.  执行新的schema以及下面的测试数据。

-- Password is 'cooldude' encoded using MD5
insert into USERS
    (ID, USERNAME, PASSWORD, FIRST_NAME, LAST_NAME,
     EMAIL, IS_ACTIVE, CREATION_DATE, COMMENT)
    values (1, 'nbhatia',      '756slLjeNViurJBGI5JeqA==', 'Naresh', 'Bhatia',
            '
 nbhatia@northwind.comThis email address is being protected from spam bots, you need Javascript enabled to view it
 ',      1, '2006/01/01 09:00', null);
insert into USERS
    (ID, USERNAME, PASSWORD, FIRST_NAME, LAST_NAME,
     EMAIL, IS_ACTIVE, CREATION_DATE, COMMENT)
    values (2, 'lcoude',       '756slLjeNViurJBGI5JeqA==', 'Louis',  'Coude',
            '
 lcoude@northwind.comThis email address is being protected from spam bots, you need Javascript enabled to view it
 ',       1, '2006/01/01 09:00', null);
insert into USERS
    (ID, USERNAME, PASSWORD, FIRST_NAME, LAST_NAME,
     EMAIL, IS_ACTIVE, CREATION_DATE, COMMENT)
    values (3, 'ecrutchfield', '756slLjeNViurJBGI5JeqA==', 'Eric',   'Crutchfield',
            '
 ecrutchfield@northwind.comThis email address is being protected from spam bots, you need Javascript enabled to view it
 ', 1, '2006/01/01 09:00', null);
insert into USERS
    (ID, USERNAME, PASSWORD, FIRST_NAME, LAST_NAME,
     EMAIL, IS_ACTIVE, CREATION_DATE, COMMENT)
    values (4, 'cmicali',      '756slLjeNViurJBGI5JeqA==', 'Chris',  'Micali',
            '
 cmicali@northwind.comThis email address is being protected from spam bots, you need Javascript enabled to view it
 ',      1, '2006/01/01 09:00', null);
 
insert into USER_ROLE (ID, ROLE, USER_FK)
    values (1, 'StandardUser',  1);
insert into USER_ROLE (ID, ROLE, USER_FK)
    values (2, 'Administrator', 1);
insert into USER_ROLE (ID, ROLE, USER_FK)
    values (3, 'StandardUser',  2);
insert into USER_ROLE (ID, ROLE, USER_FK)
    values (4, 'StandardUser',  3);
insert into USER_ROLE (ID, ROLE, USER_FK)
    values (5, 'StandardUser',  4);
 
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values ( 1, 'Approved',  '2006/05/15', 'Timecard 01', 1, 2);
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values ( 2, 'Approved',  '2006/05/15', 'Timecard 02', 2, 3);
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values ( 3, 'Approved',  '2006/05/15', 'Timecard 03', 3, 4);
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values ( 4, 'Approved',  '2006/05/15', 'Timecard 04', 4, 1);
 
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values ( 5, 'Rejected',  '2006/05/22', 'Timecard 05', 1, 2);
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values ( 6, 'Rejected',  '2006/05/22', 'Timecard 06', 2, 3);
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values ( 7, 'Rejected',  '2006/05/22', 'Timecard 07', 3, 4);
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values ( 8, 'Rejected',  '2006/05/22', 'Timecard 08', 4, 1);
 
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values ( 9, 'Submitted', '2006/05/29', 'Timecard 09', 1, 2);
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values (10, 'Submitted', '2006/05/29', 'Timecard 10', 2, 3);
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values (11, 'Submitted', '2006/05/29', 'Timecard 11', 3, 4);
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values (12, 'Submitted', '2006/05/29', 'Timecard 12', 4, 1);
 
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values (13, 'Draft',     '2006/06/05', 'Timecard 13', null, 2);
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values (14, 'Draft',     '2006/06/05', 'Timecard 14', null, 3);
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values (15, 'Draft',     '2006/06/05', 'Timecard 15', null, 4);
insert into TIMECARD (ID, STATUS, START_DATE, COMMENTS, APPROVER_FK, SUBMITTER_FK)
    values (16, 'Draft',     '2006/06/05', 'Timecard 16', null, 1);
            

9.  现在通过执行mvn install再次构建应用。这次测试会通过。

10.              让我们现在实现UserDaoImpl.handleGetUserDetails()。打开文件 core/src/main/java/org/andromeda/timetracker/domain/UserDaoImpl.java并且增加下面的实现:

protected User handleGetUserDetails(String username) throws Exception {
        User user = (User)getSession().createQuery(
            "from org.andromda.timetracker.domain.User user " +
                "left join fetch user.roles " +
                "where user.username = :username")
            .setParameter("username", username)
            .uniqueResult();
        return user;
    }

11.              UserDaoImpl.java中增加下面的导入:

import java.util.Collection;
import org.andromda.timetracker.vo.UserRoleVO;

12.              我们现在需要覆写UserDaoImpl.toUserDetailsVO()的默认实现。原因是包括从相关联的UserRol对象的属性到UserDetailsVO中。下面是方法的实现:

 

public void toUserDetailsVO(

        org.andromda.timetracker.domain.User sourceEntity,

        org.andromda.timetracker.vo.UserDetailsVO targetVO)

    {

        super.toUserDetailsVO(sourceEntity, targetVO);

 

        // Convert roles

        Collection srcRoles = sourceEntity.getRoles();

        UserRoleVO[] targetRoles = new UserRoleVO[srcRoles.size()];

        int i=0;

        for (Object srcRole : srcRoles)

        {

            targetRoles[i] = getUserRoleDao().toUserRoleVO((UserRole)srcRole);

            i++;

        }

        targetVO.setRoles(targetRoles);

    }

13. 最后,我们需要增加SecurityServiceImpl.handleGetUserDetails()的实现。打开文件 core/src/main/java/org/andromeda/timetracker/service/SecurityServiceImpl.java并且增加下面的代码:

import org.andromda.timetracker.domain.User;
import org.andromda.timetracker.vo.UserDetailsVO;
...
    protected UserDetailsVO handleGetUserDetails(String username)
        throws java.lang.Exception
    {
        UserDetailsVO userDetailsVO = null;
        User user = getUserDao().getUserDetails(username);
        if (user != null)
        {
            userDetailsVO = getUserDao().toUserDetailsVO(user);
        }
        return userDetailsVO;
    }
            

 

Acegi Integration

我们现在准备引入Acegi作为TimeTracker的依赖。

1.     编辑文件C:/timetracker/pom.xmldependencyManagement段中增加下面的依赖。如果你不确定在哪里增加这个段,看下面完整的应用的pom.xml的文件。

<dependency>
                <groupId>org.acegisecurity</groupId>
                <artifactId>acegi-security</artifactId>
                <version>1.0.1</version>
                <exclusions>
                    <exclusion>
                        <groupId>commons-codec</groupId>
                        <artifactId>commons-codec</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-remoting</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-jdbc</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-support</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

2.现在编辑文件C:/timetracker/web/pom.xml并且增加下面的依赖在下面的dependencies段。

        <dependency>
            <groupId>org.acegisecurity</groupId>
            <artifactId>acegi-security</artifactId>
        </dependency>

2.     我们需要一系列的变化在WebMergeMappings.xml中,mda/src/main/config/mappings。这些变化会触发在web容器中的Acegi过滤器链的包含。从给你的已经完成的版本中拷贝WebMergeMappings.xml

3.     接下来我们需要实现UserDetailsService,被Acegi数据库访问使用的UserDetails来使用。对于我们来说,在TimeTracker模型中,这会是非常简单的服务,代理到SecurityService。从已经完成的程序中拷贝目录/web/src/main/java/org/andromeda/timetracker/web/security到你的实现中。这个目录包含两个非常简单的java文件,实现UserDetailsService

4.     删除在c:/timetracker/web/src/main下面的jsp目录。还记得这是你定制应用感官的地方。好,现在我们增加唉一些更多的文件到这个目录中(例如定制的登录页面和Acegi配置文件)。对于本教程的目的,只是简单的拷贝刷新。

5.     下载custom-look-and-feel2.zip(http://galaxy.andromda.org/images/stories/tutorial_java/custom-look-and-feel2.zip)并且解压到C:/timetracker/web/src/main。你可以在main下面得到一个子目录叫做jsp

 

Build and deploy TimeTracker

1.  在命令提示符下执行mvn clean接着执行mvn install

2.确保JBoss服务正在运行

3.部署应用mvn –f app/pom.xml –Ddeploy

4.打开浏览器,定位到http://localhost:8080/timetracker。这次登录页面会出现因为搜索页面被配置作为安全页面。

5.登录用用户名nbhatia和密码cooldude。浏览器会显示搜索页面。

 

20Where to go from here

我们现在覆盖了使用AndroMDA必须的关键概念。你可能希望完全保留教程作为一个联系或者移到你经常想写的杀手级应用!精通了AndroMDA,你现在有一种最有力的工具来应对在你面前的挑战。不仅要成功的完成,而且也要完成的更快和更有质量。

看看其他的对你可用的cartridges-检查这里的一个列表。作为以前提到的,如果你没有找到你真正需要的cartridge,你也可以写一个你自己的-看下面的连接十步写一个cartridge(http://galaxy.andromda.org/index.php?option=com_content&task=blogcategory&id=35&Itemid=77)。当然如果你想你的cartridge对别人有用,你也可以在社区分发他们。我们创建了一个开源项目叫做AndroMDA pluginhttp://sourceforge.net/projects/andromdaplugins)。

另一个有用的资源是AndroMDAhttp://galaxy.andromda.org/forum/)论坛。如果你有任何AndroMDA使用或内部的问题,搜索论坛。如果你仍然没有找到答案,把你的问题贴到论坛。AndroMDA有经验的社区成员会看这些论坛-他们会很快的帮助你。

希望你通过使用本教程喜欢学习AndroMDA

 
原创粉丝点击