Acegi Spring Hibernate Struts2搭建基于角色的权限控制系统.docx
《Acegi Spring Hibernate Struts2搭建基于角色的权限控制系统.docx》由会员分享,可在线阅读,更多相关《Acegi Spring Hibernate Struts2搭建基于角色的权限控制系统.docx(13页珍藏版)》请在冰点文库上搜索。
AcegiSpringHibernateStruts2搭建基于角色的权限控制系统
AcegiSpringHibernateStruts2搭建基于角色的权限控制系统
安全永远是WEB应用系统必须面对的头等大事,也是最头疼的事,其实安全系统就只包括两个问题:
认证和授权.
以前做些网站系统,安全检测逻辑都在放在须要安全控制的代码前面,这样做有很多不好的地方,重复多次的编码就不用说了,代码移植性,重用性都得不到体现,安全检测逻辑要永远和业务逻辑放在一起.
那么,能不能够在进入方法前就调用一些安全检测?
其实SpringAOP就是这个思想,那么又如何实现安全检测呢?
SpringAcegiSecurity框架就是做这个事情.
本文主要是讨论下在已有的SSH系统中,如何使用Acegi作为安全框架实现基于角色的权限控制(RoleBasedAccessControlRBAC),本文主要是以Java5注解的形式来配置安全框架,大大减化配置和操作.
本文的主要参考资料:
第10章(SpringAcegi安全框架)
<精通Spring2.X--企业应用开发详解>第17章(使用Acegi实施应用系统安全)
acegi-security-1.0.6官方文档
说明:
本文介绍的是RBAC,在官方文档的基础上有所扩展或改动,以更适合WEB应用系统.其实我觉得大多数的网站基于角色已经足够了,一般都没必要基于权限.
文章开始:
一.下载所要的软件或JAR包:
我的相关配置是:
Java5,
Tomcat5.5.26,
Struts2.0.11,
Spring2.5.1,
Hibernate3.2,
Acegi1.0.6
二.建立相关的数据库:
s
数据表:
用户信息表User:
id,enable,user_name,user_pass,email_box
角色信息表RoleInfo:
id,role_name,role_title,descp
用户与角色关联表(用户与角色是多对多关系)
UserRole:
user_id,user_name,role_id,role_name
并在这三个表中插入相关的数据,我是定义了两种角色
(role_name):
ROLE_USER,ROLE_ADMIN
和三个用户,一个用户角色为:
ROLE_USER,ROLE_ADMIN
另一个用户角色为:
ROLE_USER
第三个没有角色.
二.修改配置文件:
其实对Acegi框架的应用难点就在配置文件,所以要特别注意了:
在src建立Acegi的配置文件:
acegi-security.xml当然这个文件的名称是可以任意的.
acegi-security.xml说白了就是配置:
安全拦截器,认证管理器,决策管理器.
其内容如下:
xmlversion="1.0"encoding="UTF-8"?
>
//www.springframework.org/schema/beans"xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="http:
//www.springframework.org/schema/beanshttp:
//www.springframework.org/schema/beans/spring-beans.xsd">
--=========================认证管理器=========================-->
--基于DAO验证的AuthenticationProvider-->
--=========================决策管理器=========================-->
--是否全部弃权就通过-->
--=========================过滤器链=========================-->
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,rememberMeFilter,exceptionFilter,securityInterceptor
--登录退出后的URL-->
--登录退出的URL-->
--登录失败后的URL-->
msg=%E6%97%A0%E6%95%88%E7%9A%84%E7%94%A8%E6%88%B7%E5%90%8D%E6%88%96%E5%8F%A3%E4%BB%A4"/>
--登录成功后的URL-->
--登录的URL-->
--出现AuthenticationException时的登录入口-->
--出现AccessDeniedException时的Handler-->
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/admin/**=ROLE_ADMIN
/user/**=ROLE_USER
/cart/previeworder*=ROLE_USER
在上面的配置文件中,红色部分要特别注意,其余的内容都差不多了.
在整个应用的安全控制中,我们唯一要编写代码的类就是:
org.ymcn.security.AcegiUserDeitailsService
就连登录和登出的代码也不要了.
三.修改web.xml,增加安全控制过滤链.
acegiFilterChain
org.acegisecurity.util.FilterToBeanProxy
targetClass
org.acegisecurity.util.FilterChainProxy
acegiFilterChain
*.j
注意:
这个过滤器一定要在MVC转发过滤器的前面!
!
!
!
四.在applicationContext.xml中增加Acegi安全控制拦截器和Spring的自动代理功能实现AOP代理
--Acegi安全控制拦截器-->
--利用Spring的自动代理功能实现AOP代理-->
transactionInterceptor
serviceSecurityInterceptor
userService
mailService
五.编写在利用Acegi框架唯一要我们编写的类AcegiUserDeitailsService.java
packageorg.ymcn.security;
importjava.util.List;
importorg.acegisecurity.GrantedAuthority;
importorg.acegisecurity.GrantedAuthorityImpl;
importorg.acegisecurity.userdetails.UserDetails;
importorg.acegisecurity.userdetails.UserDetailsService;
importorg.acegisecurity.userdetails.UsernameNotFoundException;
importmons.logging.Log;
importmons.logging.LogFactory;
importorg.springframework.dao.DataAccessException;
importorg.ymcn.dao.UserDao;
importorg.ymcn.dao.UserRoleDao;
importorg.ymcn.model.User;
importorg.ymcn.model.UserRole;
publicclassAcegiUserDeitailsServiceimplementsUserDetailsService{
privatefinalLogLOG=LogFactory.getLog(AcegiUserDeitailsService.class);
/*依赖注入*/
privateUserDaouserDao;
privateUserRoleDaouserRoleDao;
publicvoidsetUserDao(UserDaouserDao){
this.userDao=userDao;
}
publicvoidsetUserRoleDao(UserRoleDaouserRoleDao){
this.userRoleDao=userRoleDao;
}
/*用户所有的权限*/
//privatefinalListgrantedAuthList=newArrayList(6);
privateGrantedAuthority[]grantedAuthArray;
publicUserDetailsloadUserByUsername(StringuserName)
throwsUsernameNotFoundException,DataAccessException{
if(LOG.isDebugEnabled()){
LOG.debug("LoadingUserDetailsofuserName:
"+userName);
}
/*取得用户*/
Useruser=userDao.getUserByName(userName);
if(user==null){
LOG.warn("UserDetailsloadfailed:
NosuchUserRolewithuserName:
"+userName);
thrownewUsernameNotFoundException("Usernameisnotfound.");
}
/*取得所有用户权限*/
ListuserRoleList=u