声明:这里是通过数据库来手工设置权限部分的。和“基于规则的权限验证”要理解开来!!
步骤:
(1) 在登录的时候从数据库的permission表中把权限部分拿出来,然后塞到WorkingMemory中。
(2) 创建好permission实体和GrantedPermission类。
(3) 在security.drl配置文件中进行判断是否有权限。
(4) 在UserList.xhtml页面中,进行测试。
代码如下:
(1) AuthenticatorAction.java
package cn.ctit.cms.session;
import static org.jboss.seam.ScopeType.SESSION;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.drools.WorkingMemory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Observer;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.security.Credentials;
import org.jboss.seam.security.Identity;
import org.jboss.seam.security.permission.RuleBasedPermissionResolver;
import sun.misc.BASE64Encoder;
import cn.ctit.cms.entity.Users;
@Stateless
@Name("authenticator")
public class AuthenticatorAction implements Authenticator
{
@In Identity identity;
@In Credentials credentials;
@In
RuleBasedPermissionResolver ruleBasedPermissionResolver;
@PersistenceContext
private EntityManager em;
@Out(required=false, scope = SESSION)
private Users user2;
private short rolecount;
@SuppressWarnings("unchecked")
@Observer("org.jboss.seam.security.loginSuccessful")
public void addrolepermission(){
identity.addRole(String.valueOf(user2.getRole()));
WorkingMemory wm = ruleBasedPermissionResolver.getSecurityContext();
for(Permission p:user2.getPermissionList()){
wm.insert(p);
}
}
@SuppressWarnings("unchecked")
public boolean authenticate()
{
try{
List results = em.createQuery("select u from Users u where u.username=:usern and u.password=:pass")
.setParameter("usern", credentials.getUsername())
.setParameter("pass", EncoderByMd5(credentials.getPassword()))
.getResultList();
if(results.size() == 0){
FacesMessages.instance().addToControl("wrongmessage", "user name or password is not available !");
return false;
}else{
user2 = (Users) results.get(0);
if(user2.getEnable()!=null && user2.getEnable()){
return true;
}else{
FacesMessages.instance().addToControl("wrongmessage", "user is inactive !");
return false;
}
}
}catch (Exception ex){
ex.printStackTrace();
return false;
}
}
}
(2)Permission.java
package cn.ctit.cms.entity;
// Generated Feb 3, 2009 4:08:09 AM by Hibernate Tools 3.2.2.GA
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.validator.Length;
/**
* Users generated by hbm2java
*/
@Entity
@Table(name = "permission", catalog = "cms")
public class Permission implements java.io.Serializable {
private Long id;
private String target;
private String action;
private Users users;
public Permission() {
}
public Permission(String target, String action, Users users) {
this.target = target;
this.action = action;
this.users = users;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "target", length = 20)
@Length(max = 20)
public String getTarget() {
return this.target;
}
public void setTarget(String target) {
this.target = target;
}
@Column(name = "action", length = 20)
@Length(max = 20)
public String getAction() {
return this.action;
}
public void setAction(String password) {
this.action = action;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
public Users getUsers() {
return this.users;
}
public void setUsers(Users users) {
this.users = users;
}
}
(3)GrantedPermission.java
package cn.ctit.cms.session;
import java.io.Serializable;
public class GrantedPermission implements Serializable
{
private static final long serialVersionUID = -1868188969326866331L;
private String target;
private String action;
public GrantedPermission(){}
public GrantedPermission(String target,String action){
this.target = target;
this.action = action;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
}
(4)security.drl
package Permissions;
import java.security.Principal;
import org.jboss.seam.security.permission.PermissionCheck;
import org.jboss.seam.security.Role;
import cn.ctit.cms.session.GrantedPermission;
rule GrantDynamicPermission
no-loop
activation-group "permissions"
salience -10
when
check: PermissionCheck(granted == false)
GrantedPermission(t:target -> (t.equals(check.getTarget())),a:action -> (a.equals(check.getAction())) )
then
System.out.println("Permission granted !!");
check.grant();
end
(5)UsersList.xhtml
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.org/rich"
template="../layout/template.xhtml">
<ui:define name="body">
<h:form id="usersSearch" styleClass="edit">
<s:fragment rendered="#{s:hasPermission('insertname', 'insert')}">
<s:link value="insert" /><span> | </span>
</s:fragment>
<s:fragment rendered="#{s:hasPermission('updatename', 'insert')}">
<s:link value="update" /><span> | </span>
</s:fragment>
<s:fragment rendered="#{s:hasPermission('updatename', 'update')}">
<s:link value="update2" /><span> | </span>
</s:fragment>
</h:form>
</ui:define>
</ui:composition>
分享到:
相关推荐
3. **权限验证**:Seam 包含一个广泛适用的权限验证框架,支持基于角色的访问控制(RBAC)、持久化权限设置以及规则驱动的权限决策。这使得开发者可以根据业务逻辑创建自定义的安全策略。 4. **权限管理**:Seam ...
Seam Security是针对Java Web应用程序的安全框架,它是JBoss Seam项目的一部分,提供了全面的安全解决方案,包括身份验证、授权和身份管理等功能。Seam Security以易于配置和使用为特点,允许开发者快速设置应用程序...
- **Seam上下文**: - **无状态上下文**:适用于一次性的操作。 - **事件上下文**:处理特定的事件触发。 - **页面上下文**:维护当前页面的状态。 - **业务会话上下文**:管理长时间的会话。 - **Session上...
5. **安全和身份验证(Security and Authentication)**: Seam集成了JAAS(Java Authentication and Authorization Service),提供了用户认证和权限管理功能。 **三、Seam与Java EE集成** 1. **JSF集成**: Seam与...
9. **Seam事件和上下文**:Seam引入了一种独特的事件模型和组件上下文,使得组件间的通信和状态管理更为简单,这是Seam区别于其他框架的一大特色。 10. **Seam安全性和事务管理**:Seam提供了内置的安全框架和事务...
4. 根据需要调整图像大小,可以删除或复制seam上的像素。 5. 更新图像,确保边界条件得到正确处理,防止图像失真。 6. 可视化结果,对比原图和处理后的图像。 在MATLAB_Seam_Carving压缩包中,可能包含了实现这些...
2. **事件驱动**:Seam支持基于事件的编程模型,使得在不同组件之间传递信息变得更加简单。这有助于实现松散耦合,让代码更易于维护和扩展。 3. **JSF集成**:Seam与JavaServer Faces紧密集成,提供了一种优雅的...
1. **Seam上下文**:介绍了Seam如何通过不同层次的上下文来管理应用的状态,包括无状态上下文、事件上下文、页面上下文、会话上下文、业务流程上下文、应用上下文等。 2. **组件类型**:详细列举了Seam支持的各种...
此外,Seam还集成了数据验证,允许在Entity Bean中定义数据约束,这些约束在页面上即可直接应用,类似于Ruby on Rails的验证机制。这得益于Seam的作者Gavin King同时也是Hibernate的创始人,使得数据持久化和验证的...
Seam-gen 是一款用于快速生成基于 Seam 框架的基础项目结构的工具,它通过简单的命令行交互式过程,帮助开发者构建项目的雏形,并且能够根据数据库信息自动生成管理数据库的 CRUD(Create, Read, Update, Delete)...
当运行"seamCarving_GUI.m"时,这个.fig文件会加载并显示对应的图形界面。 "logo.jpg"和"york.jpg"可能是示例图像或者GUI界面中用到的图标的资源文件,它们帮助美化GUI界面并提供示例数据供用户参考。 在MATLAB中...
##### Seam上下文层次 - **无状态上下文**:主要用于临时性的交互操作,不保留任何状态信息。 - **事件上下文**:处理特定事件,通常在事件触发时创建,事件处理完毕即销毁。 - **页面上下文**:对应Web页面的生命...
Seam是一种Java EE框架,它在开发企业级应用程序时提供了高度集成和语境相关的组件模型。这个框架的主要目标是简化复杂性,使开发者能够更高效地构建动态、响应式的Web应用。Seam的核心理念是将不同的技术,如Java...
Seam项目源代码是一个基于JBoss应用服务器、JavaServer Faces (JSF)、Enterprise JavaBeans (EJB3) 的开源框架示例,旨在为初学者提供深入理解这些技术结合使用的实践经验。Seam是一个全面的Java EE开发框架,它简化...
- `@Destroy`: 类似于`@Create`,当Seam上下文销毁时调用`@Destroy`标记的方法,常用于资源清理。 2. **JPA注解** - `@Entity`: 表示一个Java类映射到数据库表。这是JPA的基础注解,定义了一个实体类。 - `@...
Seam通过提供对Hibernate的无缝集成,使得开发者可以在不脱离Seam上下文的情况下方便地处理持久化操作。例如,Seam可以自动管理Hibernate的Session,提供事务控制,以及实现基于注解的实体管理和查询。 JavaServer ...
5. **安全与身份验证**:Seam提供了内置的安全性和身份验证机制,支持角色基础的访问控制,以及会话管理和身份验证的集成。 6. **国际化与本地化**:Seam支持多语言环境,使得开发全球化应用变得容易。 7. **CDI...
此外,`seam-persistence.jar`可能包含Seam对JPA(Java Persistence API)的支持,用于数据库持久化操作。 为了支持测试和调试,压缩包可能还包括`jboss-as-server.jar`或类似的文件,它们与特定的应用服务器(如...