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’