接缝2.0到2.1(2.2)迁移

时间:2009-09-28 16:32:04

标签: java jboss migration seam

我很好奇在将我的应用程序从seam 2.0迁移到2.1时遇到了什么样的障碍。

migration guide中提到了明显的问题,但我遇到了基于规则的安全性的一些问题,那里没有提到。

首先,我想通过迁移发布我的问题和解决方案的描述,这样人们就可以受益(我没有在网上找到任何解决方案) - 我会将其作为答案发布:)

其次,我想问你在迁移时遇到了什么问题,以及你是如何解决它的,所以它在网上的一个地方。

2 个答案:

答案 0 :(得分:2)

我的主要问题是基于规则的安全性。从接缝2.0到2.2,安全子系统有主要的折射。

RuleBasedIdentity

RuleBasedIdentity已被RuleBasedPermissionResolver替换。

从迁移指南引用:

  If you are using rule-based security in your project, the configuration for the 
  security rules in components.xml has changed.  Previously, the rules were configured
  as a property of the Identity component as such:

    <security:identity security-rules="#{securityRules}" authenticate-method="#{authenticator.authenticate}"/>

  In Seam 2.1, rule-based permission checks are now carried out by the RuleBasedPermissionResolver,
  requiring that it is configured with the security rules instead of Identity:

    <security:rule-based-permission-resolver security-rules="#{securityRules}"/>

此外,如果您的应用需要使用RuleBasedIdentity(例如,为安全上下文提供其他事实),则需要使用RuleBasedPermissionResolver.instance()

PermissionCheck中没有名称参数

名称参数已替换为目标参数,即Object而不是String

因此,在您的规则中,您必须替换:

c : PermissionCheck( name == 'fooHome' , action == "edit", granted == false )

with:

c : PermissionCheck( target == 'fooHome' , action == "edit", granted == false )

此外,如果您使用正则表达式:

c : PermissionCheck( name matches "\w*List")

需要替换为:

c : PermissionCheck( target.toString matches "\w*List")

Identity.hasPermission

的不同处理

它有以下签名Identity.hasPermissio(String name, String action, Object... args)

在2.1 hasPermission创建PermissionCheck with name之前,以及从调用参数中获取的操作属性,并将所有args添加到drools上下文。

因此,在调用Identity.hasPermission("fooHome", "edit", fooInstance)之后,将导致与以下规则匹配的权限检查:

rule foo
    when
    c : PermissionCheck( name == "fooHome", action == "edit")
    f : Foo()
    then
    ...
end

现在hasPermission的工作原理如下:

 public boolean hasPermission(String name, String action, Object...arg)
     {      
        if (!securityEnabled) return true;
        if (systemOp != null && Boolean.TRUE.equals(systemOp.get())) return true;   
        if (permissionMapper == null) return false;

        if (arg != null)
        {
      return permissionMapper.resolvePermission(arg[0], action);
        }
        else
        {
      return permissionMapper.resolvePermission(name, action);
        }
     }

因此,如果传递了args,则名称根本不会到达PermissionCheck。你需要重写这样的规则:

rule foo
  when
  f : Foo()
  c : PermissionCheck( target = f, action == "edit")

  then
   ...
end

答案 1 :(得分:2)

如前所述,安全处理已更改(请参阅Seam发行版中的migration.txt)。

此外,构建体系结构发生了巨大变化。如果使用生成的build.xml,则应重新生成它并手动重做您所做的更改。其他一些与构建相关的工件也是如此,一些文件现在依赖于配置文件,可部署的libs在deployed-jars-ear / war.list中指定。最简单的方法是在两个生成的项目之间进行合并,这种变化非常明显。

除了这两个,我没有任何问题从2.0升级到2.2。