??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲男人的天堂久久精品,7777久久亚洲中文字幕蜜桃 ,1区1区3区4区产品亚洲http://www.tkk7.com/kingwell/category/8833.htmlAspire to Professionalismzh-cnFri, 02 Mar 2007 06:56:39 GMTFri, 02 Mar 2007 06:56:39 GMT60Acegi?/title><link>http://www.tkk7.com/kingwell/articles/52539.html</link><dc:creator>KingWell</dc:creator><author>KingWell</author><pubDate>Tue, 13 Jun 2006 10:01:00 GMT</pubDate><guid>http://www.tkk7.com/kingwell/articles/52539.html</guid><wfw:comment>http://www.tkk7.com/kingwell/comments/52539.html</wfw:comment><comments>http://www.tkk7.com/kingwell/articles/52539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kingwell/comments/commentRss/52539.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kingwell/services/trackbacks/52539.html</trackback:ping><description><![CDATA[ <h4>摘要:</h4>Acegi安全pȝQ是一个用于Spring Framework的安全框Ӟ能够和目前流行的Web容器无缝集成。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean ContextQ拦截器和面向接口的~程方式。因此,Acegi安全pȝ能够L地适用于复杂的安全需求?br /><br />           Acegi安全pȝQ是一个用于Spring Framework的安全框Ӟ能够和目前流行的Web容器无缝集成。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean ContextQ拦截器和面向接口的~程方式。因此,Acegi安全pȝ能够L地适用于复杂的安全需求?br />       安全涉及C个不同的概念Q认证和授权。前者是关于认用户是否实是他们所宣称的n份。授权则是关于确认用h否有允许执行一个特定的操作?br />       在Acegi安全pȝ中,需要被认证的用Ppȝ或代理称?Principal"。Acegi安全pȝ和其他的安全pȝ不同Q它q没有角色和用户l的概念?br />Acegipȝ设计<br />  关键lg<br />      Acegi安全pȝ包含以下七个关键的功能组Ӟ<br />        1 Authentication对象Q包含了PrincipalQCredential和Principal的授权信息。同时还可以包含关于发v认证h的客L其他信息Q如IP地址?br />        2 ContextHolder对象Q用ThreadLocal储存Authentication对象的地斏V?br />        3 AuthenticationManagerQ用于认证ContextHolder中的Authentication对象?br />        4 AccessDecissionManagerQ用于授权一个特定的操作?br />        5 RunAsManagerQ当执行特定的操作时Q用于选择性地替换Authentication对象?br />        6 Secure Object拦截器,用于协调AuthenticationManagerQAccessDecissionManagerQRunAsManager和特定操作的执行?br />        7 ObjectDefinitionSourceQ包含了特定操作的授权定义?br />      q七个关键的功能lg的关pd下图所C(图中灰色部分是关键组ӞQ?br /><br /><br /><b>安全理对象</b><br />       Acegi安全pȝ目前支持两类安全理对象?br />       W一cȝ安全理对象理AOP Alliance的MethodInvocationQ开发h员可以用它来保护Spring容器中的业务对象。ؓ了Spring理的Bean可以作ؓ MethodInvocation来用,Bean可以通过ProxyFactoryBean和BeanNameAutoProxyCreator来管理,像在Spring的事务管理一样用?br />       W二cLFilterInvocation。它用过滤器QFilterQ来创徏Qƈ单地包装了HTTP的ServletRequestQ?ServletResponse和FilterChain。FilterInvocation可以用来保护HTTP资源。通常Q开发h员ƈ不需要了解它的工作机Ӟ因ؓ他们只需要将Filter加入web.xmlQAcegi安全pȝ可以工作了?br /><br /><b>安全配置参数</b><br />       每个安全理对象都可以描q数量不限的各种安全认证h。例如,MethodInvocation对象可以描述带有L参数的Q意方法的调用Q而FilterInvocation可以描述L的HTTP URL?br />       Acegi安全pȝ需要记录应用于每个认证h的安全配|参数。例如,对于BankManager.getBalanceQint accountNumberQ方法和BankManager.approveLoanQint applicationNumberQ方法,它们需要的认证h的安全配|很不相同?br />       Z保存不同的认证请求的安全配置Q需要用配|参数。从实现的视角来看,配置参数使用ConfigAttribute接口来表C。Acegi安全pȝ提供了ConfigAttribute接口的一个实玎ͼSecurityConfigQ它把配|参C存ؓ一个字W串?br />       ConfigAttributeDefinitioncLConfigAttribute对象的一个简单的容器Q它保存了和特定h相关的ConfigAttribute的集合?br />       当安全拦截器收到一个安全认证请求时Q需要决定应用哪一个配|参数。换句话_它需要找出应用于q个h?ConfigAttributeDefinition对象。这个查扄q程是由ObjectDefinitionSource接口来处理的。这个接口的主要Ҏ是public ConfigAttributeDefinition getAttributes(Object object)Q其中Object参数是一个安全管理对象。因为安全管理对象包含有认证h的详l信息,所?ObjectDefinitionSource接口的实现类可以从中获得所需的详l信息,以查扄关的ConfigAttributeDefiniton 对象?br /><br /><br /><b>Acegi如何工作</b><br />       Z说明Acegi安全pȝ如何工作Q我们设想一个用Acegi的例子。通常Q一个安全系l需要发挥作用,它必d成以下的工作Q?br />      1 首先Q系l从客户端请求中获得Principal和CredentialQ?br />      2 然后pȝ认证Principal和Credential信息Q?br />      3 如果认证通过Q系l取出Principal的授权信息;<br />      4 接下来,客户端发h作请求;<br />      5 pȝҎ预先配置的参数检查Principal对于该操作的授权Q?br />      6 如果授权查通过则执行操作,否则拒绝?br />      那么QAcegi安全pȝ是如何完成这些工作的呢?首先Q我们来看看Acegi安全pȝ的认证和授权的相关类Q?<br />       安全拦截器的抽象基类Q它包含有两个管理类QAuthenticationManager和AccessDecisionManager?AuthenticationManager用于认证ContextHolder中的Authentication对象Q包含了PrincipalQ?Credential和Principal的授权信息)QAccessDecissionManager则用于授权一个特定的操作?br /><br />      下面来看一个MethodSecurityInterceptor的例子:<br /><pre class="overflow">      <bean id="bankManagerSecurity" <br />                class="net.sf.acegisecurity.intercept.method.MethodSecurityInterceptor"><br />             <property name="validateConfigAttributes"><br />                    <value>true</value><br />            </property><br />            <property name="authenticationManager"><br />                   <ref bean="authenticationManager"/><br />            </property><br />            <property name="accessDecisionManager"><br />                  <ref bean="accessDecisionManager"/><br />            </property><br />            <property name="objectDefinitionSource"><br />                  <value><br />                     net.sf.acegisecurity.context.BankManager.delete*=<br />                             ROLE_SUPERVISOR,RUN_AS_SERVER<br />                     net.sf.acegisecurity.context.BankManager.getBalance=<br />                             ROLE_TELLER,ROLE_SUPERVISOR,BANKSECURITY_CUSTOMER,RUN_<br />                  </value><br />            </property><br />      </bean> </pre><br />       上面的配|文件中QMethodSecurityInterceptor是AbstractSecurityInterceptor的一个实现类。它包含了两个管理器QauthenticationManager和accessDecisionManager。这两者的配置如下Q?br />      <pre class="overflow"><bean id="authenticationDao" class="net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl"><br />               <property name="dataSource"><ref bean="dataSource"/></property><br />      </bean><br />      <bean id="daoAuthenticationProvider" <br />                     class="net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider"><br />               <property name="authenticationDao"><ref bean="authenticationDao"/></property><br />      </bean><br />      <bean id="authenticationManager" class="net.sf.acegisecurity.providers.ProviderManager"><br />               <property name="providers"><br />                      <list><ref bean="daoAuthenticationProvider"/></list><br />               </property><br />      </bean><br />      <bean id="roleVoter" class="net.sf.acegisecurity.vote.RoleVoter"/><br />      <bean id="accessDecisionManager" class="net.sf.acegisecurity.vote.AffirmativeBased"><br />               <property name="allowIfAllAbstainDecisions"><value>false</value></property><br />               <property name="decisionVoters"><br />                      <list><ref bean="roleVoter"/></list><br />               </property><br />      </bean></pre><br /><br />       准备工作做好了,现在我们来看看Acegi安全pȝ是如何实现认证和授权机制的。以使用HTTP BASIC认证的应用ؓ例子Q它包括下面的步骤:<br />       1. 用户dpȝQAcegi从acegisecurity.ui子系l的安全拦截器(如BasicProcessingFilterQ中得到用户的登录信息(包括Principal和CredentialQƈ攑օAuthentication对象Qƈ保存在ContextHolder对象中;<br />       2. 安全拦截器将Authentication对象交给AuthenticationManagerq行w䆾认证Q如果认证通过Q返回带有Principal 授权信息的Authentication对象。此时ContextHolder对象的Authentication对象已拥有Principal的详l信息;<br />       3. 用户d成功后,l箋q行业务操作Q?br />       4. 安全拦截器(bankManagerSecurityQ收到客L操作h后,操作请求的数据包装成安全管理对象(FilterInvocation或MethodInvocation对象Q;<br />       5. 然后Q从配置文gQObjectDefinitionSourceQ中d相关的安全配|参数ConfigAttributeDefinitionQ?br />       6. 接着Q安全拦截器取出ContextHolder中的Authentication对象Q把它传递给AuthenticationManagerq行w䆾认证Qƈ用返回值更新ContextHolder的Authentication对象Q?br />       7. Authentication对象QConfigAttributeDefinition对象和安全管理对象(secure ObjectQ交lAccessDecisionManagerQ检查Principal的操作授权;<br />       8. 如果授权查通过则执行客Lh的操作,否则拒绝Q?br /><br /><b>AccessDecisionVoter</b><br />       注意上节的accessDecisionManager是一个AffirmativeBasedc,它对于用h权的投票{略是,只要通过其中的一个授权投检查,卛_通过Q它的allowIfAllAbstainDecisions属性值是falseQ意思是如果所有的授权投票是都是弃权,则通不q授权检查?br />       Acegi安全pȝ包括了几个基于投策略的AccessDecisionManagerQ上节的RoleVoter是其中的一个投策略实玎ͼ它是 AccessDecisionVoter的一个子cRAccessDecisionVoter的具体实现类通过投票来进行授权决{, AccessDecisionManager则根据投结果来军_是通过授权查,q是抛出AccessDeniedException例外?br />       AccessDecisionVoter接口共有三个ҎQ?br />public int vote(Authentication authentication, Object object, ConfigAttributeDefinition config);<br />public boolean supports(ConfigAttribute attribute);<br />public boolean supports(Class clazz);<br />       其中的voteҎq回intq回|它们是AccessDecisionVoter的三个静态成员属性:ACCESS_ABSTAIN,QACCESS_DENIED和ACCESS_GRANTEDQ它们分别是弃权Q否军_赞成?br />       Acegi安全pȝ中,使用投票{略的AccessDecisionManager共有三个具体实现c:AffirmativeBased?ConsensusBased和UnanimousBased。它们的投票{略是,AffirmativeBasedcd需有一个投赞成即可通过Q?ConsensusBasedc需要大多数投票赞成卛_通过Q而UnanimousBasedc需要所有的投票赞成才能通过?br />       RoleVotercL一个Acegi安全pȝAccessDecisionVoter接口的实现。如果ConfigAttribute以ROLE_开_RoleVoter则进行投。如果GrantedAuthority的getAutorityҎ的Stringq回值匹配一个或多个以ROLE_ 开头的ConfigAttributeQ则投票通过Q否则不通过。如果没有以ROLE_开头的ConfigAttributeQRoleVoter则弃权?br /><br /><b>安全拦截?/b><br />  拦截器如何工?br />  MethodInvocation拦截?br />  FilterInvocation拦截?br />认证<br />  认证h<br />  认证理?br />  Authentication Provider<br />授权<br />  Access Decision Manager<br />  Voting Decision Manager<br />  授权理推荐<br />ContextHolder的用h?br />  用户接口目标<br />  HTTP会话认证<br />  HTTP Basic认证<br /><br />1、Log4j的概?br />   Log4j中有三个主要的组Ӟ它们分别是Logger、Appender和LayoutQLog4j 允许开发h员定义多个LoggerQ每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关pR有一个LoggerUCؓRootQ它永远存在Q且不能通过名字索或引用Q可以通过Logger.getRootLogger()Ҏ获得Q其它Logger通过 Logger.getLogger(String name)Ҏ?br />   Appender则是用来指明所有的log信息存放C么地方,Log4j中支持多UappenderQ如 console、files、GUI components、NT Event Loggers{,一个Logger可以拥有多个AppenderQ也是你既可以Log信息输出到屏q,同时存储C个文件中?br />   Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息?br />   Log4j中将要输出的Log信息定义?U别,依次为DEBUG、INFO、WARN、ERROR和FATALQ当输出Ӟ只有U别高过配置中规定的U别的信息才能真正的输出Q这样就很方便的来配|不同情况下要输出的内容Q而不需要更改代码,q点实在是方便啊?br /><br />2、Log4j的配|文?br />   虽然可以不用配置文gQ而在E序中实现配|,但这U方法在如今的系l开发中昄是不可取的,能采用配|文件的地方一定一定要用配|文件。Log4j支持两种格式的配|文ӞXML格式和Java的property格式Q本人更喜欢后者,首先看一个简单的例子吧,如下Q?br /><br /><pre class="overflow"> log4j.rootLogger=debug, stdout, R<br />  log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />  log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br /><br />  # Pattern to output the caller's file name and line number.<br />  log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n<br /><br />  log4j.appender.R=org.apache.log4j.RollingFileAppender<br />  log4j.appender.R.File=example.log<br />  log4j.appender.R.MaxFileSize=100KB<br /><br />  # Keep one backup file<br />  log4j.appender.R.MaxBackupIndex=1<br /><br />  log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />  log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n</pre>         <br /><br />   首先Q是讄rootQ格式ؓ log4j.rootLogger=[level],appenderName, ...Q其中level是讄需要输Z息的U别Q后面是appender的输出的目的圎ͼappenderName是指定日志信息输出到哪个地斏V您可以同时指定多个输出目的地。配|日志信息输出目的地AppenderQ其语法?br />  log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />  log4j.appender.appenderName.option1 = value1<br />  ...<br />  log4j.appender.appenderName.option = valueN<br />Log4j提供的appender有以下几U:<br />  org.apache.log4j.ConsoleAppenderQ控制台Q?br />  org.apache.log4j.FileAppenderQ文Ӟ<br />  org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文Ӟ<br />  org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生新文gQ?br />  org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)<br />配置日志信息的格式(布局Q,其语法ؓQ?br />  log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />  log4j.appender.appenderName.layout.option1 = value1<br />  ....<br />  log4j.appender.appenderName.layout.option = valueN<br />Log4j提供的layout有以下几U:<br />  org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,<br />  org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,<br />  org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,<br />  org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息) <br /><br />3、Log4j在程序中的?br />   要在自己的类中用Log4jQ首先声明一个静态变量Logger logger=Logger.getLog("classname")Q在使用之前Q用PropertyConfigurator.configure ("配置文g")配置一下,现在可以用了Q用法如下:logger.debug("debug message")或者logger.info("info message")Q看下面一个小例子Q?br /><br /><pre class="overflow"> import com.foo.Bar;<br />  import org.apache.log4j.Logger;<br />  import org.apache.log4j.PropertyConfigurator;<br />  public class MyApp {<br />    static Logger logger = Logger.getLogger(MyApp.class.getName());<br />    public static void main(String[] args) {<br />      // BasicConfigurator replaced with PropertyConfigurator.<br />      PropertyConfigurator.configure(args[0]);<br />      logger.info("Entering application.");<br />      Bar bar = new Bar();<br />      bar.doIt();<br />      logger.info("Exiting application.");<br />    }<br />  }</pre><br /><br /><br />[介]<br /><br />对于一个典型的Web应用Q完善的认证和授权机制是必不可少的,在SpringFramework中,Juergen Hoeller提供的范例JPetStorel了一些这斚w的介l,但还q远不够QAcegi是一个专门ؓSpringFramework提供安全机制的项目,全称为Acegi Security System for SpringQ当前版本ؓ0.5.1Q就其目前提供的功能Q应该可以满绝大多数应用的需求?br /><br />本文的主要目的是希望能够说明如何在基于Spring构架的Web应用中用AcegiQ而不是详l介l其中的每个接口、每个类。注意,即对已l存在的Spring应用Q通过下面介绍的步骤,也可以马上n受到Acegi提供的认证和授权?br /><br />[基础工作]<br />在你的Web应用的lib中添加Acegi下蝲包中的acegi-security.jar<br /><br />[web.xml]<br />实现认证和授权的最常用的方法是通过filterQAcegi亦是如此Q通常Acegi需要在web.xmld以下5个filter:<br /><br /><pre class="overflow"><filter><br />  <filter-name>Acegi Channel Processing Filter</filter-name><br />  <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class><br />  <init-param><br />    <param-name>targetClass</param-name><br />    <param-value>net.sf.acegisecurity.securechannel.ChannelProcessingFilter</param-value><br />  </init-param><br /></filter><br /><filter><br />  <filter-name>Acegi Authentication Processing Filter</filter-name><br />  <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class><br />  <init-param><br />    <param-name>targetClass</param-name><br />    <param-value>net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter</param-value><br />  </init-param><br /></filter><br /><filter><br />  <filter-name>Acegi HTTP BASIC Authorization Filter</filter-name><br />  <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class><br />  <init-param><br />    <param-name>targetClass</param-name><br />    <param-value>net.sf.acegisecurity.ui.basicauth.BasicProcessingFilter</param-value><br />  </init-param><br /></filter><br /><filter><br />  <filter-name>Acegi Security System for Spring Auto Integration Filter</filter-name><br />  <filter-class>net.sf.acegisecurity.ui.AutoIntegrationFilter</filter-class><br /></filter><br /><filter><br />  <filter-name>Acegi HTTP Request Security Filter</filter-name><br />  <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class><br />  <init-param><br />    <param-name>targetClass</param-name><br />    <param-value>net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter</param-value><br />  </init-param><br /></filter></pre><br /><br />最先引赯惑的是net.sf.acegisecurity.util.FilterToBeanProxyQAcegi自己的文上解释是: “What  FilterToBeanProxy does is delegate the Filter's methods through to a bean which is obtained from the <br />Spring application context. This enables the bean to benefit from the Spring application context lifecycle support and configuration flexibility.”,如希望深I的话,ȝ看源代码应该不难理解?br /><br />再下来就是添加filter-mapping了:<br /><pre class="overflow"><filter-mapping><br />  <filter-name>Acegi Channel Processing Filter</filter-name><br />  <url-pattern>/*</url-pattern><br /></filter-mapping><br /><filter-mapping><br />  <filter-name>Acegi Authentication Processing Filter</filter-name><br />  <url-pattern>/*</url-pattern><br /></filter-mapping><br /><filter-mapping><br />  <filter-name>Acegi HTTP BASIC Authorization Filter</filter-name><br />  <url-pattern>/*</url-pattern><br /></filter-mapping><br /><filter-mapping><br />  <filter-name>Acegi Security System for Spring Auto Integration Filter</filter-name><br />  <url-pattern>/*</url-pattern><br /></filter-mapping><br /><filter-mapping><br />  <filter-name>Acegi HTTP Request Security Filter</filter-name><br />  <url-pattern>/*</url-pattern><br /></filter-mapping></pre><br /><br />q里Q需要注意以下两点:<br />1) q几个filter的顺序是不能更改的,序不对无法正常工作;<br />2) 如果你的应用不需要安全传输,如httpsQ则?Acegi Channel Processing Filter"相关内容注释掉即可;<br />3) 如果你的应用不需要Spring提供的远E访问机Ӟ如Hessian and BurlapQ将"Acegi HTTP BASIC Authorization <br />Filter"相关内容注释掉即可?br /><br />[applicationContext.xml]<br />接下来就是要dapplicationContext.xml中的内容了,从刚才FilterToBeanFactory的解释可以看出,真正的filter?br />在Spring的applicationContext中管理:<br /><br />1) 首先Q你的数据库中必d有保存用户名和密码的tableQAcegi要求table的schema必须如下Q?br /><br /><pre class="overflow">CREATE TABLE users (<br />    username VARCHAR(50) NOT NULL PRIMARY KEY,<br />    password VARCHAR(50) NOT NULL,<br />    enabled BIT NOT NULL<br />);<br />CREATE TABLE authorities (<br />    username VARCHAR(50) NOT NULL,<br />    authority VARCHAR(50) NOT NULL<br />);<br />CREATE UNIQUE INDEX ix_auth_username ON authorities ( username, authority );<br />ALTER TABLE authorities ADD CONSTRAINT fk_authorities_users <br />      foreign key (username) REFERENCES users<br />(username);</pre><br /><br />2) d讉K你的数据库的datasource和Acegi的jdbcDaoQ如下:<br /><br /><pre class="overflow"><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><br />  <property name="driverClassName"><value>${jdbc.driverClassName}</value></property><br />  <property name="url"><value>${jdbc.url}</value></property><br />  <property name="username"><value>${jdbc.username}</value></property><br />  <property name="password"><value>${jdbc.password}</value></property><br /></bean><br /><bean id="jdbcDaoImpl" class="net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl"><br />  <property name="dataSource"><ref bean="dataSource"/></property><br /></bean></pre><br /><br />3) dDaoAuthenticationProvider:<br /><br /><pre class="overflow"><bean id="daoAuthenticationProvider" <br />   class="net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider"><br />  <property name="authenticationDao"><ref bean="authenticationDao"/></property><br />  <property name="userCache"><ref bean="userCache"/></property><br /></bean><br /><br /><bean id="userCache" class="net.sf.acegisecurity.providers.dao.cache.EhCacheBasedUserCache"><br />  <property name="minutesToIdle"><value>5</value></property><br /></bean></pre><br /><br />如果你需要对密码加密Q则在daoAuthenticationProvider中加入:<property name="passwordEncoder"><ref <br />bean="passwordEncoder"/></property>QAcegi提供了几U加密方法,详细情况可看?br />net.sf.acegisecurity.providers.encoding<br /><br />4) dauthenticationManager:<br /><br /><pre class="overflow"><bean id="authenticationManager" class="net.sf.acegisecurity.providers.ProviderManager"><br />  <property name="providers"><br />    <list><br />      <ref bean="daoAuthenticationProvider"/><br />    </list><br />   </property><br /></bean></pre><br /><br />5) daccessDecisionManager:<br /><br /><pre class="overflow"><bean id="accessDecisionManager" class="net.sf.acegisecurity.vote.AffirmativeBased"><br />  <property name="allowIfAllAbstainDecisions"><br />    <value>false</value><br />  </property><br />  <property name="decisionVoters"><br />    <list><ref bean="roleVoter"/></list><br />  </property><br /></bean><br /><bean id="roleVoter" class="net.sf.acegisecurity.vote.RoleVoter"/></pre><br /><br />6) dauthenticationProcessingFilterEntryPoint:<br /><br /><pre class="overflow"><bean id="authenticationProcessingFilterEntryPoint" <br />class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"><br />  <property name="loginFormUrl"><value>/acegilogin.jsp</value></property><br />  <property name="forceHttps"><value>false</value></property><br /></bean></pre><br /><br />其中acegilogin.jsp是登陆页面,一个最单的d面如下Q?br /><br /><pre class="overflow"><%@ taglib prefix='c' uri='http://java.sun.com/jstl/core' %><br /><%@ page import="net.sf.acegisecurity.ui.AbstractProcessingFilter" %><br /><%@ page import="net.sf.acegisecurity.AuthenticationException" %><br /><html><br />  <head><br />    <title>Login</title><br />  </head><br /><br />  <body><br />    <h1>Login</h1><br />    <form action="<c:url value='j_acegi_security_check'/>" method="POST"><br />      <table><br />        <tr><td>User:</td><td><input type='text' name='j_username'></td></tr><br />        <tr><td>Password:</td><td><input type='password' name='j_password'></td></tr><br />        <tr><td colspan='2'><input name="submit" type="submit"></td></tr><br />        <tr><td colspan='2'><input name="reset" type="reset"></td></tr><br />      </table><br />    </form><br />  </body><br /></html></pre><br /><br />7) dfilterInvocationInterceptor:<br /><br /><pre class="overflow"><bean id="filterInvocationInterceptor" <br />class="net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor"><br />  <property name="authenticationManager"><br />    <ref bean="authenticationManager"/><br />  </property><br />  <property name="accessDecisionManager"><br />    <ref bean="accessDecisionManager"/><br />  </property><br />  <property name="objectDefinitionSource"><br />    <value><br />      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<br />      \A/sec/administrator.*\Z=ROLE_SUPERVISOR<br />      \A/sec/user.*\Z=ROLE_TELLER<br />    </value><br />  </property><br /></bean></pre><br /><br />q里h意,要objectDefinitionSource中定义哪些页面需要权限访问,需要根据自q应用需求进行修改,我上面给?br />的定义的意思是q样的:<br />a. CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON意思是在比较请求\径时全部转换为小?br />b. \A/sec/administrator.*\Z=ROLE_SUPERVISOR意思是只有权限为ROLE_SUPERVISOR才能讉K/sec/administrator*的页?br />c. \A/sec/user.*\Z=ROLE_TELLER意思是只有权限为ROLE_TELLER的用h能访?sec/user*的页?br /><br />8) dsecurityEnforcementFilter:<br /><br /><pre class="overflow"><bean id="securityEnforcementFilter" <br />      class="net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter"><br />  <property name="filterSecurityInterceptor"><br />    <ref bean="filterInvocationInterceptor"/><br />  </property><br />  <property name="authenticationEntryPoint"><br />    <ref bean="authenticationProcessingFilterEntryPoint"/><br />  </property><br /></bean></pre><br /><br />9) dauthenticationProcessingFilter:<br /><br /><pre class="overflow"><bean id="authenticationProcessingFilter" <br />class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter"><br />  <property name="authenticationManager"><br />    <ref bean="authenticationManager"/><br />  </property><br />  <property name="authenticationFailureUrl"><br />    <value>/loginerror.jsp</value><br />  </property><br />  <property name="defaultTargetUrl"><br />    <value>/</value><br />  </property><br />  <property name="filterProcessesUrl"><br />    <value>/j_acegi_security_check</value><br />  </property><br /></bean></pre><br />其中authenticationFailureUrl是认证失败的面?br /><br />10) 如果需要一些页面通过安全通道的话Q添加下面的配置:<br /><br /><pre class="overflow"><bean id="channelProcessingFilter" <br />      class="net.sf.acegisecurity.securechannel.ChannelProcessingFilter"><br />  <property name="channelDecisionManager"><br />    <ref bean="channelDecisionManager"/><br />  </property><br />  <property name="filterInvocationDefinitionSource"><br />    <value><br />      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<br />      \A/sec/administrator.*\Z=REQUIRES_SECURE_CHANNEL<br />      \A/acegilogin.jsp.*\Z=REQUIRES_SECURE_CHANNEL<br />      \A/j_acegi_security_check.*\Z=REQUIRES_SECURE_CHANNEL<br />      \A.*\Z=REQUIRES_INSECURE_CHANNEL<br />    </value><br />  </property><br /></bean><br /><br /><bean id="channelDecisionManager" <br />      class="net.sf.acegisecurity.securechannel.ChannelDecisionManagerImpl"><br />  <property name="channelProcessors"><br />    <list><br />      <ref bean="secureChannelProcessor"/><br />      <ref bean="insecureChannelProcessor"/><br />    </list><br />  </property><br /></bean><br /><bean id="secureChannelProcessor" <br />      class="net.sf.acegisecurity.securechannel.SecureChannelProcessor"/><br /><bean id="insecureChannelProcessor" <br />      class="net.sf.acegisecurity.securechannel.InsecureChannelProcessor"/></pre><br /><br />[~少了什么?]<br />Acegi目前提供了两U?secure object"Q分别对面和方法进行安全认证管理,我这里介l的只是利用<br />FilterSecurityInterceptor对访问页面的权限控制Q除此之外,Acegiq提供了另外一个Interceptor―?br />MethodSecurityInterceptorQ它l合runAsManager可实现对对象中的Ҏ的权限控Ӟ使用Ҏ可参看Acegi自带的文?br />和contact范例?br /><br />[最后要说的]<br />本来以ؓ只是说明如何使用Acegi而已Q应该非常简单,但真正写h才发现想要条理清楚的理顺所有需要的beanq是?br />困难的,但愿我没有遗漏太多东西,如果我的文章有什么遗漏或错误的话Q还请参看Acegi自带的quick-start范例Q但?br />注意Q这个范例是不能直接拿来用的?br />分析和学习Spring中的jpetstore用户理 <br />  存在用户的系l,必然需要用Ld和认证,今天通过分析Spring中自带的jpetstore的例子来学习一下如何实现在Spring构架的系l中用户d?br />1、首先从注册用户开始,先看看jpetstore-servlet.xml中关于注册用Lbean定义Q从定义命名中就可以看出下面q段是注册用户的:<br />  <pre class="overflow"><bean name="/shop/newAccount.do" <br />      class="org.springframework.samples.jpetstore.web.spring.AccountFormController"><br />    <property name="petStore"><ref bean="petStore"/></property><br />    <property name="validator"><ref bean="accountValidator"/></property><br />    <property name="successView"><value>index</value></property><br />  </bean></pre><br />1). formView呢?从AccountFormController的构造函C得到Q原来ؓEditAccountFormQ ?br />2). EditoAccountForm.jsp中显得非ؕQ其实没有多难理解的地方,最主要的是q个form既是d新用LQ又是编辑用户信息的Q所以显得有点ؕp糟的?br />2、添加好了新用户Q接下来看看如何dQ在jpetstore-servlet中发现这两个相关bean定义Q如下:<br />  <pre class="overflow"><bean name="/shop/signon.do" <br />      class="org.springframework.samples.jpetstore.web.spring.SignonController"><br />    <property name="petStore"><ref bean="petStore"/></property><br />  </bean><br />  <bean name="/shop/signonForm.do" <br />      class="org.springframework.web.servlet.mvc.ParameterizableViewController"><br />    <property name="viewName"><value>SignonForm</value></property><br />  </bean></pre><br />1). W二个bean是在q行时用戯入用户名和密码的formQ叫做SignonFormQ对于这?ParameterizableViewControllerQ用文里的话说q是最单的ControllerQ其作用是在运行中指向 Controller而不是直接指向jsp文gQ仅此而已?br />2). SignonForm.jspQ里面就是一个简单的formQ其action是W一个beanQ即/shop/signon.doQ最需要注意的?signonForwardActionQ其主要作用是forward到需要输入用户名和密码的那个面上去Q这个变量哪里来的呢Q看看下面:<br />  <pre class="overflow"><bean id="secureHandlerMapping" <br />      class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><br />    <property name="interceptors"><br />      <list><br />        <ref bean="signonInterceptor"/><br />      </list><br />    </property><br />    <property name="urlMap"><br />      <map><br />        <entry key="/shop/editAccount.do"><ref local="secure_editAccount"/></entry><br />        <entry key="/shop/listOrders.do"><ref local="secure_listOrders"/></entry><br />        <entry key="/shop/newOrder.do"><ref local="secure_newOrder"/></entry><br />        <entry key="/shop/viewOrder.do"><ref local="secure_viewOrder"/></entry><br />      </map><br />    </property><br />  </bean></pre><br />   原来Q上面的signonInterceptor实现了preHandleQ因此在h上面的map面Ӟ首先要经q这个InterceptorQ看?SignonInterceptor的源码,原来在其中ؓsignon.jsp赋予一个signonForwardAction对象Q呵呵,ȝ明白了?br />3). 接下来去学习一下SignonControllerQ其M部分中可以看出,首先取出用户输入的username和passwordQ然后到数据库中验证有没有这个用P如果没有q个用户Q返回各错误面Q如果成功,首先生成一个UserSession对象Q在request的session加入q个 userSessionQ注意这部分代码中给ZPagedListHolder分页的简单用方法,关于分页昄Q以后再学习吧?br />3、登录成功后Q就可以Ҏ不同的用戯施不同的行ؓ了,取得用户信息Q无非就是从session取出userSession卛_?br /><br /><a >http://www.javaresearch.org/article/showarticle.jsp?column=33&thread=50953</a><img src ="http://www.tkk7.com/kingwell/aggbug/52539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kingwell/" target="_blank">KingWell</a> 2006-06-13 18:01 <a href="http://www.tkk7.com/kingwell/articles/52539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://930mk.com" target="_blank">ѵȫһ¼</a>| <a href="http://fcw70.com" target="_blank">AVƷһ</a>| <a href="http://zjj100.com" target="_blank">޾ƷëƬ</a>| <a href="http://3hc88.com" target="_blank">Ļ޹˾þþƷ</a>| <a href="http://qulu999.com" target="_blank">ˬָ߳Ƶ</a>| <a href="http://znboxcdn107.com" target="_blank">AVַ߹ۿ</a>| <a href="http://zibochanglong.com" target="_blank">Hվ߹ۿ</a>| <a href="http://wwwby1378.com" target="_blank">ĻӰԺww4164h</a>| <a href="http://56ms.com" target="_blank">Ұѹۿ</a>| <a href="http://hetaoqpj.com" target="_blank">www.ɫվ</a>| <a href="http://zcrencai.com" target="_blank">߹ۿѲ</a>| <a href="http://sh-lkby.com" target="_blank">ĻmvƵ8</a>| <a href="http://yinyinai155.com" target="_blank">ëƬѲ</a>| <a href="http://tskes.com" target="_blank">aƵɫ</a>| <a href="http://hysw100.com" target="_blank">ƷƵ</a>| <a href="http://bomilon.com" target="_blank">Ƶ</a>| <a href="http://343dd.com" target="_blank">ĻձƬ</a>| <a href="http://juguanghr.com" target="_blank">޾ƷƵ</a>| <a href="http://jundaflex.com" target="_blank">޻ɫѵӰ</a>| <a href="http://qq2071.com" target="_blank">ɫ˵</a>| <a href="http://www-36664.com" target="_blank">˾þۺӰԺҳ</a>| <a href="http://gs168sz.com" target="_blank">avһ</a>| <a href="http://tsxyhq.com" target="_blank">һ߹ۿ߹ۿ</a>| <a href="http://yqstickers.com" target="_blank">4huĻӰԺwww</a>| <a href="http://horticartf.com" target="_blank">Ʒһʽâ</a>| <a href="http://438266.com" target="_blank">99þþùƷţţĴ</a>| <a href="http://pengkaimjg.com" target="_blank">Ӱɫۺ</a>| <a href="http://hljc988.com" target="_blank">ձһۺϾþa</a>| <a href="http://88ww99.com" target="_blank">޹Ļ߹ۿ</a>| <a href="http://zwdyw.com" target="_blank">Ů˾޸</a>| <a href="http://nit8.com" target="_blank">ŷ޹˾Ʒ</a>| <a href="http://jxxitutu.com" target="_blank">޹Ʒ18þþþþ</a>| <a href="http://0827fang.com" target="_blank">պþëƬ</a>| <a href="http://woaisouluo.com" target="_blank">¹͵Ʒվ</a>| <a href="http://kaixininvestment.com" target="_blank">ѹ˦Ƭ</a>| <a href="http://ee45987.com" target="_blank">һ߹ۿ</a>| <a href="http://xmmn77.com" target="_blank">պѸƵվ</a>| <a href="http://liexion.com" target="_blank">һĻ </a>| <a href="http://66keke.com" target="_blank">ëƬѹۿ</a>| <a href="http://littlevv.com" target="_blank">޾ƷӰ</a>| <a href="http://www1616hh.com" target="_blank">ĻۺϾþ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>