- 浏览: 9778 次
最新评论
使用ACEGI实现权限控制,第一部分
环境:
struts2,acegi1.0.6,spring2.5.1,cas3
一、综述:环境搭建
1.spring和acegi版本
spring2.5.6和acegi1.0.6兼容性问题
会报
java.lang.NoClassDefFoundError: org/springframework/web/bind/RequestUtils
不过据说装合适的spring-webmvc这个jar也可以解决问题,没有测试
1.搭建acegi环境
web.xml配置,使用acegi的过滤器
配置web.xml
过滤器要放在struts前面,否则会报错。因为有些操作要acegi中的springmvc处理
配置acegi配置文件,配置认证管理器、投票管理器、过滤器链、配置acegi的log4j日志
说明:
1、过滤器链:filterChainProxy,有顺序要求
/**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,rememberMeFilter,exceptionFilter,securityInterceptor
2、rememberMe配置要点
rememberMeServices使用TokenBasedRememberMeServices,token64编码后放入cookie
logoutFilter使用rememberMeServices,离开后保存cookie
rememberMeFilter配置authenticationManager和rememberMeServices
rememberMeServices的parameter和html表单的Remember Me字段的name一致
rememberMeServices的key和authenticationManager中的rememberMeAuthenticationProvider的key要一致
3、使用DaoAuthenticationProvide实现基于数据库的用户认证授权,userDetailsService中可以用注入sql使用数据库实现,文件方式保存用户基本没啥用
修改usersByUsernameQuery和authoritiesByUsernameQuery注入sql
使用Ehache提高性能
4、配置日志
<!-- 监听认证授权事件,输出日志 -->
<bean id="authenticationLoggerListener"
class="org.acegisecurity.event.authentication.LoggerListener" />
<bean id="authorizationLoggerListener"
class="org.acegisecurity.event.authorization.LoggerListener" />
对应的,如果是log4j.xml
log4j.xml
<logger name="log4j.logger.org.acegisecurity" additivity="true">
<level value="DEBUG" />
<appender-ref ref="LOG.DEBUG" />
</logger>
如果是log4j.properties
log4j.properties
log4j.logger.org.acegisecurity=DEBUG
5.表单认证
<bean id="authenticationProcessingFilter"
class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager" ref="authenticationManager" />
<!-- 登录失败的页面,包含出错信息的登录页面 -->
<property name="authenticationFailureUrl" value="/login.jsp?login_error=Login%20failed." />
<!-- 登录后的跳转页面 -->
<property name="defaultTargetUrl" value="/helloWorld.jsp" />
<!-- 用户登录的URL -->
<property name="filterProcessesUrl" value="/j_login.do" />
<property name="rememberMeServices" ref="rememberMeServices" />
</bean>
表单中的username和password的name这里为j_username和j_password,acegi的springmvc实现中用
filterProcessesUrl默认是j_acegi_security_check,可以修改,需要登录页面同步
6.用户注销
logoutFilter中filterProcessesUrl默认是j_acegi_logout,只要将退出页面中url设置为j_acegi_logout就可以触发
7.授权
accessDecisionManager:事前评估。使用投票表决器。RoleVoter是基于角色的投票表决器。
这里securityInterceptor使用文件配置,也可以修改为数据库方式实现
8.使用aop对方法授权
环境:
struts2,acegi1.0.6,spring2.5.1,cas3
一、综述:环境搭建
1.spring和acegi版本
spring2.5.6和acegi1.0.6兼容性问题
会报
java.lang.NoClassDefFoundError: org/springframework/web/bind/RequestUtils
不过据说装合适的spring-webmvc这个jar也可以解决问题,没有测试
1.搭建acegi环境
web.xml配置,使用acegi的过滤器
配置web.xml
<context-param>中包含新配置文件 <!-- Acegi过滤器 --> <filter> <filter-name>acegiFilterChain</filter-name> <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class> <init-param> <param-name>targetClass</param-name> <param-value>org.acegisecurity.util.FilterChainProxy</param-value> </init-param> </filter> <!-- Acegi过滤器URL映射 --> <filter-mapping> <filter-name>acegiFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
过滤器要放在struts前面,否则会报错。因为有些操作要acegi中的springmvc处理
javax.servlet.ServletException: Filter execution threw an exception org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:389) java.lang.NoClassDefFoundError: org/springframework/web/bind/RequestUtils
配置acegi配置文件,配置认证管理器、投票管理器、过滤器链、配置acegi的log4j日志
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- ======================================================================== 认证管理器 ========================================================================= --> <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"> <property name="providers"> <list> <ref bean="daoAuthenticationProvider" /> <ref bean="rememberMeAuthenticationProvider" /> </list> </property> </bean> <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="userDetailsService" /> <property name="userCache" ref="userCache" /> </bean> <!-- 基于DAO验证的Ehcache实现 --> <bean id="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache"> <property name="cache" ref="userCacheBackend" /> </bean> <bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheManager" ref="cacheManager" /> <property name="cacheName"> <value>userCache</value> </property> </bean> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" /> <bean id="rememberMeAuthenticationProvider" class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider"> <property name="key" value="remember_Me" /> </bean> <!-- 使用数据库DAO查找用户和角色 --> <bean id="userDetailsService" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl"> <property name="dataSource" ref="dataSource" /> <property name="usersByUsernameQuery"> <value> <![CDATA[SELECT u.staffname USERNAME,u.staffpwd PASSWORD,u.STATUS enabled FROM sw_staff u where u.STATUS = 1 AND u.staffname = ?]]> </value> </property> <property name="authoritiesByUsernameQuery"> <value> <![CDATA[SELECT t1.staffid USERNAME,t3.roledec authority FROM sw_staff t1, SW_UserPower t2,sw_Roles t3 WHERE t1.staffid= t2.staffid and t2.roleid= t3.roleid and t1.staffname = ?]]> </value> </property> </bean> <!-- ======================================================================== 决策管理器 ========================================================================= --> <!-- 至少有一个投票者容许,就可以访问资源 --> <bean id="accessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased"> <property name="decisionVoters"> <list> <bean class="org.acegisecurity.vote.RoleVoter" /> </list> </property> <!-- 所有投票者弃权,不容许访问 --> <property name="allowIfAllAbstainDecisions" value="false" /> </bean> <!-- ======================================================================== 过滤器链 ========================================================================= --> <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"> <property name="filterInvocationDefinitionSource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,rememberMeFilter,exceptionFilter </value> </property> </bean> <!-- 从Session中获得用户信息并放入SecurityContextHolder --> <bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter" /> <!-- 用户注销 --> <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter"> <!-- 注销后默认的跳转页面 --> <constructor-arg value="/helloWorld.jsp" /> <constructor-arg> <list> <ref bean="rememberMeServices" /> <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" /> </list> </constructor-arg> <property name="filterProcessesUrl" value="/j_logout.do" /> </bean> <!-- 表单方式验证用户身份 --> <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"> <property name="authenticationManager" ref="authenticationManager" /> <!-- 登录失败的页面,包含出错信息的登录页面 --> <property name="authenticationFailureUrl" value="/login.jsp?login_error=Login%20failed." /> <!-- 登录后的跳转页面 --> <property name="defaultTargetUrl" value="/helloWorld.jsp" /> <!-- 用户登录的URL --> <property name="filterProcessesUrl" value="/j_acegi_security_check" /> <property name="rememberMeServices" ref="rememberMeServices" /> </bean> <bean id="casProcessingFilter" class="org.acegisecurity.ui.cas.CasProcessingFilter"> <property name="authenticationManager" ref="authenticationManager" /> <!-- 登录后的跳转页面 --> <property name="defaultTargetUrl" value="/helloWorld.jsp" /> <property name="filterProcessesUrl" value="/j_acegi_cas_security_check" /> <!-- 认证失败后的跳转页面 --> <property name="authenticationFailureUrl" value="/login.jsp?login_error=Login%20failed." /> <property name="rememberMeServices" ref="rememberMeServices"/> </bean> <!-- 记住用户登录信息 --> <!--<bean id="rememberMeFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter"> <property name="authenticationManager" ref="authenticationManager" /> <property name="rememberMeServices" ref="rememberMeServices" /> </bean> --> <!-- 处理登录异常或权限异常的Filter --> <bean id="exceptionFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"> <!-- 出现AuthenticationException时的登录入口,无认证异常 --> <!-- 表单登录时用 <property name="authenticationEntryPoint"> <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"> 将用户导向登录页面 <property name="loginFormUrl" value="/login.jsp" /> 是否强制使用https <property name="forceHttps" value="false" /> </bean> </property> --> <!--CAS认证登录时用--> <property name="authenticationEntryPoint"> <bean class="org.acegisecurity.ui.cas.CasProcessingFilterEntryPoint"> <property name="loginUrl" value="https://localhost:8443/cas-server-webapp-3.1.1/login" /> <property name="serviceProperties" ref="serviceProperties" /> </bean> </property> <!-- 出现AccessDeniedException时的Handler,无权限异常--> <property name="accessDeniedHandler"> <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl"> <property name="errorPage" value="/accessDenied.jsp" /> </bean> </property> </bean> <bean id="serviceProperties" class="org.acegisecurity.ui.cas.ServiceProperties"> <!-- CAS登录后的重定向页面--> <property name="service" value="http://localhost:8080/test" /> <property name="sendRenew" value="false" /> </bean> <bean id="securityInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"> <property name="authenticationManager" ref="authenticationManager" /> <property name="accessDecisionManager" ref="accessDecisionManager" /> <property name="objectDefinitionSource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /index.jsp=ROLE_LOGIN /*action=ROLE_LOGIN </value> </property> </bean>
说明:
1、过滤器链:filterChainProxy,有顺序要求
/**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,rememberMeFilter,exceptionFilter,securityInterceptor
2、rememberMe配置要点
rememberMeServices使用TokenBasedRememberMeServices,token64编码后放入cookie
logoutFilter使用rememberMeServices,离开后保存cookie
rememberMeFilter配置authenticationManager和rememberMeServices
rememberMeServices的parameter和html表单的Remember Me字段的name一致
rememberMeServices的key和authenticationManager中的rememberMeAuthenticationProvider的key要一致
3、使用DaoAuthenticationProvide实现基于数据库的用户认证授权,userDetailsService中可以用注入sql使用数据库实现,文件方式保存用户基本没啥用
修改usersByUsernameQuery和authoritiesByUsernameQuery注入sql
使用Ehache提高性能
4、配置日志
<!-- 监听认证授权事件,输出日志 -->
<bean id="authenticationLoggerListener"
class="org.acegisecurity.event.authentication.LoggerListener" />
<bean id="authorizationLoggerListener"
class="org.acegisecurity.event.authorization.LoggerListener" />
对应的,如果是log4j.xml
log4j.xml
<logger name="log4j.logger.org.acegisecurity" additivity="true">
<level value="DEBUG" />
<appender-ref ref="LOG.DEBUG" />
</logger>
如果是log4j.properties
log4j.properties
log4j.logger.org.acegisecurity=DEBUG
5.表单认证
<bean id="authenticationProcessingFilter"
class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager" ref="authenticationManager" />
<!-- 登录失败的页面,包含出错信息的登录页面 -->
<property name="authenticationFailureUrl" value="/login.jsp?login_error=Login%20failed." />
<!-- 登录后的跳转页面 -->
<property name="defaultTargetUrl" value="/helloWorld.jsp" />
<!-- 用户登录的URL -->
<property name="filterProcessesUrl" value="/j_login.do" />
<property name="rememberMeServices" ref="rememberMeServices" />
</bean>
表单中的username和password的name这里为j_username和j_password,acegi的springmvc实现中用
filterProcessesUrl默认是j_acegi_security_check,可以修改,需要登录页面同步
6.用户注销
logoutFilter中filterProcessesUrl默认是j_acegi_logout,只要将退出页面中url设置为j_acegi_logout就可以触发
7.授权
accessDecisionManager:事前评估。使用投票表决器。RoleVoter是基于角色的投票表决器。
这里securityInterceptor使用文件配置,也可以修改为数据库方式实现
8.使用aop对方法授权
发表评论
-
SpringSecurity 配置(登陆验证,session失效等等)
2015-09-28 15:44 2738SpringSecurity安全配置—SSH整合 项目中使用 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(7)-缓存用户信息
2015-09-23 18:04 452首先讲讲EhCache。在默认情况下,即在用户未提供自身配置文 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(6)
2015-09-22 16:19 399在企业应用中,用户的用户名、密码和角色等信息一般存放在RDBM ... -
菜鸟-手把手教你把Acegi应用到实际项目中(5)
2015-09-22 16:18 441在实际企业应用中,用户密码一般都会进行加密处理,这样才能使企业 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(4)
2015-09-22 09:45 483今天就讲个ConcurrentSessionFilter。 在 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(3)
2015-09-22 09:43 453这一节我们将要了解的是AnonymousProcessi ... -
菜鸟-手把手教你把Acegi应用到实际项目中(1.2)
2015-09-22 09:29 479菜鸟-手把手教你把Acegi应用到实际项目中(1.2) 博客 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(1.1)
2015-09-21 16:37 435菜鸟-手把手教你把Acegi应用到实际项目中(1.1) 博客 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(2)
2015-09-21 16:28 499菜鸟-手把手教你把Acegi应用到实际项目中(2) 博客分类 ... -
使用ACEGI搭建权限系统
2015-09-21 16:25 418使用ACEGI搭建权限系统:第三部分 三使用CAS实现单点登 ... -
acegi安全框架使用
2015-09-21 16:20 438acegi安全框架使用:第二部分 二、dbms实现鉴权 1. ...
相关推荐
在本实例中,我们将深入探讨如何使用Acegi来控制用户的权限。Acegi Security已经被Spring Security替代,但其核心思想和机制仍然适用于现代的Spring Security。 首先,我们需要理解Acegi的基础概念。Acegi的核心是`...
Spring Acegi权限控制是Spring框架中用于实现Web应用安全的一种解决方案。Acegi Security(现已被Spring Security替代)是一个功能强大的安全框架,它主要解决了认证(Authentication)和授权(Authorization)这两...
标题 "batis+acegi实现的动态权限控制" 暗示了这个项目是关于整合Spring框架中的Acegi安全模块和MyBatis ORM框架,来创建一个动态的权限管理系统。Acegi是Spring早期的安全组件,现在已被Spring Security所取代,但...
这个压缩包“集成ACEGI 进行权限控制.rar”包含了实现这一功能所需的组件和详细教程,让我们一起深入探讨ACEGI Security的原理和应用。 1. **ACEGI Security概述** ACEGI Security的核心目标是提供一套灵活、可...
AceGI可以通过配置实现基于角色的访问控制(RBAC)或基于权限的访问控制(PBAC)。 在实际应用中,AceGI的配置通常在Spring的配置文件中完成,通过定义SecurityContextHolder策略、定义安全过滤器链、设置认证和...
5. **会话管理**:Acegi提供了会话管理功能,如会话固定攻击防护、会话超时检测和并发会话控制,以防止恶意用户同时使用同一用户的多个会话。 6. **事件监听**:Acegi允许监听和处理安全相关的事件,如登录成功、...
在Acegi中,权限控制主要通过`AccessDecisionManager`、`AuthenticationManager`和`SecurityContextHolder`等组件来实现。`AccessDecisionManager`负责决策是否允许访问某个资源,`AuthenticationManager`处理用户...
Acegi权限控制学习笔记 Acegi安全框架是Spring Security的前身,它提供了一种强大的、灵活的、基于组件的安全解决方案,用于实现企业级应用的安全控制。在这个学习笔记中,我们将探讨两个关键点:身份认证成功后的...
通过Acegi,开发者可以轻松地实现复杂的权限控制逻辑,确保应用程序的安全性。 #### 实现基于角色的权限管理 实现基于角色的权限管理主要涉及以下几个步骤: 1. **定义用户身份验证机制**:在系统中,每个用户都...
它使用AOP(面向切面编程)来实现权限检查,可以在任何代码执行点进行安全拦截。 4. **会话管理(Session Management)**: 手册将详细讲解如何配置Acegi以防止会话劫持、会话固定攻击等。这包括会话超时、会话...
总的来说,通过对这个资料的学习,开发者能够掌握Acegi的使用技巧,从而在Java应用中实现精细的权限控制,提升系统的安全性。同时,这些知识对于理解现在的Spring Security框架也非常有帮助,因为很多设计理念和功能...
4. **拦截器**:Acegi通过AOP拦截器来实现权限检查。`SecurityInterceptor`是一个关键组件,它会在方法执行前后进行权限检查。如果用户不具备所需的权限,Acegi会抛出异常并中断执行。 5. **配置与文档**:Acegi的...
在"权限管理组件在Spring框架下的设计与实现.nh"这个文件中,可能包含了关于如何配置Acegi Security、定义角色和权限、以及如何在Spring MVC控制器中使用这些机制的具体步骤和示例。通常,这会包括XML配置文件的设置...
Acegi的强大之处在于它能够无缝集成到Spring环境中,使得开发者可以方便地实现复杂的权限控制策略。在本项目中,Acegi主要负责用户的登录验证、角色分配以及资源访问权限的控制。 Appfuse是一个开源项目,旨在简化...
- **授权(Authorization)**:Acegi 提供细粒度的权限控制,允许开发者根据角色、URL路径、方法参数等进行权限配置,实现不同级别的访问控制。 - **会话管理(Session Management)**: Acegi 可以监控和管理用户...
5. **AcegiExample**:这可能是项目的主要代码或配置文件,包含Acegi的配置示例,例如自定义的`AuthenticationProvider`实现,或者展示了如何定义访问控制策略的XML配置。 6. **jar.GIF 和 result.GIF**:这些可能...