首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Struts2+Spring+Acegi兑现权限校验

2012-10-07 
Struts2+Spring+Acegi实现权限校验经过一天左右的学习,终于将Acegi权限校验框架看懂了。以下是本人的一个小

Struts2+Spring+Acegi实现权限校验
经过一天左右的学习,终于将Acegi权限校验框架看懂了。以下是本人的一个小Demo:
先设计数据库:
数据库名Acegi:
表User: id,name,password,enable
表RoleInfo:id,rolename,roledesc
表UserRole:id,user_id,user_name,role_id,role_name
其中向User表中插入三组数据
1 Tom  123  1 
2 Jake 123  0
3 Rose 123  1

向RoleInfo中插入两组数据
1  ROLE_ADMIN 管理员角色
2  ROLE_USER  普通用户角色

向UserRole中插入三组角色
1  1  Tom  2 ROLE_USER
2  2  Jake 2 ROLE_USER
3  3  ROSE 1 ROLE_ADMIN

以上数据中表明:Tom是普通用户权限可用,Jake是普通用户权限但不可用,Rose是管理员权限可用。

需要配置两个配置文件,分别是web.xml,ApplicationContext_acegi.xml
虽然框架中包含了struts2和Spring,但配置acegi的时候跟struts2没有丝毫关系.
Spring中的配置文件也只需要配置相应的Bean就可以了。

首先是web.xml



下面是applicationContext_acegi.xml


配置文件中有相应的注解,我就不多说啦。
下一步写一个自定义的权限校验类:
package com.zj.data;

import java.util.List;
import org.acegisecurity.GrantedAuthority;
import org.acegisecurity.GrantedAuthorityImpl;
import org.acegisecurity.userdetails.UserDetails;
import org.acegisecurity.userdetails.UserDetailsService;
import org.acegisecurity.userdetails.UsernameNotFoundException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.dao.DataAccessException;
import com.zj.dao.UserDao;
import com.zj.dao.UserRoleDao;
import com.zj.entity.User;
import com.zj.entity.UserRole;

public class AcegiUserDeitailsService implements UserDetailsService {

/* 依赖注入 */
private UserDao userDao;
private UserRoleDao userRoleDao;

public void setUserDao(UserDao userDao) {
   this.userDao = userDao;
}

public void setUserRoleDao(UserRoleDao userRoleDao) {
   this.userRoleDao = userRoleDao;
}

/* 用户所有的权限 */
//private final List<GrantedAuthority> grantedAuthList = new ArrayList<GrantedAuthority>(6);
private GrantedAuthority[] grantedAuthArray;

/**实现接口UserDetailsService的函数,根据用户名获取UserDetails对象*/
public UserDetails loadUserByUsername(String userName)
    throws UsernameNotFoundException, DataAccessException {
  
   /* 取得用户 */
   User user = userDao.getUserByName(userName);
   if(user == null || user.getEnable()==0) {
            throw new UsernameNotFoundException("User name is not found.");
   }
  
   /* 取得所有用户权限 */
   List<UserRole> userRoleList = userRoleDao.getUserRoleByUserName(userName);
   if(userRoleList == null || userRoleList.size() == 0) {
            throw new UsernameNotFoundException("UserRole is not found.");
   }
   /* 取得用户的所有角色 */
   int size = userRoleList.size();
   grantedAuthArray = new GrantedAuthority[size];
   int j = 0;
   for(int i = 0; i < size; i++) {
    UserRole userRole = userRoleList.get(i);
    if(userRole != null) {
     this.grantedAuthArray[j++] = new GrantedAuthorityImpl(userRole.getRolename().toUpperCase());
    
    }
   }
   return new org.acegisecurity.userdetails.User(userName, user.getPassword(),
           true, true, true, true, this.grantedAuthArray);
}
}

以上的UserDao 和 UserRoleDao的功能跟普通的DAO一样,这里就不多说啦。

下一步创建几个页面,实现表单提交,身份验证.
/admin/adminLogin.jsp 管理员权限才可以进行访问
/user/userLogin.jsp   普通用户权限就可以访问
/login.jsp 无权限设置
/main.jsp 登录成功的页面
/loginerror.jsp 访问出错以后跳转页面
基本流程如下:首先访问login.jsp,成功登录以后跳转到main.jsp,在main.jsp中有两个URL,一个访问admin/adminLogin.jsp,一个访问user/userLogin.jsp,
当Tom登录时,可以进入main.jsp,即可以成功登录,可以访问user/userLogin.jsp,但不可以访问admin/adminLogin.jsp
Jake无法进入main.jsp,即无法成功登录
Rose成功登录以后,即可以访问user/userLogin.jsp,也可以访问admin/adminLogin.jsp





    </bean>  是什么意思啊,尤其是value=‘obullxl@163.com’

热点排行