- 浏览: 1055300 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (279)
- Apache net (10)
- JBoss Rules (3)
- Seam ACL (1)
- Seam (14)
- Seam JPA高级权限验证 (8)
- 待解决的问题.... (1)
- JAVA (43)
- Dwr (4)
- Ajax4JSF (1)
- JavaScript (27)
- 生活小常识 (17)
- Richfaces (3)
- seam自己经历 (14)
- JDBC (1)
- mysql (6)
- WebService (10)
- Java Web (4)
- Hibernate (13)
- J2EE框架整合 (3)
- Spring (9)
- BEA Weblogic (1)
- XML (1)
- log4j (6)
- CSS (2)
- javaIO文件的读写 (5)
- SVN服务器的安装 (5)
- powerDesigner (2)
- SQL常用语句 (3)
- wicket初学 (5)
- eclipse (7)
- 正则表达式 (1)
- ExtJS (6)
- maven(m2eclipse) (1)
- struts2.0 (9)
- JPA (6)
- struts2.0整合spring2.5 (9)
- linux (6)
- Oracle (5)
- Servlet (3)
- MyEclipseGen (0)
最新评论
-
qq_31247573:
JAVA 获取http返回XML的数据 -
jasmine_20100810:
...
linux下tomcat服务的启动、关闭与错误跟踪 -
weiaiFang0624:
视频下载地址:http://download.csdn.net ...
there is no action mapped for namespace / and action name解决办法 -
p476462534:
JS控制表单form的提交 -
dandongsoft:
aaaaaaaaaaaaaaa
httpClient,JAVA访问http request response
15.4. 身份管理身份管理功能提供了一组标准的API接口,用来管理Seam应用程序的用户和角色。它不管这些用户和角色数据在后台是如何存储的(例如数据库、LDAP等等)。身份管理API的核心部分就是identityManager组件。该组件提供了所有常用的相关功能,例如新建用户、修改用户、删除用户、给用户授权一个角色或者取消用户拥有的某个角色、用户密码修改、设置用户帐号是否有效、验证用户权限以及列出所有用户和角色。
在使用identityManager之前,必须配置一个或多个IdentityStore。这些组件负责具体的数据存储,不管相关数据是存储在数据库中还是LDAP服务器中,或是其他什么东西里面。
15.4.1. 配置IdentityManageridentityManager组件允许配置多个不同的存储身份信息的数据源。这就意味着,你可以将用户身份信息存储在LDAP目录下,同时将角色信息存储在相关的数据库中。
Seam支持两种IdentityStore的实现方式:1、JpaIdentityStore,将用户身份和角色信息存储在数据库中。如果没有明确指定存储方式,那么就使用这种实现。2、LdapIdentityStore,将相关信息存储在LDAP目录下。
identityManager组件拥有两个可以设置的属性:identityStore和roleIdentityStore。这两个属性的值都必须是一个EL表达式,表达式中的对象必须为实现了IdentityStore接口的Seam组件。上面已经提到过,如果没有明确设置,那么默认会使用JpaIdentityStore方式。如果你只设置了identityStore属性的值,那么roleIdentityStore的值会默认设置为与identityStore属性值相同。例如:
<security:identity-manager identity-store="#{ldapIdentityStore}"/><security:identity-manager identity-store="#{ldapIdentityStore}" role-identity-store="#{jpaIdentityStore}"/>
15.4.2. JpaIdentityStore在数据库中存储权限认证相关的用户与角色信息,并且与数据库中表结构的灵活性很大。只需要使用几个注解,就能让实体中的相关属性与角色用户等关联上
15.4.2.1. 配置JpaIdentityStoreJpaIdentityStore配置里面需要指明用户类与角色类。这两个类都必须为实体,并且在数据库中是用来存储用户和角色信息。下面是components.xml文件中的配置方法:
<security:jpa-identity-store user-class="org.jboss.seam.example.seamspace.MemberAccount" role-class="org.jboss.seam.example.seamspace.MemberRole"/>
15.4.2.2. 配置实体Entities实体中需要用注解支出用户与角色信息。下表中列举了这些注解以及注解的相关描述:
表 15.1. 用户实体中使用到的注解
注解 描述
@UserPrincipal 必须指定用户名
@UserPassword 必须指定密码,可以用来指定密码的hash存储规则(md5、sha.)
例如:@UserPassword(hash = "md5") public getPasswordHash() { return passwordHash; }
@UserFirstName 可选看名字就知道是什么意思了吧
@UserLastName 可选同上
@UserEnabled 可选布尔值,如果没有写出这个注解,那么所有用户帐号都是可用的
@UserRoles 必须这个注解 下面会详细介绍
表 15.2. 角色实体中用到的注解
注解 描述
@RoleName 必须
@RoleGroups 可选
@RoleConditional 可选指出这个角色是否依赖其他角色。关于角色依赖的部分,后面会详细介绍。
15.4.2.3. Entity Bean实例上面提到过,这部分功能被设计成尽量灵活。下面就举出了几个不同表结构的例子。
15.4.2.3.1. 最简单的表结构在这个最简单的例子里面,用户和角色表通过一个多对多关系来关联。中间表的名字为UserRoles。
@Entity
public class User {
private Integer userId;
private String username;
private String passwordHash;
private Set<Role> roles;
@Id @GeneratedValue
public Integer getUserId() { return userId; }
public void setUserId(Integer userId) { this.userId = userId; }
@UserPrincipal
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
@UserPassword(hash = "md5")
public String getPasswordHash() { return passwordHash; }
public void setPasswordHash(String passwordHash) { this.passwordHash = passwordHash; }
@UserRoles
@ManyToMany(targetEntity = Role.class)
@JoinTable(name = "UserRoles",
joinColumns = @JoinColumn(name = "UserId"),
inverseJoinColumns = @JoinColumn(name = "RoleId"))
public Set<Role> getRoles() { return roles; }
public void setRoles(Set<Role> roles) { this.roles = roles; }
}
@Entity
public class Role {
private Integer roleId;
private String rolename;
@Id @Generated
public Integer getRoleId() { return roleId; }
public void setRoleId(Integer roleId) { this.roleId = roleId; }
@RoleName
public String getRolename() { return rolename; }
public void setRolename(String rolename) { this.rolename = rolename; }
}
15.4.2.3.2. 复杂的表结构示例下面这个例子是从上面那个简单的例子扩展来的,并且加入了角色分组支持。
@Entity
public class User {
private Integer userId;
private String username;
private String passwordHash;
private Set<Role> roles;
private String firstname;
private String lastname;
private boolean enabled;
@Id @GeneratedValue
public Integer getUserId() { return userId; }
public void setUserId(Integer userId) { this.userId = userId; }
@UserPrincipal
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
@UserPassword(hash = "md5")
public String getPasswordHash() { return passwordHash; }
public void setPasswordHash(String passwordHash) { this.passwordHash = passwordHash; }
@UserFirstName
public String getFirstname() { return firstname; }
public void setFirstname(String firstname) { this.firstname = firstname; }
@UserLastName
public String getLastname() { return lastname; }
public void setLastname(String lastname) { this.lastname = lastname; }
@UserEnabled
public boolean isEnabled() { return enabled; }
public void setEnabled(boolean enabled) { this.enabled = enabled; }
@UserRoles
@ManyToMany(targetEntity = Role.class)
@JoinTable(name = "UserRoles",
joinColumns = @JoinColumn(name = "UserId"),
inverseJoinColumns = @JoinColumn(name = "RoleId"))
public Set<Role> getRoles() { return roles; }
public void setRoles(Set<Role> roles) { this.roles = roles; }
}
@Entity
public class Role {
private Integer roleId;
private String rolename;
private boolean conditional;
@Id @Generated
public Integer getRoleId() { return roleId; }
public void setRoleId(Integer roleId) { this.roleId = roleId; }
@RoleName
public String getRolename() { return rolename; }
public void setRolename(String rolename) { this.rolename = rolename; }
@RoleConditional
public boolean isConditional() { return conditional; }
public void setConditional(boolean conditional) { this.conditional = conditional; }
@RoleGroups
@ManyToMany(targetEntity = Role.class)
@JoinTable(name = "RoleGroups",
joinColumns = @JoinColumn(name = "RoleId"),
inverseJoinColumns = @JoinColumn(name = "GroupId"))
public Set<Role> getGroups() { return groups; }
public void setGroups(Set<Role> groups) { this.groups = groups; }
}
15.4.2.4. JpaIdentityStore事件会产生一些调用某些IdentityManager方法的事件。
15.4.2.4.1. JpaIdentityStore.EVENT_PRE_PERSIST_USER这个事件在调用IdentityManager.createUser()方法的时候被激活。在用户实体被保存进入数据库之前,这个事件被激活,并且将JpaIdentityStore中配置的用户实体类的一个实例作为参数传递。
如果想要在createUser()功能以外添加额外的信息到实体中去,那么可以编写一个该事件的观察器来实现。
15.4.2.4.2. JpaIdentityStore.EVENT_USER_CREATED这个事件也是在IdentityManager.createUser()方法被调用的时候激活,不过是在用户数据被保存进入数据库之后。就像EVENT_PRE_PERSIST_USER事件一样,该事件同样也携带一个实体的实例作为参数。如果你想要在保存用户实体到数据库的同时保存一些相关的其他用户信息到数据库,例如用户的联系方式等,那么你可以编写一个该事件的观察器来实现。
15.4.2.4.3. JpaIdentityStore.EVENT_USER_AUTHENTICATED这个事件在调用IdentityManager.authenticate()的时候被激活。用户实例会作为参数跟随这个事件传递。如果想要在用户被验证的同时读取与用户相关的其他属性,那么可以编写一个观察器来实现。
15.4.4. 编写你自己的IdentityStore只需要编写一个实现了org.jboss.seam.security.management.IdentityStore接口的类。具体实现可以参考JavaDoc里面的方法说明,里面介绍了所有实现接口时必须实现的方法。
15.4.5. 使用身份管理模块进行验证如果你想要在你的Seam程序里面使用身份管理模块,你无须单独编写一个验证组件。只要在components.xml文件里identity配置部分指定authenticator-method,SeamLoginModule就会默认调用IdentityManager来对登录到你编写的程序的用户进行身份验证。
15.4.6. 使用IdentityManagerIdentityManager可以通过两种方式调用。可以是通过注入一个实例的方式:
@In IdentityManager identityManager
或者调用静态的instance()方法:
IdentityManager identityManager = IdentityManager.instance();
下表中介绍了IdentityManager接口中用到的方法:
Table 15.4. 身份管理API
方法 返回值 介绍
createUser(String name, String password) boolean 用传入的用户名和密码创建一个用户账户,
创建成功返回true,否则返回false。
deleteUser(String name) boolean
createRole(String role) boolean
deleteRole(String name) boolean
enableUser(String name) boolean
disableUser(String name) boolean
changePassword(String name, String password) boolean
isUserEnabled(String name) boolean
grantRole(String name, String role) boolean
revokeRole(String name, String role) boolean
userExists(String name) boolean
listUsers() List 所有用户列表,用户名首字母排序
listUsers(String filter) List
listRoles() List
getGrantedRoles(String name) List 传入参数为用户名,列出该用户的所有角色ListgetImpliedRoles(String name) List 列出用户的所有角色,递归方式列出所有父角色与子角色。
authenticate(String name, String password) boolean
addRoleToGroup(String role, String group) boolean
removeRoleFromGroup(String role, String group) boolean
listRoles() boolean
想要调用身份管理接口,需要调用方法的用户拥有相应的权限。下面这个表列出了IdentityManager中各方法所需的权限。对象权限这一列中的字符串值。
Table 15.5. 身份管理所需权限
方法 对象权限 操作权限
createUser() seam.user create
deleteUser() seam.user delete
createRole() seam.role create
deleteRole() seam.role delete
enableUser() seam.user update
disableUser() seam.user update
changePassword() seam.user update
isUserEnabled() seam.user read
grantRole() seam.user update
revokeRole() seam.user update
userExists() seam.user read
listUsers() seam.user read
listRoles() seam.role read
addRoleToGroup() seam.role update
removeRoleFromGroup() seam.role update
下面这段规则设置代码列出了将所有身份管理相关的权限赋予admin角色的例子:
rule ManageUsers
no-loop
activation-group "permissions"
when
check: PermissionCheck(name == "seam.user", granted == false)
Role(name == "admin")
then
check.grant();
end
rule ManageRoles
no-loop
activation-group "permissions"
when
check: PermissionCheck(name == "seam.role", granted == false)
Role(name == "admin")
then
check.grant();
end
在使用identityManager之前,必须配置一个或多个IdentityStore。这些组件负责具体的数据存储,不管相关数据是存储在数据库中还是LDAP服务器中,或是其他什么东西里面。
15.4.1. 配置IdentityManageridentityManager组件允许配置多个不同的存储身份信息的数据源。这就意味着,你可以将用户身份信息存储在LDAP目录下,同时将角色信息存储在相关的数据库中。
Seam支持两种IdentityStore的实现方式:1、JpaIdentityStore,将用户身份和角色信息存储在数据库中。如果没有明确指定存储方式,那么就使用这种实现。2、LdapIdentityStore,将相关信息存储在LDAP目录下。
identityManager组件拥有两个可以设置的属性:identityStore和roleIdentityStore。这两个属性的值都必须是一个EL表达式,表达式中的对象必须为实现了IdentityStore接口的Seam组件。上面已经提到过,如果没有明确设置,那么默认会使用JpaIdentityStore方式。如果你只设置了identityStore属性的值,那么roleIdentityStore的值会默认设置为与identityStore属性值相同。例如:
<security:identity-manager identity-store="#{ldapIdentityStore}"/><security:identity-manager identity-store="#{ldapIdentityStore}" role-identity-store="#{jpaIdentityStore}"/>
15.4.2. JpaIdentityStore在数据库中存储权限认证相关的用户与角色信息,并且与数据库中表结构的灵活性很大。只需要使用几个注解,就能让实体中的相关属性与角色用户等关联上
15.4.2.1. 配置JpaIdentityStoreJpaIdentityStore配置里面需要指明用户类与角色类。这两个类都必须为实体,并且在数据库中是用来存储用户和角色信息。下面是components.xml文件中的配置方法:
<security:jpa-identity-store user-class="org.jboss.seam.example.seamspace.MemberAccount" role-class="org.jboss.seam.example.seamspace.MemberRole"/>
15.4.2.2. 配置实体Entities实体中需要用注解支出用户与角色信息。下表中列举了这些注解以及注解的相关描述:
表 15.1. 用户实体中使用到的注解
注解 描述
@UserPrincipal 必须指定用户名
@UserPassword 必须指定密码,可以用来指定密码的hash存储规则(md5、sha.)
例如:@UserPassword(hash = "md5") public getPasswordHash() { return passwordHash; }
@UserFirstName 可选看名字就知道是什么意思了吧
@UserLastName 可选同上
@UserEnabled 可选布尔值,如果没有写出这个注解,那么所有用户帐号都是可用的
@UserRoles 必须这个注解 下面会详细介绍
表 15.2. 角色实体中用到的注解
注解 描述
@RoleName 必须
@RoleGroups 可选
@RoleConditional 可选指出这个角色是否依赖其他角色。关于角色依赖的部分,后面会详细介绍。
15.4.2.3. Entity Bean实例上面提到过,这部分功能被设计成尽量灵活。下面就举出了几个不同表结构的例子。
15.4.2.3.1. 最简单的表结构在这个最简单的例子里面,用户和角色表通过一个多对多关系来关联。中间表的名字为UserRoles。
@Entity
public class User {
private Integer userId;
private String username;
private String passwordHash;
private Set<Role> roles;
@Id @GeneratedValue
public Integer getUserId() { return userId; }
public void setUserId(Integer userId) { this.userId = userId; }
@UserPrincipal
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
@UserPassword(hash = "md5")
public String getPasswordHash() { return passwordHash; }
public void setPasswordHash(String passwordHash) { this.passwordHash = passwordHash; }
@UserRoles
@ManyToMany(targetEntity = Role.class)
@JoinTable(name = "UserRoles",
joinColumns = @JoinColumn(name = "UserId"),
inverseJoinColumns = @JoinColumn(name = "RoleId"))
public Set<Role> getRoles() { return roles; }
public void setRoles(Set<Role> roles) { this.roles = roles; }
}
@Entity
public class Role {
private Integer roleId;
private String rolename;
@Id @Generated
public Integer getRoleId() { return roleId; }
public void setRoleId(Integer roleId) { this.roleId = roleId; }
@RoleName
public String getRolename() { return rolename; }
public void setRolename(String rolename) { this.rolename = rolename; }
}
15.4.2.3.2. 复杂的表结构示例下面这个例子是从上面那个简单的例子扩展来的,并且加入了角色分组支持。
@Entity
public class User {
private Integer userId;
private String username;
private String passwordHash;
private Set<Role> roles;
private String firstname;
private String lastname;
private boolean enabled;
@Id @GeneratedValue
public Integer getUserId() { return userId; }
public void setUserId(Integer userId) { this.userId = userId; }
@UserPrincipal
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
@UserPassword(hash = "md5")
public String getPasswordHash() { return passwordHash; }
public void setPasswordHash(String passwordHash) { this.passwordHash = passwordHash; }
@UserFirstName
public String getFirstname() { return firstname; }
public void setFirstname(String firstname) { this.firstname = firstname; }
@UserLastName
public String getLastname() { return lastname; }
public void setLastname(String lastname) { this.lastname = lastname; }
@UserEnabled
public boolean isEnabled() { return enabled; }
public void setEnabled(boolean enabled) { this.enabled = enabled; }
@UserRoles
@ManyToMany(targetEntity = Role.class)
@JoinTable(name = "UserRoles",
joinColumns = @JoinColumn(name = "UserId"),
inverseJoinColumns = @JoinColumn(name = "RoleId"))
public Set<Role> getRoles() { return roles; }
public void setRoles(Set<Role> roles) { this.roles = roles; }
}
@Entity
public class Role {
private Integer roleId;
private String rolename;
private boolean conditional;
@Id @Generated
public Integer getRoleId() { return roleId; }
public void setRoleId(Integer roleId) { this.roleId = roleId; }
@RoleName
public String getRolename() { return rolename; }
public void setRolename(String rolename) { this.rolename = rolename; }
@RoleConditional
public boolean isConditional() { return conditional; }
public void setConditional(boolean conditional) { this.conditional = conditional; }
@RoleGroups
@ManyToMany(targetEntity = Role.class)
@JoinTable(name = "RoleGroups",
joinColumns = @JoinColumn(name = "RoleId"),
inverseJoinColumns = @JoinColumn(name = "GroupId"))
public Set<Role> getGroups() { return groups; }
public void setGroups(Set<Role> groups) { this.groups = groups; }
}
15.4.2.4. JpaIdentityStore事件会产生一些调用某些IdentityManager方法的事件。
15.4.2.4.1. JpaIdentityStore.EVENT_PRE_PERSIST_USER这个事件在调用IdentityManager.createUser()方法的时候被激活。在用户实体被保存进入数据库之前,这个事件被激活,并且将JpaIdentityStore中配置的用户实体类的一个实例作为参数传递。
如果想要在createUser()功能以外添加额外的信息到实体中去,那么可以编写一个该事件的观察器来实现。
15.4.2.4.2. JpaIdentityStore.EVENT_USER_CREATED这个事件也是在IdentityManager.createUser()方法被调用的时候激活,不过是在用户数据被保存进入数据库之后。就像EVENT_PRE_PERSIST_USER事件一样,该事件同样也携带一个实体的实例作为参数。如果你想要在保存用户实体到数据库的同时保存一些相关的其他用户信息到数据库,例如用户的联系方式等,那么你可以编写一个该事件的观察器来实现。
15.4.2.4.3. JpaIdentityStore.EVENT_USER_AUTHENTICATED这个事件在调用IdentityManager.authenticate()的时候被激活。用户实例会作为参数跟随这个事件传递。如果想要在用户被验证的同时读取与用户相关的其他属性,那么可以编写一个观察器来实现。
15.4.4. 编写你自己的IdentityStore只需要编写一个实现了org.jboss.seam.security.management.IdentityStore接口的类。具体实现可以参考JavaDoc里面的方法说明,里面介绍了所有实现接口时必须实现的方法。
15.4.5. 使用身份管理模块进行验证如果你想要在你的Seam程序里面使用身份管理模块,你无须单独编写一个验证组件。只要在components.xml文件里identity配置部分指定authenticator-method,SeamLoginModule就会默认调用IdentityManager来对登录到你编写的程序的用户进行身份验证。
15.4.6. 使用IdentityManagerIdentityManager可以通过两种方式调用。可以是通过注入一个实例的方式:
@In IdentityManager identityManager
或者调用静态的instance()方法:
IdentityManager identityManager = IdentityManager.instance();
下表中介绍了IdentityManager接口中用到的方法:
Table 15.4. 身份管理API
方法 返回值 介绍
createUser(String name, String password) boolean 用传入的用户名和密码创建一个用户账户,
创建成功返回true,否则返回false。
deleteUser(String name) boolean
createRole(String role) boolean
deleteRole(String name) boolean
enableUser(String name) boolean
disableUser(String name) boolean
changePassword(String name, String password) boolean
isUserEnabled(String name) boolean
grantRole(String name, String role) boolean
revokeRole(String name, String role) boolean
userExists(String name) boolean
listUsers() List 所有用户列表,用户名首字母排序
listUsers(String filter) List
listRoles() List
getGrantedRoles(String name) List 传入参数为用户名,列出该用户的所有角色ListgetImpliedRoles(String name) List 列出用户的所有角色,递归方式列出所有父角色与子角色。
authenticate(String name, String password) boolean
addRoleToGroup(String role, String group) boolean
removeRoleFromGroup(String role, String group) boolean
listRoles() boolean
想要调用身份管理接口,需要调用方法的用户拥有相应的权限。下面这个表列出了IdentityManager中各方法所需的权限。对象权限这一列中的字符串值。
Table 15.5. 身份管理所需权限
方法 对象权限 操作权限
createUser() seam.user create
deleteUser() seam.user delete
createRole() seam.role create
deleteRole() seam.role delete
enableUser() seam.user update
disableUser() seam.user update
changePassword() seam.user update
isUserEnabled() seam.user read
grantRole() seam.user update
revokeRole() seam.user update
userExists() seam.user read
listUsers() seam.user read
listRoles() seam.role read
addRoleToGroup() seam.role update
removeRoleFromGroup() seam.role update
下面这段规则设置代码列出了将所有身份管理相关的权限赋予admin角色的例子:
rule ManageUsers
no-loop
activation-group "permissions"
when
check: PermissionCheck(name == "seam.user", granted == false)
Role(name == "admin")
then
check.grant();
end
rule ManageRoles
no-loop
activation-group "permissions"
when
check: PermissionCheck(name == "seam.role", granted == false)
Role(name == "admin")
then
check.grant();
end
发表评论
-
JBoss Seam事件机制 (4):页面动作
2009-06-24 13:47 1675在JBoss Seam事件机制(1 ... -
JBoss Seam的事件机制 (3)
2009-06-24 13:46 1412JBoss Seam如何做到松耦合 ... -
JBoss Seam的事件机制 (2)
2009-06-24 13:45 1290JBoss Seam如何做到松耦合 ... -
JBoss Seam的事件机制 (1) 内置的上下文事件
2009-06-24 13:45 1655在JBoss Seam的事件机制(1)概述中我们提到Seam提 ... -
Seam 2.1中的安全升级 (二)
2009-06-24 13:43 1616Permission Management 尽管 Ident ... -
Seam 2.1中的安全升级 (一)
2009-06-24 13:41 1374Seam安全升级 by Shane Bryzak,翻译:JS ... -
seam2.1权限验证(15.5)@Restrict注解 (三)
2009-06-24 13:39 142615.6.8. 权限验证的模型 ... -
seam2.1权限验证(15.5)@Restrict注解 (二)
2009-06-24 13:37 159315.6.5. 实体安全控制(Securing Entitie ... -
seam2.1权限验证(15.5)@Restrict注解 (一)
2009-06-24 13:36 234915.5. 错误消息安全API内 ... -
seam2.1权限验证(15.3) JAAS
2009-06-24 13:35 184115.3. 验证Seam安全中的验证特性是基于JAAS (Ja ... -
seam发送邮件email示例
2009-06-24 13:33 1600以下转自csdn上的一个回答,留着用的时候参考,防止到时找不到 ... -
扩展seam组件
2009-06-24 13:31 1099任何一个框架都必须拥有一个非常重要的功能:可扩展性。JBoss ... -
Seam Bean验证快速进阶II:自定义约束
2009-06-24 13:26 1398本文为Bean验证系列的第二部分。总体介绍请阅读这篇文章。本文 ...
相关推荐
为了帮助开发人员快速上手,Seam 2.1 提供了一系列的工具和指南,包括使用 seam-gen 快速生成项目模板的方法。 - **Setting up an Eclipse project**:指导如何在 Eclipse IDE 中设置 Seam 2.1 的开发环境。 - **...
- **介绍**:Seam-ContextualComponents文档详细介绍了Seam框架的核心概念和功能。 - **作者**:由Gavin King、Pete Muir等多位专家共同编写,确保了文档的专业性和权威性。 - **章节结构**: - **Seam教程**:从...
### 基于Seam2.1的最新力作《Seam Framework: Experience the Evolution of Java EE, 2nd Edition》全书知识点概览 #### 一、Seam框架简介 Seam框架是JBoss组织推出的一个开源项目,旨在简化企业级应用开发,通过...
3. **权限验证**:Seam 包含一个广泛适用的权限验证框架,支持基于角色的访问控制(RBAC)、持久化权限设置以及规则驱动的权限决策。这使得开发者可以根据业务逻辑创建自定义的安全策略。 4. **权限管理**:Seam ...
- **从现有数据库生成应用:** 讲解了如何利用Seam-gen工具从现有数据库自动创建应用程序。 - **从现有JPA/EJB3实体生成应用:** 描述了如何根据现有的持久化实体自动生成应用程序。 - **作为EAR包部署应用:** ...
Seam 是一种业级 企 Java 的应规用程序框架。它的灵感源自下列原 : 只有一种“工具” Seam为 应 业务业业 义 种统 组 你的 用程序中所有的 定 了一 一的 件模型。 Seam组件可能是 态义 关关 态 有状 的,包含与几...
- **实现**:通过集成Spring Security等第三方库来实现权限验证和访问控制等功能。 - **优势**:易于集成和配置,能够快速为应用程序添加安全特性。 ##### Application Framework - **概述**:Seam框架不仅限于Web...
5. **配置和实现**:在Seam应用中,我们需要配置安全设置,这通常在`components.xml`或` seam-security.xml`文件中完成。这包括设置认证和授权策略,以及指定哪些URL需要进行安全拦截。 6. **动态权限**:Seam的...
JBoss_Enterprise_Application_Platform-5.0.1-Seam_Reference_Guide-en-US.pdf
5. **工具和组件集成**:除了基础的EJB和JSF,Seam还集成了如JBPM(业务流程管理)、Spring、邮件服务、权限管理以及动态语言支持等组件,构建出全面的企业级应用解决方案。 6. **测试友好**:Seam的设计考虑到了...
8. **Seam 管理的事务和持久化 (Seam-Managed Transactions and Persistence)** - **事务管理**:Seam 自动处理事务的开始、提交或回滚,简化了事务管理的复杂性。 - **持久化支持**:Seam 提供了一系列工具和...
这个名为"Seam-Carving-Matlab-master.rar_boardkkc_seam_seam carving_seamca"的压缩包文件包含了Matlab实现的Seam Carving算法,非常适合学习和理解这一技术。 Seam Carving的基本思想是找到图像中的一条或几条...
整理自jboss seam 中文站,压缩为chm格式,便于广大jboss seam爱好者阅读,所有版权归jboss seam中文站所有。
Seam-gen 会基于 JPA(Java Persistence API)生成 EJB 3 实体,并自动生成 JSF 表单和控制器来实现基本的数据库操作。 4. **部署应用**: 最后,运行 `seam explode` 命令,将生成的应用程序打包并部署到指定的 ...
- **从现有数据库生成应用程序**:使用 Seam-gen 从现有的数据库结构自动生成应用程序。 - **将应用部署为 EAR**:介绍了如何将 Seam 应用程序打包成 EAR 文件进行部署。 - **Seam 与增量热部署**:介绍了如何利用 ...
### seam-gen命令解析知识点 #### 一、Seam框架简介及seam-gen命令的作用 Seam框架是一款基于Java EE标准的轻量级企业级应用框架,它极大地简化了Java EE应用的开发流程,使得开发者能够更加高效地构建复杂的业务...
**JSF、Seam与JPA整合实例详解** 在现代Web应用开发中,JavaServer Faces (JSF)、Seam框架和Java Persistence API (JPA)是三个关键的技术组件。本实例将深入探讨如何利用这三者进行联合开发,帮助开发者实现高效、...
2007年Shai Avidan 和Ariel Shamir论文《Seam Carving for Content-Aware Image Resizing》所提出方法的Matlab代码实现和作者的论文。 效果非常炫,而且代码不长
### JBoss Seam 教程知识点概述 #### 一、Seam简介与教程概览 - **Seam**:一个基于Java EE平台的应用框架,旨在简化企业级应用开发。 - **JBoss Seam**:由JBoss提供的Seam实现,提供了一系列功能强大的工具和...