- 浏览: 124533 次
- 性别:
- 来自: 深圳
最新评论
-
adong12300:
,找了好几个这种文件压缩的,就这个没啥问题
java zip递归压缩解压代码 -
jakeyouxiang:
E:\android\android-sdk-windows\ ...
Re-installation failed due to different application signatures -
zhongaili520:
页面传得值无法验证回报这个错,比如传个js对象给action
No result defined for action -
sdylag:
E:\android\android-sdk-windows\ ...
Re-installation failed due to different application signatures -
莫念╮:
很适合我们新手的学习,抱一抱!
Android SDK 2.2 开发环境安装
Acegi配置(转)
2010-07-30 18:51
1.Acegi认证与授权
1.1在Web.xml中添加 <!--acegi 的filter链代理--> <filter> <filter-name>Acegi Filter Chain Proxy</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> <filter-mapping> <filter-name>Acegi Filter Chain Proxy</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 1.2bookstore对每个Component都有单独的配置。这里也参照它的结构,把Acegi的配置文件放在bookstoredemo/src /java/org/springside/bookstoredemo/components/acegi目录下,取名 applicationContext-acegi-security.xml,并在bookstoredemo/src/resources /spring目录下新建applicationContext-components.xml文件,内容如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> <!-- Acegi --> <import resource="classpath:org/springside/bookstoredemo/components/acegi/applicationContext-acegi-security.xml"/> </beans> 1.3在applicationContext-acegi-security.xml中添加刚才在Web.xml文件中声明的org.acegisecurity.util.FilterChainPrxy: <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,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor </value> </property> </bean> 这个bean它主要是装载filterInvocationDefinitionSource指定的filter类,并顺序调用它们的doFilter方法,进行安全服务处理。这个bean总共声明了8个filter。 1.4顺序添加httpSessionContextIntegrationFilter: <bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"/> 这个bean负责每次请求从HttpSession中获取Authentication对象,然后把Authentication存于一个新的 ContextHolder对象(其实质上只是一个ThreadLocal对象)中,则让该次请求过程中的任何Filter都可以通过 ContextHolder来共享Authentication,而不需要从HttpSession中取,减少传HttpRequest参数的麻烦.在请求完后把Authentication对象保存到HttpSession中供下次请求使用,最后把刚才生成的ContextHolder对象销毁.这样就达到了让Authentication对象跨越多个请求的目的.注意此filter须在调用其他Acegi filter前使用 1.5顺序添加logoutFilter: <!-- 注销处理filter --> <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter"> <constructor-arg value="/shop/index.do"/> <!-- URL redirected to after logout --> <constructor-arg> <list> <ref bean="rememberMeServices"/> <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/> </list> </constructor-arg> </bean> 这个bean负责处理退出登录后所需要的清理工作。它会把session销毁,把ContextHolder清空, 把rememberMeServices从cookies中清除掉,然后重定向到指定的退出登陆页面。 1.6顺序添加authenticationProcessingFilter <!-- 表单认证处理filter --> <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"> <property name="authenticationManager" ref="authenticationManager"/> <property name="authenticationFailureUrl" value="/acegilogin.jsp?login_error=1"/> <property name="defaultTargetUrl" value="/admin/index.jsp"/> <property name="filterProcessesUrl" value="/j_acegi_security_check"/> <property name="rememberMeServices" ref="rememberMeServices"/> </bean> 这个bean处理一个认证表单,登陆用的表单必须提交用户名和密码这两个参数给这个filter.由用户名和密码构造一个 UsernamePasswordAuthenticationToken,将传给AuthenticationManager的 authenticate方法进行认证处理。该filter默认处理filterProcessesUrl属性指定的URL,认证失败会转到 authenticationFailureUrl,认证成功会转到defaultTargetUrl页面。 1.7顺序添加securityContextHolderAwareRequestFilter <bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"/> 这个bean保存当前的请求到SavedRequest,并存入Session,然后转到登录页。 1.8顺序添加rememberMeProcessingFilter <bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter"> <property name="authenticationManager" ref="authenticationManager"/> <property name="rememberMeServices" ref="rememberMeServices"/> </bean> 这个bean以cookie的形式来保存认证信息。负责在用户登录后在本地机上记录用户cookies信息,免除下次再次登陆。检查 AuthenticationManager 中是否已存在Authentication对象,如果不存在则会调用RememberMeServices的aotoLogin方法来从cookies中获取Authentication对象。 1.9顺序添加nonymousProcessingFilter <bean id="anonymousProcessingFilter" class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter"> <property name="key" value="changeThis"/> <property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS"/> </bean> 这个bean负责为当不存在任何授权信息时,自动为Authentication对象添加userAttribute中定义的匿名用户权限 1.10顺序添加exceptionTranslationFilter <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"> <property name="authenticationEntryPoint"> <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"> <property name="loginFormUrl" value="/acegilogin.jsp"/> <property name="forceHttps" value="false"/> </bean> </property> <property name="accessDeniedHandler"> <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl"> <property name="errorPage" value="/accessDenied.jsp"/> </bean> </property> </bean> 这个bean负责处理各种异常,然后重定向到相应的页面中。 1.11顺序添加filterInvocationInterceptor <bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"> <property name="authenticationManager" ref="authenticationManager"/> <property name="accessDecisionManager"> <bean class="org.acegisecurity.vote.AffirmativeBased"> <property name="allowIfAllAbstainDecisions" value="false"/> <property name="decisionVoters"> <list> <bean class="org.acegisecurity.vote.RoleVoter"/> <bean class="org.acegisecurity.vote.AuthenticatedVoter"/> </list> </property> </bean> </property> <property name="objectDefinitionSource" ref="filterDefinitionSource"/> </bean> 这个bean会首先调用AuthenticationManager判断用户是否已登陆认证,如还没认证成功,则重定向到登陆界面.认证成功,则从 Authentication中获取用户的权限.然后从objectDefinitionSource属性获取各种URL资源所对应的权限.最后调用 AccessDecisionManager来判断用户所拥有的权限与当前受保护的URL资源所对应的权限是否相匹配.如果匹配失败,则返回403错误给用户.匹配成功则用户可以访问受保护的URL资源 1.12至此,我们在1.3中所声明的8个Filter全部装载完成。试运行,会提示找不到rememberMeServices,这个rememberMeServices在1.6和1.8中声明,添加rememberMeServices: <bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices"> <property name="userDetailsService" ref="userDetailsService"/> <property name="key" value="changeThis"/> </bean> 这个bean负责通过以cookie的形式保存先前的用户登录信息。在Authentication对象不存在时, rememberMeProcessingFilter会调用rememberMeServices的autoLogin()方法,尝试在cookie中获取用户登录信息,如果存在则并返回Authentication对象。在每次用户登录时,如果设置了RememberMe功能,在验证用户身份成功后,则会调用loginSuccess()方法记录用户信息在cookie中,否则调用loginFail()方法清除cookie。 1.13为1.12添加userDetailsService: <bean id="userDetailsService" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl"> <property name="dataSource" ref="dataSource"/> <property name="usersByUsernameQuery"> <value> select loginid,passwd,1 from ss_users where status='1' and loginid = ? </value> </property> <property name="authoritiesByUsernameQuery"> <value> select u.loginid,r.name from ss_users u,ss_roles r,ss_user_role ur where u.id=ur.user_id and r.id=ur.role_id and u.status='1' and u.loginid=? </value> </property> </bean> 1.14为1.11添加authenticationManager: <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"> <property name="providers"> <list> <ref local="daoAuthenticationProvider"/> <bean class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider"> <property name="key" value="changeThis"/> </bean> <bean class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider"> <property name="key" value="changeThis"/> </bean> </list> </property> </bean> AuthenticationManager的其中一个实现是ProviderManager,它负责把身份验证的工作委托给一个或多个Provider(认证提供者). Provider都是实现AuthenticationProvider接口,该接口有两个方法authenticate()和support(). authenticate()方法会尝试验证用户身份,若验证成功则返回一个Authentication对象,否则抛出一个 AuthenticationException. support()方法会评估当前Authentication对象是否适合这个Provider来进行进一步的处理,而不是指已经通过. Provir有多个实现.例如daoAuthenticationProvider,anonymousAuthenticationProvider,rememberMeAuthenticationProvider. 1.15添加daoAuthenticationProvide: <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="userDetailsService"/> <property name="userCache" ref="userCache"/> <property name="passwordEncoder" ref="passwordEncoder"/> </bean> daoAuthenticationProvider负责提供用户信息,包括用户名和密码。其中取用户名密码的工作就交给 userDetailsService来做。通过userCache来缓存用户信息,减少查询数据库次数。用passwordEncoder来使用加密密码。userDetailsService的接口实现有jdbcDaoImpl和inMemoryDaoImpl。jdbcDaoImpl通过数据库获取用户名和密码,而inMemoryDaoImpl则只是通过xml定义的方式来获取。 userCache的接口实现有EhCacheBasedUserCache和NullUserCache。NullUserCache实际上就是不进行缓存。EhCacheBasedUserCache是基于ehcache的开源缓存项目来实现的。 passwordEncoder是使用加密器对用户输入的明文进行加密。Acegi提供了三种加密器: PlaintextPasswordEncoder---默认,不加密,返回明文. ShaPasswordEncoder---哈希算法(SHA)加密 d5PasswordEncoder---消息摘要(MD5)加密 1.16添加userCache: <bean name="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache"> <property name="cache"> <bean class="org.springframework.cache.ehcache.EhCacheFactoryBean" autowire="byName"> <property name="cacheManager" ref="cacheManager"/> <property name="cacheName" value="userCache"/> </bean> </property> </bean> 1.17添加cacheManager: <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation"> <value>classpath:org/springside/bookstoredemo/components/acegi/ehcache.xml</value> </property> </bean> 1.18添加bookstoredemo/arc/java/org/springside/bookstoredemo/components/acegi/ehcache.xml,内容参照源代码。 1.19添加passwordEncoder: <!-- 使用Md5算法加密 --> <bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"/> 1.20添加filterDefinitionSource <bean id="filterDefinitionSource" class="org.springside.bookstoredemo.components.acegi.intercept.web.DBFilterInvocationDefinitionSource"> <property name="convertUrlToLowercaseBeforeComparison" value="true"/> <property name="useAntPath" value="true"/> <property name="acegiCacheManager" ref="acegiCacheManager"/> </bean> 1.21添加 org.springside.bookstoredemo.components.acegi.domain.Resource; org.springside.bookstoredemo.components.acegi.domain.Role; org.springside.bookstoredemo.components.acegi.domain.User; org.springside.bookstoredemo.components.acegi.resourcedetails.Resourceimport org.springside.bookstoredemo.components.acegi.Constants; org.springside.bookstoredemo.components.acegi.resourcedetails.ResourceCache; org.springside.bookstoredemo.components.acegi.cache.AcegiCacheManager; org.springside.bookstoredemo.components.acegi.resourcedetails.ResourceDetails; org.springside.bookstoredemo.components.acegi.intercept.web.DBFilterInvocationDefinitionSource.java; 添加 org.springside.bookstoredemo.components.acegi.domain.hbm.Resource.hbm.xml; org.springside.bookstoredemo.components.acegi.domain.hbm.Role.hbm.xml; org.springside.bookstoredemo.components.acegi.domain.hbm.Role.hbm.xml; 这几个文件稍稍改下class的映射地址 在dataAccessContext-hibernate.xml中合适地方添加 <property name="mappingDirectoryLocations"> <list> <value> classpath*:/org/springside/bookstoredemo/components/acegi/domain/hbm/ </value> </list> </property> 1.22添加acegiCacheManager <bean id="acegiCacheManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="false" autowire="byName"> <property name="transactionManager" ref="transactionManager"/> <property name="proxyTargetClass" value="true"/> <property name="target"> <bean class="org.springside.bookstoredemo.components.acegi.cache.AcegiCacheManagerImpl"> <property name="resourceCache" ref="resourceCache"></property> <property name="userCache" ref="userCache"></property> <property name="sessionFactory" ref="sessionFactory"></property> </bean> </property> <property name="transactionAttributes"> <props> <prop key="modify*">PROPAGATION_REQUIRED</prop> <prop key="auth*">PROPAGATION_REQUIRED</prop> <prop key="init*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="refresh*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> 1.23添加resourceCache <!-- 自建一个resourceCache以存放resource对应的role关系 --> <!-- resource缓存实际执行对象 --> <bean id="resourceCache" class="org.springside.bookstoredemo.components.acegi.resourcedetails.ResourceCache" autowire="byName"> <property name="cache"> <bean id="resourceCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheManager" ref="cacheManager"/> <property name="cacheName" value="resourceCache"/> </bean> </property> </bean> 1.24添加loggerListener <!-- This bean is optional; it isn't used by any other bean as it only listens and logs --> <bean id="loggerListener" class="org.acegisecurity.event.authentication.LoggerListener"/> 1.25打开浏览器,输入http://localhost:8080/bookstoredemo/admin/,提示404错误。我们在webapp 目录下新建文件acegilogin.jsp,并把bookstore例子中的文件内容拷贝过来,再访问http://localhost: 8080/bookstoredemo/admin/,会打开acegilogin,jsp页面,这个页面用来供用户登录。我们先看看Acegi是如何转到这个登录页面的:首先浏览器发送http://localhost:8080/bookstoredemo/admin/请求,调用 httpSessionContextIntegrationFilter,从HttpSession中获取Authentication对象,然后把 Authentication存于一个新的ContextHolder对象。因为没有Authentication信息,Acegi转到异常处理 Filter(1.10声明),并转向到loginFormUrl。 1.26登录失败的流程 1.26.1用户不存在 用户输入错误的用户名或密码,Acegi会转到表单认证Filter(1.6中声明),转向到authenticationFailureUrl; 1.26.2用户没有权限 用户登录信息正确,Acegi通过系列数据库查询,会得出用户没有任何权限,Acegi会通过/j_acegi_security_check自动转向到/accessDenied.jsp。 1.26登录成功的流程 用户登录信息正确,Acegi通过系列数据库查询,得到用户admin对/admin/下的所有请求都有权限(可以自行分析数据库的数据)。Acegi转到表单认证,转向到defaultTargetUrl。 1.27登出流程 用户登出,如果没有声明注销处理Filter(1.5中声明),会清除登录信息,并最终重定向到/j_acegi_logout上,而如果声明了注销处理,则重定向到constructor-arg的Value上 1.28需要注意的几点 登录用户名和密码必须是j_username,j_password;/j_acegi_logout;/j_acegi_security_check. 另外,还有几个重要的拦截器和组件: 1.29 <bean id="securityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor"> <property name="validateConfigAttributes"> <value>false</value> </property> <property name="authenticationManager"> <ref local="authenticationManager" /> </property> <property name="accessDecisionManager"> <ref local="accessDecisionManager" /> </property> <property name="runAsManager"> <ref local="runAsManager" /> </property> <property name="objectDefinitionSource"> <value> sample.contact.ContactManager.create=ROLE_USER sample.contact.ContactManager.getAllRecipients=ROLE_ADMIN </value> </property> </bean> MethodSecurityInterceptor实现了org.aopalliance.intercept.MethodInterceptor接口.在方法被调用之前,拦截器会先调用AuthenticationManager判断用户身份是否已验证,然后从 objectDefinitionSource中获取方法所应用的权限,再调用AccessDecisionManager来匹配用户权限和方法对应的权限.如果用户没有足够权限调用当前方法,则抛出AccessDeniedException是方法不能被调用.调用runAsManager,使在调用方法前动态改变authentication中获取用户权限. 1.30 <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="proxyTargetClass" value="true" /> <property name="interceptorNames"> <list> <idref local="securityInterceptor" /> </list> </property> <property name="beanNames"> <list> <idref bean="userManager"/> <idref bean="roleManager"/> <idref bean="rescManager"/> </list> </property> </bean> 1.31 BeanNameAutoProxyCreator 设置AOP代理的最简单方法就是用Spring的BeanNameAutoProxyCreator.在BeanNameAutoProxyCreator中选出你所需要的interceptor,和列出你所需要保护的Bean. <bean id="accessDecisionManager" class="org.acegisecurity.vote.UnanimousBased"> <property name="allowIfAllAbstainDecisions"> <value>false</value> </property> <property name="decisionVoters"> <list> <ref local="roleVoter" /> </list> </property> </bean> |
相关推荐
acegi配置文件清单
被解剖的acegi配置文件. 博文链接:https://rmn190.iteye.com/blog/175041
Acegi配置.mhtAcegi配置的相关配置的信息在里面有一些
在 Acegi 配置指南中,我们主要关注如何设置和配置 Acegi 框架来保护 Web 应用程序的安全。 首先,我们需要在 `web.xml` 文件中配置 Acegi 的过滤器。在示例代码中,定义了一个名为 `Acegi Filter Chain Proxy` 的...
例如,为了配置认证管理器,我们可以创建一个`UserDetailsService`实现,然后在Acegi配置中引用它: ```xml <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"> ...
4. **XML配置转换**:在传统的Acegi配置中,安全规则通常写在XML配置文件中。这个资源可能包含了将这些静态XML配置转换为动态数据库配置的方法,这样可以更方便地根据用户角色和权限来调整安全策略。 5. **过滤器与...
- "aopacegi"可能是一个包含Acegi与AOP相关配置或实现的文件,可能涉及切面的定义和安全策略的配置。 Acegi Security在过去的开发实践中扮演了重要角色,它的设计理念和实现方式对后来的安全框架产生了深远影响。...
在配置Acegi时,首先需要在`web.xml`文件中定义一个名为`Acegi Filter Chain Proxy`的过滤器。这个过滤器是Acegi安全机制的核心,它负责拦截所有请求并根据配置执行相应的安全策略。下面是一段典型的`web.xml`配置...
在本实例中,我们将探讨Acegi Security的配置、详细设置以及如何通过代码实现其功能。 首先,让我们理解Acegi Security的核心概念。该框架提供了一种基于角色的访问控制(RBAC)机制,允许开发人员定义用户权限并...
Acegi是一个专门为SpringFramework应用提供安全机制的开放源代码项目,全称为Acegi Security System for ...通过这个例子详细介绍如何配置Acegi的各个组件,同时介绍如何扩展Acegi 使其能够从数据库中读取配置信息。
### Acegi的详细配置实现 #### 一、整体架构概览 **Acegi Security** 是一个为Spring框架设计的安全管理工具,它提供了丰富的安全服务,包括认证(Authentication)、授权(Authorization)以及会话管理(Session ...
在《实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf》中,可能会详细讲解如何配置和使用Acegi。以下是一些关键步骤: 1. **添加依赖**:首先,在项目中引入Acegi的依赖库,通常是通过Maven或...
在Spring Acegi中,安全配置通常通过XML配置文件完成,但也可以使用注解进行简化。配置包括定义访问控制规则、配置认证和授权策略,以及设置安全过滤器链。 例如,以下是一个简单的XML配置示例,定义了一个URL访问...
1. **Acegi例子代码**:这个例子代码可能包含了一个简单的Spring应用,演示了如何配置和使用Acegi进行安全控制。通过运行此示例,你可以了解Acegi的配置过程以及如何在实际应用中集成。 2. **学习网址**:提供了一...
Acegi Security允许高度自定义的授权规则,可以基于角色、权限或复杂的业务逻辑进行配置。 Acegi Security的优势在于其灵活性和可扩展性,它不仅能够与Spring框架无缝集成,还能够适应各种各样的认证需求,无论是...
jar包 博文链接:https://fengzgxing.iteye.com/blog/248761
5. **AcegiExample**:这可能是项目的主要代码或配置文件,包含Acegi的配置示例,例如自定义的`AuthenticationProvider`实现,或者展示了如何定义访问控制策略的XML配置。 6. **jar.GIF 和 result.GIF**:这些可能...