`

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

阅读更多

声明:这里是通过数据库来手工设置权限部分的。和“基于规则的权限验证”要理解开来!!

步骤:

(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>

 

分享到:
评论

相关推荐

    Seam 2.1 安全模块框架

    3. **权限验证**:Seam 包含一个广泛适用的权限验证框架,支持基于角色的访问控制(RBAC)、持久化权限设置以及规则驱动的权限决策。这使得开发者可以根据业务逻辑创建自定义的安全策略。 4. **权限管理**:Seam ...

    SEAM 中文开发指南

    - **Seam上下文**: - **无状态上下文**:适用于一次性的操作。 - **事件上下文**:处理特定的事件触发。 - **页面上下文**:维护当前页面的状态。 - **业务会话上下文**:管理长时间的会话。 - **Session上...

    JBOSS SEAM组件中文手册

    5. **安全和身份验证(Security and Authentication)**: Seam集成了JAAS(Java Authentication and Authorization Service),提供了用户认证和权限管理功能。 **三、Seam与Java EE集成** 1. **JSF集成**: Seam与...

    为Seam做好准备

    9. **Seam事件和上下文**:Seam引入了一种独特的事件模型和组件上下文,使得组件间的通信和状态管理更为简单,这是Seam区别于其他框架的一大特色。 10. **Seam安全性和事务管理**:Seam提供了内置的安全框架和事务...

    MATLAB_Seam_Carving_seamcarving_

    4. 根据需要调整图像大小,可以删除或复制seam上的像素。 5. 更新图像,确保边界条件得到正确处理,防止图像失真。 6. 可视化结果,对比原图和处理后的图像。 在MATLAB_Seam_Carving压缩包中,可能包含了实现这些...

    seam in action 中文 english

    2. **事件驱动**:Seam支持基于事件的编程模型,使得在不同组件之间传递信息变得更加简单。这有助于实现松散耦合,让代码更易于维护和扩展。 3. **JSF集成**:Seam与JavaServer Faces紧密集成,提供了一种优雅的...

    Jboss Seam中文版

    1. **Seam上下文**:介绍了Seam如何通过不同层次的上下文来管理应用的状态,包括无状态上下文、事件上下文、页面上下文、会话上下文、业务流程上下文、应用上下文等。 2. **组件类型**:详细列举了Seam支持的各种...

    Seam_Java框架.doc

    此外,Seam还集成了数据验证,允许在Entity Bean中定义数据约束,这些约束在页面上即可直接应用,类似于Ruby on Rails的验证机制。这得益于Seam的作者Gavin King同时也是Hibernate的创始人,使得数据持久化和验证的...

    Seam-gen生成基础项目骨架

    Seam-gen 是一款用于快速生成基于 Seam 框架的基础项目结构的工具,它通过简单的命令行交互式过程,帮助开发者构建项目的雏形,并且能够根据数据库信息自动生成管理数据库的 CRUD(Create, Read, Update, Delete)...

    (可直接运行)国外的seam carving matlab源码(包含gui)

    当运行"seamCarving_GUI.m"时,这个.fig文件会加载并显示对应的图形界面。 "logo.jpg"和"york.jpg"可能是示例图像或者GUI界面中用到的图标的资源文件,它们帮助美化GUI界面并提供示例数据供用户参考。 在MATLAB中...

    seam参考手册中文版

    ##### Seam上下文层次 - **无状态上下文**:主要用于临时性的交互操作,不保留任何状态信息。 - **事件上下文**:处理特定事件,通常在事件触发时创建,事件处理完毕即销毁。 - **页面上下文**:对应Web页面的生命...

    Seam - 语境相关的组件

    Seam是一种Java EE框架,它在开发企业级应用程序时提供了高度集成和语境相关的组件模型。这个框架的主要目标是简化复杂性,使开发者能够更高效地构建动态、响应式的Web应用。Seam的核心理念是将不同的技术,如Java...

    Seam项目源代码(基于JBoss和EJB3,JSF的项目源码)

    Seam项目源代码是一个基于JBoss应用服务器、JavaServer Faces (JSF)、Enterprise JavaBeans (EJB3) 的开源框架示例,旨在为初学者提供深入理解这些技术结合使用的实践经验。Seam是一个全面的Java EE开发框架,它简化...

    seam的注解和标签

    - `@Destroy`: 类似于`@Create`,当Seam上下文销毁时调用`@Destroy`标记的方法,常用于资源清理。 2. **JPA注解** - `@Entity`: 表示一个Java类映射到数据库表。这是JPA的基础注解,定义了一个实体类。 - `@...

    seam 框架整合hibernate+jsf

    Seam通过提供对Hibernate的无缝集成,使得开发者可以在不脱离Seam上下文的情况下方便地处理持久化操作。例如,Seam可以自动管理Hibernate的Session,提供事务控制,以及实现基于注解的实体管理和查询。 JavaServer ...

    Seam_in_Action

    5. **安全与身份验证**:Seam提供了内置的安全性和身份验证机制,支持角色基础的访问控制,以及会话管理和身份验证的集成。 6. **国际化与本地化**:Seam支持多语言环境,使得开发全球化应用变得容易。 7. **CDI...

    seam需要的jar包

    此外,`seam-persistence.jar`可能包含Seam对JPA(Java Persistence API)的支持,用于数据库持久化操作。 为了支持测试和调试,压缩包可能还包括`jboss-as-server.jar`或类似的文件,它们与特定的应用服务器(如...

Global site tag (gtag.js) - Google Analytics