权限验证的部分具体的我还没有弄的很明白,很多问题我都还没有用过,或者还没有试验成功过。至少在seamspace里面的代码例子,在我的CMS系统里面却跑不出结果来。
下面还有些权限的知识大家要知道下:(我这里的知识我还没有用到过)
1.只有admin才可以创建用户。
所以就要用到seam里面的____
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() {
...
}
在这个例子里面,当用户尝试创建一个新的Customer对象的时候,会去检查用户是否有相应权限。需要检查权限的对象为Customer.class(实际上是其本身的java.lang.Class实例),而需要判断权限的操作为注解的小写方式,这里为insert。
这种注解同样也可以用在方法的参数上面。如果加在参数上,那么你不需要指定权限验证的目标(因为参数值本身就将作为权限验证的目标):
public void updateCustomer(@Update Customer customer) {
...
}
如果你想要编写自己的权限验证注解接口,只需要在注解接口上添加@PermissionCheck即可,例如:
Java代码
@Target({METHOD, PARAMETER})
@Documented
@Retention(RUNTIME)
@Inherited
@PermissionCheck
public @interface Promote {
Class value() default void.class;
}
如果你想覆盖默认的权限判断操作,那么你可以在@PermissionCheck中指定你想覆盖的操作名称(小写):
@PermissionCheck("upgrade")
下面这个是编写自己的角色权限时要注意的事情了,因为seam里面已经有了这个类RoleCheck。
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
@RoleCheck
public @interface User {
}当编写了上面这个注解以后,只要添加了这个注解的地方,就会自动去检查用户是否拥有user角色(注解名称的小写形式)。
(2)这个不知道和 ----1.只有admin才可以创建用户。------有关系吗? 不知道能否帮上忙,呵呵 先写在这里。
15.6.5. 实体安全控制(Securing Entities)
Seam安全模块允许给实体添加read,insert,update和delete操作。如果想要控制所有操作,那么只要在实体类上添加一个@Restrict注解:
Java代码
@Entity
@Name("customer")
@Restrict
public class Customer {
...
}
@Entity
@Name("customer")
@Restrict
public 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 @Restrict
public 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文件进行映射配置,那么你不需要做任何事情就可以使用实体安全控制。
分享到:
相关推荐
在本篇讨论中,我们将深入探讨如何在Seam框架下进行基于数据库的权限验证,以此来确保用户只有在具备相应权限的情况下才能访问特定的资源。 首先,我们要理解Seam中的安全模型。Seam使用了JSF(JavaServer Faces)...
在构建一个基于数据库的权限系统时,架构师需要考虑如何有效地设计和实现权限管理,以满足用户、角色和系统菜单的动态配置需求。本篇内容将深入探讨这一主题,特别是针对Java面试的知识点。 首先,权限系统的核心...
【权限系统设计】在互联网行业中,构建一个基于数据库的权限系统是至关重要的,因为它确保了系统的安全性,控制了用户访问资源的权限。本篇内容详细讲述了如何设计这样一个系统,包括用户需求分析、权限表设计以及...
为此,本篇文章将探讨一种新的基于数据库的通用权限管理模块的设计与实现方案。 #### 设计思路 ##### 用户与数据对象的标识 为了更好地管理用户及其权限,我们需要对用户信息进行特殊处理。通常,我们会创建一张...
综上所述,一份完善的【数据库设计说明书】涵盖了项目背景、设计原则、结构规划和安全策略等多个方面,是数据库开发的关键文档,对于确保项目成功实施至关重要。在实际工作中,设计师需要根据具体项目的需求,详细...
金蝶数据库主要基于关系型数据库管理系统,如Oracle、SQL Server或MySQL等,这些数据库系统以其强大的数据处理能力、高可用性和安全性,确保了金蝶软件的数据稳定性和可靠性。数据库设计遵循规范化原则,旨在减少...
本篇文章将详细探讨如何在Android平台上通过WebService实现与SQL Server数据库的交互。 WeberService作为一种远程服务调用技术,常用于不同系统间的通信,而SOAP(Simple Object Access Protocol)协议是其中的一种...
本篇文章将深入探讨一个基于.NET框架实现的权限管理系统,特别关注其数据库设计、菜单动态添加功能以及北大青鸟的技术实践。 首先,我们来了解一下.NET框架。.NET是由微软公司开发的开源平台,用于构建高性能、跨...
在IT行业中,安全是至关重要的一个领域,特别是对于基于数据库的用户信息认证系统。Acegi Security是Spring Security的前身,它提供了一套强大的安全框架,用于保护Java Web应用程序。本篇将深入探讨如何利用Acegi ...
本篇将深入探讨如何建立一个自定义的权限管理系统,以及如何对用户的权限进行编辑、修改和删除。 首先,我们需要理解权限系统的基本概念。权限系统是用来控制不同用户访问资源的机制,它可以决定哪些用户可以执行...
总的来说,“基于关系数据库的工作流系统设计与实现”是一篇全面介绍如何结合工作流管理和关系数据库技术的文章,对想要深入理解这一领域的读者来说,是一份宝贵的学习资源。通过阅读,读者不仅可以掌握工作流模型和...
本篇将详细解析一个基于ASP.NET技术构建的学生宿舍管理系统,该系统包含了完整的源码和配套的数据库,旨在帮助教育机构更有效地管理学生宿舍信息。 ASP.NET是由微软公司推出的Web应用程序开发框架,它为开发者提供...
本篇文章将深入探讨一个基于C#语言的三层架构图书管理系统,它包括源码、数据库以及详细的系统说明,旨在帮助开发者理解和掌握三层架构在实际项目中的应用。 首先,三层架构是一种常见的软件设计模式,它将应用程序...
本篇文章将详细介绍如何使用Weka连接到Oracle数据库,以便进行高效的数据提取、清洗和分析。 首先,Weka是由新西兰怀卡托大学开发的一个Java环境,它提供了丰富的机器学习算法和数据预处理功能。Oracle数据库则是...
《基于数据库和设计软件的同学录管理系统论文》是一篇详尽探讨如何构建一个高效、实用的同学录管理系统的专业论文。该论文结合了计算机科学与数据库技术,旨在为用户提供一个方便的信息存储和检索平台,以实现对校友...
本篇文档的主题是“基于Java与SQL数据库技术的学生成绩管理系统”,这是一篇毕业论文。论文中融合了Java编程语言和SQL数据库技术,主要目的是设计和实现一个用于管理学生成绩的系统。下面将详细介绍文档中涉及的知识...
因此,这里将基于标题“数据库第一章的呀第一章”来构建一篇关于数据库基础知识的文章。 ### 数据库基础知识 #### 一、什么是数据库? 数据库(Database)是一种有组织地存储数据的集合,能够高效地存储、管理和...
本篇将深入探讨一个基于.NET框架构建的权限系统,包括源码解析、数据库设计以及配套文档的理解,为初级开发者提供一个学习和研究的实例。 一、.NET权限系统概述 .NET权限系统是一种基于角色的访问控制(Role-Based ...
本篇文章将详细解析一个基于Java Swing的图书馆管理系统,该系统集成了MySQL数据库,为图书管理提供了高效且直观的平台。 首先,让我们了解Java Swing。Swing是Java Standard Edition (Java SE)的一部分,它提供了...
本篇将深入探讨如何设计一个实用的Java权限管理系统数据库。 首先,权限管理系统的核心在于角色(Role)、资源(Resource)和用户(User)三者之间的关系。角色代表了一组权限的集合,用户通过扮演不同的角色来获取...