`

seam2.1权限验证(15.5)@Restrict注解 (二)

    博客分类:
  • Seam
阅读更多
15.6.5. 实体安全控制(Securing Entities)Seam安全模块允许给实体添加read,insert,update和delete操作。如果想要控制所有操作,那么只要在实体类上添加一个@Restrict注解:
Java代码

@Entity 
@Name("customer")  
@Restrict 
public class Customer {  
  ...  

@Entity@Name("customer")@Restrictpublic class Customer {  ...}
如果@Restrict注解内部没有写任何权限判断表达式,那么默认的权限为entity:action,这里的entity为实体的实例。冒号后的操作有四种,分别是:read、insert、update、delete。
也可以单独指定某个生命周期操作,在@Restrict注解之外添加相应的注解到对应生命周期的方法上即可。共有以下四种注解:
- @PostLoad - 当一个实体的实例从数据库中读取出来以后调用。使用这个方法来配置read权限。
- @PrePersist - 插入数据库之前,insert
- @PreUpdate - 更新之前,update
- @PreRemove - 删除之前,delete
下面这个例子介绍了如果给所有insert操作添加安全检查。请注意,这个方法并不需要做任何事情,唯一需要注意的就是,这个方法是如何被声明的:
Java代码

@PrePersist @Restrict 
public void prePersist() {} 
@PrePersist @Restrictpublic void prePersist() {}
你也可以在/META-INF/orm.xml文件中定义:
Xml代码

<?xml version="1.0" encoding="UTF-8"?> 
<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> 
<?xml version="1.0" encoding="UTF-8"?><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>
当然,你仍然需要使用@Restrict来注解Customer对象中的prePersist()方法。
下面这个例子介绍了使用规则判断当前用户是否有权限添加一篇新的MemberBlog记录(来自seamspace示例)。
在下面这个规则中,需要被检查权限的实体会被自动插入到working memory中(这里就是指MemberBlog对象的实例):
Xml代码

rule InsertMemberBlog  
  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; 
rule InsertMemberBlog  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;
这条规则的含义是:如果当前被验证用户(在规则中是用Principal来表示的)的姓名与当前将要被创建的blog的用户名相同,则检查当前用户是否拥有memberBlog:insert权限(还是当姓名相同的时候授予当前用户插入权限,译者并不是很清楚)。
类似“principal: Principal()”的结构代表一个变量绑定,它将Principal对象的实例从working memory中取出(在authentication的时候装载进入working memory的),并且给他取个变量名叫principal。变量一旦被绑定以后,其他地方就可以通过变量名来获取对象,例如在接下来的几行中,将member的用户名与Principal的name比较。如果想要了解更多有关规则的内容,请参考Drools文档。
最后,我们需要添加一个监听器来将seam security与你的JPA provider集成起来。
15.6.5.1. 使用JPA实现实体安全控制(Entity security with JPA)EJB3实体的安全控制通过一个EntityListener来实现。你可以在META-INF/orm.xml写以下代码来安装这个监听器:
Xml代码

<?xml version="1.0" encoding="UTF-8"?> 
<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> 
<?xml version="1.0" encoding="UTF-8"?><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>
15.6.5.2. 使用一个受管的Hibernate Session来实现实体安全控制(Entity security with a Managed Hibernate Session) 如果你在Seam中使用Hibernate的SessionFactory,并且也使用了注解或者orm.xml文件进行映射配置,那么你不需要做任何事情就可以使用实体安全控制。
15.6.6. 类型安全的权限注解(Typesafe Permission Annotations)seam提供了一组用来替代@Restrict的安全注解。由于这些注解不能想@Restrict这样灵活,所以这些注解提供了更高级别的编译时安全(compile-time safety)控制。
seam提供了一组标准的CRUD注解,当然,你可以扩展并添加属于你自己的注解。下面几个注解你能够在org.jboss.seam.annotations.security包内找到:
- @Insert
- @Read
- @Update
- @Delete
只需要将它们写在你想要检查权限的方法或者参数前面即可。如果放在方法前面,那么你需要指定一下需要检查权限的目标的class:
Java代码

@Insert(Customer.class)  
public void createCustomer() {  
    ...  

@Insert(Customer.class)public void createCustomer() {    ...}
在这个例子里面,当用户尝试创建一个新的Customer对象的时候,会去检查用户是否有相应权限。需要检查权限的对象为Customer.class(实际上是其本身的java.lang.Class实例),而需要判断权限的操作为注解的小写方式,这里为insert。
这种注解同样也可以用在方法的参数上面。如果加在参数上,那么你不需要指定权限验证的目标(因为参数值本身就将作为权限验证的目标):
Java代码

public void updateCustomer(@Update Customer customer) {  
    ...  

public void updateCustomer(@Update Customer customer) {    ...}
如果你想要编写自己的权限验证注解接口,只需要在注解接口上添加@PermissionCheck即可,例如:
Java代码

@Target({METHOD, PARAMETER})  
@Documented 
@Retention(RUNTIME)  
@Inherited 
@PermissionCheck 
public @interface Promote {  
   Class value() default void.class;  

@Target({METHOD, PARAMETER})@Documented@Retention(RUNTIME)@Inherited@PermissionCheckpublic @interface Promote {   Class value() default void.class;}
如果你想覆盖默认的权限判断操作,那么你可以在@PermissionCheck中指定你想覆盖的操作名称(小写):
Java代码

@PermissionCheck("upgrade") 
@PermissionCheck("upgrade")
15.6.7. 类型安全的角色控制注解(Typesafe Role Annotations)除了权限注解之外,Seam安全模块同样也提供了类型安全的角色注解。这些注解允许你根据用户所拥有的角色来判断是否能够进行相关操作。
Seam单独提供了这么一个注解:org.jboss.seam.annotations.security.Admin。这个注解用来判断用户是否拥有admin角色(只要你的程序里面支持这个角色)。想要创建你自己的角色判断注解,只需要在你编写的注解接口上额外添加一个org.jboss.seam.annotations.security.RoleCheck注解,例如:
Java代码

@Target({METHOD})  
@Documented 
@Retention(RUNTIME)  
@Inherited 
@RoleCheck 
public @interface User {   

@Target({METHOD})@Documented@Retention(RUNTIME)@Inherited@RoleCheckpublic @interface User { }
当编写了上面这个注解以后,只要添加了这个注解的地方,就会自动去检查用户是否拥有user角色(注解名称的小写形式)。

分享到:
评论

相关推荐

    seam2.1说明文档

    相较于 Seam 2.0 版本,Seam 2.1 在权限验证方面进行了大量的增强,引入了更多的功能和改进,以适应更加复杂的应用场景。 #### 二、Seam 2.1 的新增特性与改进 在 Seam 2.1 中,最显著的变化之一就是增强了安全性...

    seam 2.1 参考手册

    - **Annotation的支持**:Seam 2.1支持在Wicket内部类中使用注解,这为开发者提供了更多的灵活性来组织代码结构。 - **业务流程管理**:通过Seam 2.1,开发者可以在Wicket应用中更好地控制业务流程管理任务,例如...

    Seam 2.1 安全模块框架

    总的来说,Seam 2.1 的安全模块框架提供了一套强大且灵活的工具,涵盖了从身份验证到权限管理的全过程,帮助开发者构建安全的 Java 应用程序。通过其丰富的 API 和组件,开发者可以快速定制和集成各种安全策略,确保...

    基于Seam2.1的最新力作《Seam Framework: Experience the Evolution of Java EE, 2nd Edition》全书

    ### 基于Seam2.1的最新力作《Seam Framework: Experience the Evolution of Java EE, 2nd Edition》全书知识点概览 #### 一、Seam框架简介 Seam框架是JBoss组织推出的一个开源项目,旨在简化企业级应用开发,通过...

    接上篇(seam登录时的权限验证)之“seam基于数据库的权限验证”

    此外,还可以使用Seam的`@Restrict`注解进行更细粒度的控制。 3. **数据库设计**:为了实现基于数据库的权限管理,我们需要设计一个包含用户、角色和权限关系的数据库模型。通常,会有一个`User`表存储用户信息,一...

    jboss-seam2.1

    Seam 是一种业级 企 Java 的应规用程序框架。它的灵感源自下列原 : 只有一种“工具” Seam为 应 业务业业 义 种统 组 你的 用程序中所有的 定 了一 一的 件模型。 Seam组件可能是 态义 关关 态 有状 的,包含与几...

    Jboss seam2.1版本开发参考文档

    ### JBoss Seam 2.1版本开发参考知识点 #### 一、JBoss Seam 框架简介 **JBoss Seam** 是一个企业级Java Web应用框架,它简化了基于Java平台的应用程序开发过程。该框架提供了强大的上下文管理功能、会话管理、...

    基于Seam2.1的最新力作《Seam Framework: Experience the Evolution of Java EE, 2nd Edition》摘要

    ### 基于Seam2.1的最新力作《Seam Framework: Experience the Evolution of Java EE, 2nd Edition》摘要分析 #### 核心概念:Seam框架概述 Seam框架是一款革命性的Web应用开发框架,它将标准的Java EE技术与一系列...

    seam的注解和标签

    - `&lt;s:form&gt;`: 是Seam提供的增强版的JSF表单标签,它可以自动处理Seam组件的绑定和验证。 - `&lt;s:in&gt;` 和 `&lt;s:out&gt;`: 分别用于注入和输出Seam组件。它们类似于EL表达式,但在某些情况下,如在JSF的EL无法解析时,...

    jboss-seam 注解

    ### jboss-seam 注解详解 #### @Name 在JBoss Seam框架中,`@Name`注解主要用于定义一个Seam组件。为了确保组件能够被正确识别与使用,每个Seam组件都必须拥有一个唯一的名称标识,即通过`@Name`来指定。例如: `...

    jboss seam 2.0 中文手册

    整理自jboss seam 中文站,压缩为chm格式,便于广大jboss seam爱好者阅读,所有版权归jboss seam中文站所有。

    seam 注解 pdf

    #### 二、Seam注解基础概念 Seam注解主要分为几个类别:组件定义注解、生命周期管理注解、拦截器控制注解等。下面将详细介绍这些注解的具体用法及其应用场景。 #### 三、组件定义注解 组件定义注解主要用于定义...

    jboss seam 注解

    ### JBoss Seam 注解详解 #### 一、`@Name`与`@Scope` - **`@Name`**: 此注解用于标识一个类作为Seam组件,并为其定义一个名称,例如`@Name("componentName")`。这是所有Seam组件的必备注解。 - **`@Scope`**: ...

    seam+hibernate注册例子

    Seam和Hibernate是两个在Java开发中非常重要的框架。Seam是一个全面的、集成的Java EE框架,主要用于简化企业级应用的开发,而Hibernate则是一个强大的对象关系映射(ORM)框架,它允许开发者用Java对象来操作数据库...

    Seam Framework 2.0 Reference中文版

    #### 第二章:用 Seam-gen 起步 本章介绍了如何使用 Seam-gen 快速构建 Seam 应用程序。 - **准备活动**:准备开发环境,包括安装必要的软件和配置工具。 - **建立一个新的 Eclipse 项目**:使用 Eclipse 创建一个新...

    jboss Seam2.0 语境相关的组件文档

    例如,Seam引入了`@Name` 注解,允许在没有JavaBeans约定的情况下为组件命名,以及`@Factory` 注解,用于创建组件的工厂方法。 **5. 事件处理** Seam的事件模型允许组件间异步通信。使用`@Create`、`@Destroy`等...

    Seam - 语境相关的组件

    在安全方面,Seam支持身份验证和授权,可以轻松地集成到已有的安全框架,如JAAS(Java Authentication and Authorization Service)。它还提供了对富客户端应用的支持,比如AJAX功能,这使得Web应用能够实现更丰富的...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................

    seam一些基本功能的实现方法

    通过使用 Seam的注解驱动编程,如`@Name`和`@In`,可以轻松地注入依赖,使得代码更加简洁和可读。 Seam还包含了强大的事件模型,允许组件之间通过发布和监听事件来通信。例如,一个组件可以通过`EventContext`发布...

Global site tag (gtag.js) - Google Analytics