`
heaven.robin
  • 浏览: 30199 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

acegi+ssh动态实现基于角色的权限管理(一)

阅读更多
    第一次写blog,由于文笔差,请大家见谅.
    最近通过springside和springframework社区学习acegi,并将其加入到我的设计之中.,现在做到web-request,method interceptor,至于domain object级别和acl也没有去研究,但感觉做到这两步也就差不多了吧..
   jar包:
    spring1.2.jar   
    acegi-security-1.0.3.jar    
    commons-codec-1.3.jar
    ehcache-1.2.3.jar
 
   下边说一下我的实现步骤和方法.
    first:数据库结构的设计,我没有用acegi默认的数据库结构,分别用了6张表来实现自己的数据库表.
       权限资源表:存储受保护的url,method

CREATE TABLE `authorities` (
  `auth_ID` int(11) NOT NULL auto_increment,
  `authProtected` varchar(100) NOT NULL,
  `authNote` varchar(200) default NULL,
  `authType` int(2) NOT NULL,
  `authState` int(1) NOT NULL,
  PRIMARY KEY  (`auth_ID`),
  KEY `FK_authorities` (`authType`),
  CONSTRAINT `authorities_ibfk_1` FOREIGN KEY (`authType`) REFERENCES `authtype` (`type_ID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

     权限资源类型表:
