我很好奇在将我的应用程序从seam 2.0迁移到2.1时遇到了什么样的障碍。
在migration guide中提到了明显的问题,但我遇到了基于规则的安全性的一些问题,那里没有提到。
首先,我想通过迁移发布我的问题和解决方案的描述,这样人们就可以受益(我没有在网上找到任何解决方案) - 我会将其作为答案发布:)
其次,我想问你在迁移时遇到了什么问题,以及你是如何解决它的,所以它在网上的一个地方。
答案 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()
。
名称参数已替换为目标参数,即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。