˜q™ä¸ªä¾‹å使用了HSQLåšæ•°æ®åº“åQŒspringçš„AOPä½œäØ“åŸºç¡€åQŒä‹É用Acegiåšå®‰å…¨æŽ§åˆ¶ç»„ä»¶ã€?br />è”系人管ç†çš„web应用在å¯åŠ¨æ—¶å€™ï¼Œä¼šåšä¸€¾pÕdˆ—åˆå§‹åŒ–动作:
1. è¯Õd–web.xmlæ–‡äšgåQ?/p>
2. òq¶è§£æžæ–‡ä»‰™‡Œçš„内å®V€?br />a) context-paramå…ƒç´ ã€?br />i. contextConfigLocation属性。这个属性定义了spring所需è¦çš„3个属性文件。它们分别是åQšapplicationContext -acegi-security.xmlã€applicationContext-common-business.xmlã€?applicationContext-common-authorization.xml
ii. log4jConfigLocation属性。这个属性定义了log4jé…置文äšgã€?/p>
b) filterå…ƒç´ ã€?br />˜q™é‡Œå®šä¹‰äº†acegi的一个过滤器。Acegi的大部分˜q‡æ×oå™¨éƒ½æ˜¯è¿™æ ·é…¾|®çš„。ä‹É用FilterToBeanProxy¾l„äšgåQŒç»™å®ƒä¼ 递一个targetClass属性。这个targetClass必须实现javax.servlet.Filter接å£ã€?br />˜q™é‡Œé…置的是FilterChainProxy。这个FilterChainProxy比较好用åQŒå¯ä»¥äؓ它定义一串filter属性。这些filterž®†ä¼šæŒ‰ç…§å®šä¹‰çš„顺åºè¢«è°ƒç”¨ã€‚例如,
<bean id="filterChainProxy" class="net.sf.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
</value>
</property>
</bean>
˜q™ä¸ª˜q‡æ×o器的mapping是â€?*â€ã€?br />c) listenerå…ƒç´ ã€?br />i. ContextLoaderListener。这个是Spring使用æ¥åŠ è½½æ ¹applicationcontextã€‚åÆˆåˆ†åˆ«è§£æž applicationContext-acegi-security.xmlã€applicationContext-common- business.xmlã€applicationContext-common-authorization.xml½{‰é…¾|®æ–‡ä»Óž¼ŒæŠŠç›¸å…³çš„对象åˆå§‹åŒ?br />iii. Log4jConfigListener。这个是spring用æ¥åˆå§‹åŒ–log4j¾l„äšgçš„listenerã€?br />iv. HttpSessionEventPublisher。这个组件将å‘布HttpSessionCreatedEventå’ŒHttpSessionDestroyedEvent事äšg¾l™springçš„applicationcontextã€?br />d) servletå…ƒç´ ã€?br />i. contacts。这里采用了springçš„MVC框架åQ?所以这个servlet是spring MVCçš„ä¸€ä¸ªæ ¸å¿ƒæŽ§åˆ¶å™¨åQˆorg.springframework.web.servlet.DispatcherServletåQ‰ã€‚这个servlet å¯åŠ¨æ—¶å€™ï¼Œä¼šä»Žcontacts-servlet.xml里é¢è¯Õd–ä¿¡æ¯åQŒåƈåšç›¸å…³çš„åˆå§‹åŒ–ã€?br />v. remoting。也是spring MVCçš„ä¸€ä¸ªæ ¸å¿ƒæŽ§åˆ¶å™¨ã€‚ä¸Žcontactsä¸åŒåQŒè¿™ä¸ªservletä¸»è¦æ˜¯æä¾›web servicesæœåŠ¡ã€‚è¿™ä¸ªservletå¯åŠ¨æ—¶å€™ï¼Œ 会从remoting-servlet.xml里é¢è¯Õd–ä¿¡æ¯åQŒåƈåšç›¸å…³çš„åˆå§‹åŒ–ã€?br />e) taglibå…ƒç´ ã€‚è¿™é‡Œå®šä¹‰äº†springçš„æ ‡f) ½{‘Öº“ã€?br />3. è§£æžapplicationContext-acegi-security.xmlã€?br />a) ˜q‡æ×o器链。定义了一个FilterChainProxyåQŒb) òq¶æŒ‡c) 定了一¾pÕdˆ—的过滤器链。httpSessionContextIntegrationFilter, authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
d) è®¤è¯½Ž¡ç†å™¨ã€‚这个管ç†å™¨ç”±acegiæä¾›ã€‚这个管ç†å™¨éœ€è¦ä¸€ä¸ªproviders傿•°ã€‚这个providers傿•°åŒ…å«äº†æä¾›ç³»¾lŸè®¤è¯çš„对象ã€?br />i. daoAuthenticationProvider。一般用戯‚®¤è¯ã€?br />ii. anonymousAuthenticationProvider。匿å用戯‚®¤è¯ã€?br />iv. rememberMeAuthenticationProviderã€‚è®°ä½æˆ‘认è¯ã€?/p>
e) 密ç åŠ å¯†ã€‚è¿™é‡Œå®šä¹‰äº†ä¸€ä¸ªacegiçš„Md5½Ž—æ³•åŠ å¯†å¯¹è±¡Md5PasswordEncoderã€?br />f) 定义了一个jdbcDao实现¾c…R€‚这个类由acegiæä¾›çš„net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl。这个对象需è¦ä¸€ä¸ªdataSourceçš„å‚æ•°ã€?br />g) 定义daoAuthenticationProvider。这个对象由acegiæä¾›ã€‚它æœ?个属性:
authenticationDao。这里指å‘å‰é¢å®šä¹‰çš„jdbcDaoã€?br />userCache。这里指å‘åŽé¢å®šä¹‰çš„user¾~“å˜å¯¹è±¡ã€?br />passwordEncoder。这里指å‘å‰é¢å®šä¹‰çš„密ç åŠ å¯†å¯¹è±¡ã€?br />h) 用户¾~“å˜½Ž¡ç†ã€?br />ä¸ÞZº†¾~“å˜useråQŒè¿™é‡Œä‹É用springçš„ehcacheæ¥ç¼“å˜userã€‚ç¼“å˜æœºåˆÓž¼š
i. 定义¾~“å˜½Ž¡ç†å™¨â€•―CacheManager。这个对象是springçš„EhCacheManagerFactoryBean对象
ii. 定义user¾~“å˜å®žé™…执行对象――UserCacheBackend。这个对象是springçš„EhCacheFactoryBean。它有两个属性:
1. cacheManager。这里指å‘å‰é¢å®šä¹‰çš„¾~“å˜½Ž¡ç†å™¨ã€?br />2. cacheNameã€?br />iii. 定义user¾~“å˜â€•―UserCache。它是acegiæä¾›çš„EhCacheBasedUserCache对象。它有一个属性:
1. cache。这里指å‘的是å‰é¢å®šä¹‰çš„userCacheBackendã€?/p>
i) 定义接收æ¥è‡ªDaoAuthenticationProvider的认è¯äº‹ä»¶çš„listener――LoggerListenerã€?br />j)
4. è§£æžapplicationContext-common-business.xmlã€?br />a) dataSource.
˜q™é‡Œä½¿ç”¨äº†springçš„DriverManagerDataSource对象。这个对象是一个JDBCæ•°æ®æºçš„定义ã€?br />b) TransactionManager。这里ä‹É用springçš„DataSourceTransactionManager对象ã€?br />c) 事务拦截器。这里ä‹É用spring的事务拦截器TransactionInterceptor。它æœ?个属性:
transactionManager。这个属性指å‘å‰é¢å®šä¹‰çš„TransactionManagerã€?br />transactionAttributeSource。这个属性里åQ?指定了ContactManagerçš„å„个方法的事务斚w¢çš„è¦æ±‚ã€?br />d) DataSourcePopulatorã€?br />使用sample.contact.DataSourcePopulator对象åQŒå¾€HSQL里创建相关的表结构和数æ®ã€?br />实现原ç†åQšDataSourcePopulator 实现了接å?InitializingBean。其ä¸afterPropertiesSetæ–ÒŽ³•ž®†åœ¨springåˆå§‹åŒ–DataSourcePopulatoråŽè¢«è°ƒç”¨ã€?br />e) ContactDao。这里指å‘一个ContactDaoSpring对象。它¾l§æ‰¿springçš?JdbcDaoSupportåQŒg) òq¶å®žçްContactDao接å£ã€‚它是真æ£å®žçްJDBCæ“作的对象ã€?br />h) ContactManager。这里ä‹É用的是springçš„ProxyFactoryBean。它æœ?个属性:
i. ProxyInterfacesã€‚ä»£ç†æŽ¥å£ï¼šsample.contact.ContactManager
ii. InterceptorNames。拦截器å称。å¯ä»¥æœ‰å¤šä¸ªåQŒiv. ˜q™é‡ŒåŒ…括åQštransactionInterceptorã€contactManagerSecurityã€contactManagerTarget。其ä¸ï¼Œv. transactionInterceptor是å‰é¢å®šä¹‰çš„事务拦截器。ContactManagerSecurity则是åœ?applicationContext-common-authorization.xml里定义的æ–ÒŽ³•调用授æƒã€?br />i) ContactManagerTarget。这里指å‘的是sample.contact.ContactManagerBackend对象ã€?ContactManagerBackend实现了ContactManager接å£å’ŒInitializingBean接å£ã€‚它æœ?个自定义属性: contactDaoå’ŒbasicAclExtendedDao。这里会调用ACLçš„APIåŽÕdšäº›åˆ›å»ºæƒé™å’Œåˆ 除æƒé™çš„工作ã€?/p>
è”系人管ç†è¯´æ˜Žäº†ä¸‹åˆ—ä¸å¿ƒçš?span lang="EN-US">Acegi安全控制能力:
ContactManager
æœåС层坹è±?/span>
包å«ä¸€äº›å—ä¿æŠ¤çš„å’Œå…¬å¼€çš„æ–¹æ³•ã€?/span>
/secure
�/span>
URI
路径被ä‹Éç”?/span>
Acegi
å®‰å…¨ä¿æŠ¤åQŒä‹É得没æœ?/span>
ROLE_USER
角色的用æˆäh— 法访问ã€?/span>
.
è”系人管ç†çš„业务功能æè¿°åQ?/span>
1.1. æ¯ä¸ªç”¨æˆ·ç™Õd½•åŽï¼Œå¯ä»¥çœ‹åˆ°ä¸€ä¸ªè”¾pÖMh列表。例如,
id |
Name |
|
||
1 |
John Smith |
john@somewhere.com |
||
2 |
Michael Citizen |
michael@xyz.com |
|
|
3 |
Joe Bloggs |
joe@demo.com |
|
|
4 |
Karen Sutherland |
karen@sutherland.com |
说明åQšç”¨æˆäh²¡æœ‰æƒé™è®¿é—®çš„è”ç³»äºÞZ¿¡æ¯ï¼Œž®†ä¸ä¼šæ˜¾½Cºã€?/span>
2.2. 用户å¯ä»¥å¢žåŠ æ–°çš„è”ç³»äºÞZ¿¡æ¯ã€?/span>
3.3. å¦‚æžœæœ‰åˆ é™¤æƒé™ï¼Œç”¨æˆ·å¯ä»¥çœ‹åˆ°åœ¨è”¾pÖMhåŽé¢æœ‰ä¸€ä¸ªâ€?/span> Del â€é“¾æŽ¥ã€‚用户å¯ä»¥ç‚¹å‡»è¿™ä¸ªé“¾æŽ¥æ¥åˆ 除æŸä¸ªè”ç³»äºÞZ¿¡æ¯ã€?/span>
4.4. å¦‚æžœæœ‰ç®¡ç†æƒé™ï¼Œç”¨æˆ·å¯ä»¥çœ‹åˆ°åœ¨è”¾pÖMhåŽé¢æœ‰ä¸€ä¸ªâ€?/span> Admin Permission â€é“¾æŽ¥ã€‚用户å¯ä»¥ç‚¹å‡»è¿™ä¸ªé“¾æŽ¥æ¥½Ž¡ç†è®‰K—®˜q™ä¸ªè”系人的æƒé™ã€‚例如,
sample.contact.Contact@26807f: Id: 1; Name: John Smith; Email: john@somewhere.com
|
|
|
|
|
说明åQšæ¯ä¸€è¡Œè®°å½•åŒ…å«æœ‰ 3 列ã€?/span>
½W¬ä¸€åˆ—表½Cºæƒé™ï¼Œä¾‹å¦‚åQŒâ€?/span>
-RW-D
â€è¡¨½Cºå¯è¯…R€å¯å†™ã€å¯åˆ 除ã€?/span>
½W¬äºŒåˆ—也表示æƒé™åQŒä½†å®ƒæ˜¯ä»¥ç±»ä¼?/span> unix æƒé™çš„æ•°å—表达。例如,â€?/span> [22] â€?/span> , 表示å¯è¯»ã€å¯å†™ã€å¯åˆ 除ã€?/span>
½W¬ä¸‰åˆ—是用户åç§°ã€?/span>
æ¯ä¸€è¡Œè®°å½•åŽé¢éƒ½æœ‰ä¸€ä¸ªâ€?/span> Del â€é“¾æŽ¥ã€‚点击这个链接,å¯ä»¥åˆ 除掉指定用户对˜q™ä¸ªè”ç³»äºÞZ¿¡æ¯çš„æƒé™ã€?/span>
5.5. 用户å¯ä»¥ä¸ºæŸä¸ªè”¾pÖMhä¿¡æ¯æ·ÕdŠ æƒé™ã€‚例如,