CREATE TABLE `authtype` (
  `type_ID` int(11) NOT NULL auto_increment,
  `typeName` varchar(20) NOT NULL,
  `typeState` int(11) NOT NULL default '0',
  PRIMARY KEY  (`type_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     角色表:
CREATE TABLE `role` (
  `role_ID` int(11) NOT NULL auto_increment,
  `roleName` varchar(20) NOT NULL,
  `roleNote` varchar(50) default NULL,
  `roleState` int(11) NOT NULL default '0',
  PRIMARY KEY  (`role_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    角色_权限资源表:
CREATE TABLE `role_auth` (
  `role_auth_ID` int(11) NOT NULL auto_increment,
  `role_ID` int(11) NOT NULL,
  `auth_ID` int(11) NOT NULL,
  PRIMARY KEY  (`role_auth_ID`),
  KEY `FK_role_auth` (`role_ID`),
  KEY `FK_auth_role` (`auth_ID`),
  CONSTRAINT `role_auth_ibfk_1` FOREIGN KEY (`role_ID`) REFERENCES `role` (`role_ID`) ON UPDATE CASCADE,
  CONSTRAINT `role_auth_ibfk_2` FOREIGN KEY (`auth_ID`) REFERENCES `authorities` (`auth_ID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
   用户表:
CREATE TABLE `users` (
  `user_ID` int(11) NOT NULL auto_increment,
  `userName` varchar(40) NOT NULL,
  `userPass` varchar(40) NOT NULL,
  `enabled` int(1) NOT NULL default '0',
  PRIMARY KEY  (`user_ID`),
  UNIQUE KEY `userName` (`userName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  用户_角色表:
CREATE TABLE `user_role` (
  `user_role_ID` int(11) NOT NULL auto_increment,
  `user_ID` int(11) NOT NULL,
  `role_ID` int(11) NOT NULL,
  PRIMARY KEY  (`user_role_ID`),
  KEY `FK_user_role` (`user_ID`),
  KEY `FK_role_users` (`role_ID`),
  CONSTRAINT `user_role_ibfk_1` FOREIGN KEY (`user_ID`) REFERENCES `users` (`user_ID`) ON UPDATE CASCADE,
  CONSTRAINT `user_role_ibfk_2` FOREIGN KEY (`role_ID`) REFERENCES `role` (`role_ID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 主要用到Users,Roles,Authorities三张表,由于Users,Roles多对对,Roles,Authorities也是多对多关系,加了2张中间表,另外authType为区分权限资源的类型,受保护的权限资源有url,method以及domain object的三种保护类型.
当然也可以不要这张表.
 
second:在web.xml配置如下:

<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/spring.xml,/WEB-INF/spring_security_acegi.xml,
      /WEB-INF/spring_dao.xml,/WEB-INF/spring_service.xml,
      /WEB-INF/spring_action.xml</param-value>
  </context-param>

  <!-- set acegi filter -->
  <filter>
   <filter-name>acegiFilterChainProxy</filter-name>
   <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
   <init-param>
    <param-name>targetClass</param-name>
    <!-- you can change there to set channelProcessingFilter -->
    <param-value>org.acegisecurity.util.FilterChainProxy</param-value>
   </init-param>
  </filter>
  <filter-mapping>
   <filter-name>acegiFilterChainProxy</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>

  先通过ContextLoaderListener加载acegi的配置文件,存放在webApplicationContext中.然后将所有的过滤请求交给FilterChainProxy处理.
如果需要使用channelProcessingFilter 安全通道处理的话,在这里也可以加上.
以前使用openSessionInView,我只把spring.xml这个主配置文件通过ContextLoader
Listener加载,现在为了需要,全都用这个加载了.
 
  third:配置spring_security_acegi.xml
  通过ant加载所有的过滤器
  <!-- load all filter or inteceptor with ant -->
 <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
  <property name="filterInvocationDefinitionSource">
   <value>
    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    PATTERN_TYPE_APACHE_ANT
    /**=httpSessionContextIntegrationFilter,logoutFilter,basicProcessingFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
   </value>
  </property>
 </bean>
  八个过滤器, 一个拦截器,注意的两个问题:
  1:注意过滤器之间的先后顺序,否则会出一些错误的.
  2:所有过滤器都写一行,不要换行,否则换行的那些过滤器在加载的时候会报什么bean name ""错误.
  下边就是这些过滤器了.
 
 <!-- 1. set httpSessionContextIntegrationFilter -->
 <bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"/>
 集成所有过滤器的,没什么好说
 
 <!-- 2. set logoutFilter -->
 注销过滤器
 <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
  <constructor-arg value="/admin_login.jsp"/>
  <constructor-arg>
   <list>
    <ref bean="rememberMeServices"/>
    <ref bean="securityContextLogoutHanlder"/>
   </list>
  </constructor-arg>
  <property name="filterProcessesUrl" value="/logout"/>
 </bean>
 <!-- set rememberMeServices -->
 <bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
  <property name="userDetailsService" ref="hibernateDaoImpl"/>
  <property name="key" value="rememberMeUser"/>
  <property name="parameter" value="rememberMe"/>
  <property name="authenticationDetailsSource" ref="authenticationDetailsSourceHandler"/>
 </bean>
 <!-- set SecurityContextLogoutHandler -->
 <bean id="securityContextLogoutHanlder" class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
这个过滤器用来注销用户信息,如果用了cookie保存的话,需要进行设置.
 
<bean id="authenticationDetailsSourceHandler" class="com.runsa.components.acegi.support.AuthenticationDetailsSourceHandler"/>
这个是自己实现的,为了解决ConCurrentSessionImpl与rememberMe冲突的问题

public class AuthenticationDetailsSourceHandler extends
  AuthenticationDetailsSourceImpl {

 /**
  * 解决rememberMe与ConCurrentSessionController冲突
  */
 @Override
 public Object buildDetails(HttpServletRequest request) {
  // TODO 自动生成方法存根
  HttpSession session = request.getSession(false);
  if(session == null ){
   session = request.getSession(true);
  }
  return super.buildDetails(request);
 }
}

 

 基本处理过滤器,设置了登录入口页面,这个可以不要

 <!-- 3.set basicProcessingFilter -->
 <bean id="basicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter">
  <property name="authenticationManager" ref="authenticationManager"/>
  <property name="authenticationEntryPoint">
   <bean class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">
    <property name="realmName" value="www.runsa.cn"/>
   </bean>
  </property>
 </bean>

 

 认证处理过滤器,应该是最重要的一个了吧

<!-- 4.set authenticationProcessingFilter -->
 <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
  <property name="authenticationManager" ref="authenticationManager"/>
  <property name="authenticationFailureUrl" value="/admin_login.jsp?login_error=loginError"/>
  <property name="defaultTargetUrl" value="/admin/adminIndex.do"/>
  <property name="filterProcessesUrl" value="/check"/>
  <property name="rememberMeServices" ref="rememberMeServices"/>
  <property name="alwaysUseDefaultTargetUrl" value="true"/>
 </bean>
  authenticationManager认证管理器,这个等会在说
  authenticationFailureUrl认证失败页面
  defaultTargetUrl认证成功后转向的页面,我设置alwaysUseDefaultTargetUrl
为true,在认证成功后,自己做一些其他的处理.
 filterProcessesUrl认证时提交的form对应的ation
 rememberMeServices,认证时先通过cookie获取保存信息进行认证.
 
securityContextHolder处理过滤器,他用来存放securityContext信息,而securityContext存放Authorities[]权限信息,principal(存放用户信息)
<!-- 5.set securityContextHolderAwareRequestFilter -->
 <bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"/>
 
cookie处理过滤器
<!-- 6.set rememberMeProcessingFilter -->
 <bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
  <property name="authenticationManager" ref="authenticationManager"/>
  <property name="rememberMeServices" ref="rememberMeServices"/>
 </bean>
记录cookie信息
 
匿名处理过滤器
 <!-- 7.set anonymousProcessingFilter -->
 <bean id="anonymousProcessingFilter" class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">
  <property name="key" value="anonymousUser"/>
  <property name="userAttribute" value="isAnonymous,ROLE_ANONYMOUS"/>
 </bean>
 
异常处理过滤器
 <!-- 8. set exceptionTranslationFilter -->
 <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
  <property name="authenticationEntryPoint">
   <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
    <property name="loginFormUrl" value="/admin_login.jsp?login_error=noLogin"/>
    <property name="forceHttps" value="false"/>
   </bean>
  </property>
  <property name="accessDeniedHandler">
   <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
    <property name="errorPage" value="/admin/deny.jsp"/>
   </bean>
  </property>
 </bean>
在认证失败后,一般会抛出AccessDeniedException,过滤器捕获此异常并转向errorPage页面.
 
资源调用拦截器
 <!-- 9. set filterInvocationInterceptor -->
 <bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
  <property name="authenticationManager" ref="authenticationManager"/>
  <property name="accessDecisionManager" ref="httpAccessDecisionManager"/>
  <property name="objectDefinitionSource" ref="filterDefinitionSource"/>
 </bean>
如果需要从配置文件加载保护资源的话,要相对简单
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/admin/* = ROLE_ADMIN
/* = ROLE_USER,ROLE_ANONYMOUS
这样就可以了
但为了实现配置动态更新,从数据库获取保护资源.这个等会再说.
 
在过滤拦截保护资源时,需要访问决策管理器,三种投票方式
 org.acegisecurity.vote.ConsensusBased多数投票者同意可通过
org.acegisecurity.vote.UnanimousBased全部投票者同意可通过
org.acegisecurity.vote.AffirmativeBased至少一个投票者同意可通过
一般选最后一个 就可以了
 <!-- set httpAccessDecisionManager -->
 <bean id="httpAccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
  <property name="allowIfAllAbstainDecisions" value="false"/>
  <property name="decisionVoters">
   <list>
    <bean class="org.acegisecurity.vote.RoleVoter">
     <property name="rolePrefix" value="ROLE_"/>
    </bean>
    <bean class="org.acegisecurity.vote.AuthenticatedVoter"/>
   </list>
  </property>
 </bean>

 

 晕 超过2W了  换一页

分享到:
评论
1 楼 sscmqhk 2008-05-06  
问个问题 你的代码里的那个 DB下的 已经.pSC的后缀的文件是啥文件...要用说明打开....

相关推荐

    acegi+ssh动态实现基于角色的权限管理

    ### acegi+SSH动态实现基于角色的权限管理 在企业级应用开发中,权限管理和用户认证是必不可少的安全机制。本文将详细介绍如何利用Acegi安全框架(现称为Spring Security)结合SSH(Struts + Spring + Hibernate)...

    Acegi + Spring + Hibernate + Struts 2搭建基于角色的权限控制系统

    Acegi(现已被Spring Security替代)是一个强大的安全框架,可以与Spring、Hibernate和Struts 2等其他技术结合,实现基于角色的权限控制(Role-Based Access Control, RBAC)。这篇文档将探讨如何使用Acegi,以及SSH...

    SSH+Extjs4 0实现的权限管理系统 基于角色的权限设计

    《SSH+Extjs4.0实现的权限管理系统:基于角色的权限设计》 在IT行业中,权限管理系统是保障系统安全性和数据隐私的关键组件。本文将深入探讨如何利用SSH(Spring、Struts2、Hibernate)框架结合Extjs4.0前端库,...

    Acegi + Spring + Hibernate + Struts2搭建

    本篇文章将探讨如何使用Acegi、Spring、Hibernate和Struts2这四大组件共同构建一个基于角色的权限控制系统(Role-Based Access Control, RBAC),以确保系统的安全性。 首先,我们需要理解认证和授权这两个基本的...

    velocity+ssh2+分页+权限

    在SSH2框架中,Spring Security(以前称为Acegi)是一个强大的安全框架,它可以处理认证(验证用户身份)和授权(确定用户权限)。通过配置Spring Security,可以实现基于角色的访问控制,限制不同角色用户的操作...

    acegi结合ssh实用列子

    Acegi Security System for Spring(简称Acegi)是Spring框架的一个扩展,它为Spring应用程序提供了全面的安全管理解决方案。在本示例中,我们将深入探讨如何将Acegi与Struts、Hibernate(SSH)这三大主流Java Web...

    ssh集成的权限管理板块

    总结来说,SSH集成的权限管理板块是一个复杂但至关重要的部分,它涉及到用户认证、授权、资源访问控制等多个环节。通过Spring Security的丰富功能,开发者可以构建出安全、灵活的权限管理体系,确保系统的稳定运行和...

    FLEX+SSH某水源检测系统完整代码(带登录界面权限控制)

    在权限管理方面,Spring的Acegi安全模块(现已被Spring Security取代)可以用来实现用户的认证和授权。 Hibernate3是一个持久化框架,用于简化Java对象与数据库之间的映射关系。在这个系统中,Hibernate可能是用来...

    ssh写的用户登录权限实现

    在本场景中,"ssh写的用户登录权限实现"指的是使用SSH协议来控制用户登录的权限,确保在同一时间只有一个用户能够使用特定的账号登录系统。这种机制可以防止未经授权的并发登录,增加系统的安全性。 Struts2、...

    java ssh框架权限管理系统

    在SSH框架下,这部分功能可以通过Spring Security(原名Acegi Security)来实现,它可以提供角色和权限的管理,以及基于URL的访问控制。 在给定的压缩包文件中,"work 20120114 1426.sql"可能是数据库的备份文件,...

    SSH框架下的用户权限管理(树形结构)

    在SSH框架中,我们可以利用Spring Security(原名Acegi Security)来实现这一功能。Spring Security提供了丰富的API和配置选项,能够进行细粒度的访问控制,包括基于角色的访问控制(RBAC)。 在描述中提到的...

    ssh集成的实现了权限,员工部门

    在权限管理中,Spring的Security模块(原Acegi Security)是一个强大的安全框架,可以处理用户的认证(Authentication)和授权(Authorization)。它允许我们定义角色、权限,以及这些角色和权限如何映射到具体用户...

    权限管理(ssh)+dwr

    在权限管理中,Spring提供了强大的安全性支持,如Spring Security(原Acegi),可以实现用户的认证与授权,包括基于角色的访问控制(RBAC)和细粒度的权限分配。 Struts作为MVC框架,负责处理HTTP请求并将其映射到...

    基于SSH2架构的Java Web通用权限管理的设计.pdf

    在SSH2框架下,这种设计可以充分利用Spring的安全管理功能,如Spring Security(原Acegi Security),它提供了一套完整的权限控制机制,包括认证、授权、访问控制等功能。通过配置Spring Security,可以实现用户登录...

    rapidsh-SSH经典整合框架-包括权限管理-文件上传下载-用户管理-分页-lookup

    **权限管理**:在SSH框架中,通常会利用Spring Security(原Acegi)或者Apache Shiro来实现权限控制。这些安全框架提供了角色、权限的概念,可以对用户的访问权限进行精细化控制,确保系统安全。 **文件上传下载**...

    基于SSH基础的用户管理

    在这个“基于SSH基础的用户管理”项目中,我们主要关注的是如何使用SSH框架来实现Java中的用户管理和权限控制。SSH在这里指的是Spring、Struts和Hibernate这三个开源Java框架的组合,它们共同构建了企业级应用的基础...

    基于ssh的用户管理系统jsp

    7. **安全控制**:SSH框架提供了安全控制机制,例如使用Spring Security(原Acegi)进行身份验证和授权,防止未授权访问。此外,Struts2的拦截器也可以用来实现登录检查和会话管理。 8. **数据访问对象(DAO)**:...

    JAVA基于SSH的酒店管理系统的分析与设计

    6. **权限控制**:SSH框架支持基于角色的访问控制(RBAC),在酒店系统中,不同角色(如管理员、普通用户)有不同的操作权限,需要通过Spring Security或Acegi等扩展实现。 7. **异常处理**:系统应有完善的异常...

    oa.rar_flex ssh oa_java oa_ssh权限管理

    在"oa.rar_flex ssh oa_java oa_ssh权限管理"这个项目中,我们可以看到一个基于SSH技术构建的企业级应用,它涉及到了OA(Office Automation)系统的核心功能。 OA系统是一种自动化办公软件,用于提升企业内部的工作...

    java权限管理

    在Java中,权限管理是通过一系列技术和框架实现的,如SSH(Struts2、Spring、Hibernate)和Acegi,这些都是Java企业级应用的基石。 【Struts2】是MVC(Model-View-Controller)设计模式的一个流行实现,负责处理...

Global site tag (gtag.js) - Google Analytics