Seam的安全框架-授权(Authorization)(译) (二)
<restrict/>
</page>
这个页面对于non-faces请求隐含一个权限许可:/settings.xhtml:render
,对于faces请求隐含一个权限许可:/settings.xhtml:restore
。
<restrict>#{s:hasRole('admin')}</restrict>
</page>
Seam安全也使得为实体的读取,插入,更新和删除动作应用安全限制成为可能。
为了保护实体类的所有的动作,需要在类本身添加一个@Restrict
注释:
@Name("customer")
@Restrict
public class Customer {
}
也可能通过把@Restrict注解放在相关的实体生命周期的方法上(注解如下所述),而只限制某些动作:
这里有一个例子,说明实体方法如何配置成给任何 insert
操作执行安全检查。 请注意这个方法不需要做任何事情,有关安全的唯一重要的是它如何被注解:
public void prePersist() {}
使用 /META-INF/orm.xml
你也可以在/META-INF/orm.xml
中指定一个回调方法:
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
version="1.0">
<entity class="Customer">
<pre-persist method-name="prePersist" />
</entity>
</entity-mappings>
这里有一个检查已验证用户是否允许插入一个新的MemberBlog
记录(来自seamspace例子)的实体权限规则的例子。这个被安全检查的实体自动插入到工作内存中(本例中是MemberBlog
):
no-loop
activation-group "permissions"
when
principal: Principal()
memberBlog: MemberBlog(member : member -> (member.getUsername().equals(principal.getName())))
check: PermissionCheck(target == memberBlog, action == "insert", granted == false)
then
check.grant();
end;
最后,我们需要安装一个监听器,以集成Seam安全和你的JPA提供者。
使用一个EntityListener
来进行EJB3实体Bean的安全检查。你可以使用下面的META-INF/orm.xml
文件安装这个监听器:
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
version="1.0">
<persistence-unit-metadata>
<persistence-unit-defaults>
<entity-listeners>
<entity-listener class="org.jboss.seam.security.EntitySecurityListener"/>
</entity-listeners>
</persistence-unit-defaults>
</persistence-unit-metadata>
</entity-mappings>
SessionFactory
,并且使用了注释,或者orm.xml
文件,那么你不需要做任何其他特别的操作就可以使用实体安全。 Seam提供了一些可以作为@Restrict
的替换的注释,这些注释提供在编译时是安全的好处,因为它们不像@Restrict
那样支持任意的EL表达式。
开箱即用,Seam有着标准的基于CRUD权限的注释,而且添加你自己的注释也只是一个简单的问题。接下来的这些注释是org.jboss.seam.annotations.security
包提供的:
要使用这些注释,你只需简单的把它们放在你希望执行安全检查的方法和参数那里。如果放在方法上,那么它们应该指定一个将检查权限的目标类。如下述例子:
public void createCustomer() {
}
也可以相同的方式对组件方法的参数进行注释。如果这样注释了,那么它不须要指定一个权限目标(参数值本身就是权限检查的目标):
}
为了创建你自己的安全注释,你只要简单的使用@PermissionCheck
注释,例如:
@Documented
@Retention(RUNTIME)
@Inherited
@PermissionCheck
public @interface Promote {
Class value() default void.class;
}
如果你希望使用其他值来重载默认的权限动作名称(小写的注释名称),你应该在@PermissionCheck
注释中指定:
@Documented
@Retention(RUNTIME)
@Inherited
@RoleCheck
public @interface User {
}
@User
注释的方法将被自动拦截并且检查用户是否是相应的角色名称的关系(小写的注释名,本例中是user
)。