µÚÁùÕÂ. ͨÓÃÈÏÖ¤·þÎñ
6.1. Mechanisms, Providers ºÍ Entry Points
Èç¹ûÄãʹÓÃAcegi SecurityÌṩµÄÈÏÖ¤·½·¨£¬ÄÇôͨ³£ÄãÐèÒªÅäÖÃÒ»¸öweb filter£¬Ò»¸öAuthenticationProvider
ÒÔ¼°AuthenticationEntryPoint¡£ÔÚ±¾½ÚÎÒÃǽ«Òªä¯ÀÀÒ»¸öʾÀýÓ¦Óã¬ËüÐèÒªÖ§³Ö»ùÓÚformµÄÈÏÖ¤£¨ÀýÈçÌṩ¸øÓû§µÇ¼µÄHTMLÒ³Ãæ£©ÒÔ¼°»ù´¡ÈÏÖ¤£¨ÀýÈçweb service»òÕßÀàËÆµÄ¿ÉÒÔ·ÃÎÊÊܱ£»¤×ÊÔ´£©¡£
ÔÚweb.xmlÖУ¬Õâ¸öÓ¦ÓÃÐèÒªÒ»¸öµ¥¶ÀµÄAcegi Security filterÀ´Ê¹ÓÃFilterChainProxy¡£¼¸ºõËùÓеÄAcegi SecurityÓ¦Óö¼ÓÐÒ»¸öÀàËÆµÄÏ¿´ÆðÀ´ÏóÏÂÃæÕâÑù£º
xml ´úÂë
- <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>
ÉÏÊöÉùÃ÷½«Ê¹Ã¿¸öwebÇëÇó¶¼Òª¾¹ýAcegi SecurityµÄFilterChainProxy¡£ÕýÈçÔÚ±¾ÊÖ²áµÄfilterÄǽÚÖÐËù˵£¬FilterChainProxyÊÇÒ»¸öͨÓÃÀ࣬ËüʹµÃwebÇëÇó°´ÕÕURLģʽ±»·¢Ë͵½²»Í¬µÄfilter¡£ÄÇЩ±»Î¯ÅɵÄfilterÊÇÓÉapplication context¹ÜÀíµÄ£¬Òò´ËËüÃÇ¿ÉÒÔÏíÊÜÒÀÀµ×¢ÉäµÄºÃ´¦¡£ÎÒÃÇÀ´¿´¿´ÔÚÄãµÄapplication contextÖÐFilterChainProxyµÄ¶¨Òå»áÊÇʲôÑùµÄ£º
xml ´úÂë
- <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,basicProcessingFilter,securityContextHolderAwareRequestFilter,</value>
- </property>
- </bean>
ÔÚÄÚ²¿£¬Acegi Security»áʹÓÃPropertyEditorÀ´½«ÉÏÊöXMLƬ¶ÎÖеÄ×Ö·û´®×ª»¯ÎªÒ»¸öFilterInvocationDefinitionSource¶ÔÏó¡£ÔÚÕâ¸ö½×¶ÎÐèҪעÒâµÄÊÇ£¬Ò»ÏµÁеÄfilter»á°´ÕÕ¶¨ÒåµÄ˳ÐòÔËÐУ¬²¢ÇÒÕâЩfilterʵ¼Ê¾ÍÊÇapplication contextÖеÄbeanµÄ<bean id>¡£ËùÒÔ£¬ÔÚÎÒÃǵÄÀý×ÓÖУ¬»áÔÚapplication context³öÏÖÁíÍâһЩbean£¬ËüÃǻᱻÃüÃûΪhttpSessionContextIntegrationFilter, logoutFilter µÈ¡£Filter³öÏÖµÄ˳Ðò»áÔÚÊÖ²áÖÐfilterÄÇÒ»½ÚÌÖÂÛ£¬ËäÈ»ÉÏÊöµÄÀý×ÓÖÐËüÃÇÊÇÕýÈ·µÄ¡£
ÔÚÎÒÃǵÄÀý×ÓÖУ¬ÎÒÃÇʹÓÃÁËAuthenticationProcessingFilterºÍBasicProcessingFilter¡£ËüÃÇ·Ö±ð¶ÔÓ¦ÁË»ùÓÚformµÄÈÏÖ¤ºÍBASIC HTTP header-basedÈÏÖ¤µÄ“ÈÏÖ¤»úÖÆ”£¨ÎÒÃÇÔÚÊÖ²áµÄÇ°Ãæ²¿·ÖÌÖÂÛÁËÈÏÖ¤»úÖÆ°çÑݵĽÇÉ«£©¡£Èç¹ûÄã¼È²»Ê¹ÓÃformÒ²²»Ê¹ÓÃBASICÈÏÖ¤£¬¾Í²»ÐèÒª¶¨ÒåÕâЩbeanÁË¡£È¡¶ø´úÖ®µÄÊÇÄãÒª¶¨Òå¶ÔÓ¦ÄãËùÐèÒªµÄÈÏÖ¤»·¾³µÄfilter£¬ÀýÈçDigestProcessingFilter »òÕßCasProcessingFilter¡£Çë¶ÔÕÕÊÖ²áÖжÔÓ¦µÄÕ½ÚÀ´Á˽âÈçºÎÅäÖÃÕâЩÈÏÖ¤»úÖÆ¡£
ÈÃÎÒÃÇ»ØÒäһϣ¬ÔÚHttpSessionContextIntegrationFilterÖб£´æÁËÿ¸öHTTP sessionµ÷ÓÃÖеÄSecurityContext¡£ÕâÒâζ×ÅÈÏÖ¤»úÖÆÖ»»áÔÚprincipal×î³õ³¢ÊÔÈÏÖ¤µÄʱºò±»Ê¹ÓÃÒ»´Î¡£ÔÚÓàϵÄʱ¼äÄÚ£¬ÈÏÖ¤»úÖÆÖ»ÊǾ²¾²µÄ´ýÔÚÄÇÀ½«ÇëÇó·¢ÍùfilterÁ´ÖеÄÏÂÒ»¸öfilter¡£Õâ¸ö»ùÓÚʵ¼ÊµÄÐèÇóÔ´ÓÚÕâÑùµÄÒ»¸öÊÂʵ£¬ºÜÉÙÓÐÈÏ֤ʵÏÖÔÚÿһ¸ö£¬Ã¿Ò»´ÎµÄµ÷ÓõÄʱºò¶¼»á½øÐÐÈÏÖ¤£¨BASICÈÏÖ¤ÊÇÒ»¸öÖµµÃ×¢ÒâµÄÀýÍ⣩£¬µ«ÊÇÈç¹ûÒ»¸öpricipalÔÚ×î³õµÄÈÏÖ¤²½ÖèÖ®ºóÕʺű»È¡ÏûÁË£¬»òÕß±»½ûÓÃÁË£¬»òÕß±»ÐÞ¸ÄÁË£¨ÀýÈçGrantedAuthority[]ÖÐÔö¼Ó»òÕß¼õÉÙ£©»áÔõôÑùÄØ£¿ÈÃÎÒÃÇÀ´¿´¿´ÏÖÔÚÕâЩÇé¿öÊÇÈçºÎ´¦ÀíµÄ¡£
Ç°ÃæÒѾ½éÉÜÁ˰²È«¶ÔÏóµÄÖ÷ÒªÈÏÖ¤provider AbstractSecurityInterceptor¡£Õâ¸öÀàÐèÒªÄܹ»·ÃÎÊÒ»¸öAuthenticationManager¡£ËüͬʱÓиö¿ÉÑ¡ÅäÖÿÉÒÔÉ趨һ¸öÈÏÖ¤¶ÔÏóÿ´Î°²È«¶ÔÏóµ÷ÓõÄʱºòÊÇ·ñÐèÒªÖØÐÂÈÏÖ¤¡£Èç¹ûAuthentication.isAuthenticated()·µ»Øtrue£¬ÄÇôËüĬÈÏÔÚSecurityContextHolderÖеÄÈÏÖ¤¶ÔÏóÊÇÒÑÈÏÖ¤µÄ¡£ÕâÑù×ö¶ÔÓÚÌá¸ßÐÔÄÜÊǷdz£ºÃµÄ£¬µ«ÊǶÔÓÚ¼´Ê±µÄÈÏÖ¤ÑéÖ¤ÊDz»ÀíÏëµÄ¡£ÔÚÕâÑùµÄÇé¿öÏÂÄã¿ÉÄÜÐèÒª½«AbstractSecurityInterceptor.alwaysReauthenticateÊôÐÔÉèÖÃΪtrue¡£
Äã¿ÉÄÜ»áÎÊ×Ô¼º“Õâ¸öAuthenticationManagerÊÇʲô£¿”ÎÒÃÇ֮ǰûÓмû¹ýËü£¬µ«ÊÇÎÒÃÇÔø¾ÌÖÂÛ¹ýAuthenticationProviderµÄ¸ÅÄî¡£·Ç³£¼òµ¥£¬AuthenticationManager¸ºÔðÔÚAuthenticationProviderÁ´Ö®¼ä´«µÝÇëÇó¡£Ëü·Ç³£ÏóÎÒÃÇ֮ǰÌÖÂÛ¹ýµÄfilterÁ´£¬ËäÈ»ÓÐһЩ²»Í¬¡£Acegi SecurityÖ»ÌṩÁËÒ»¸öAuthenticationManagerʵÏÖ£¬Òò´ËÈÃÎÒÃÇ¿´¿´¶ÔÓÚÎÒÃÇÕâÕµÄÀý×Ó£¬ËüÊÇÈçºÎÅäÖõģº
xml ´úÂë
- <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
- <property name="providers">
- <list>
- <ref local="daoAuthenticationProvider"/>
- <ref local="anonymousAuthenticationProvider"/>
- <ref local="rememberMeAuthenticationProvider"/>
- </list>
- </property>
- </bean>
ÔÚÕâ¸öʱºò£¬¿ÉÄÜÖµµÃÌáµ½µÄÊÇÄãµÄÈÏÖ¤»úÖÆ£¨Í¨³£ÊÇfilter£©Ò²±»×¢ÈëÁËÒ»¸öAuthenticationManagerµÄÒýÓá£ËùÒÔºÍÈÏÖ¤»úÖÆ¶¼»áʹÓÃÉÏÊöµÄProviderManagerÀ´ÂÖѯһϵÁеÄAuthenticationProvider¡£
ÔÚÎÒÃÇÀý×ÓÖÐÓÐÈý¸öprovider¡£ËüÃǰ´ÕÕÉÏÊöµÄ˳Ðòµ÷Óã¨Ê¹ÓÃlist¶ø²»ÊÇsetÀ´ÏÔʾÊǰ´ÕÕ˳Ðòµ÷Óõģ©£¬Ã¿¸öprovider¶¼Äܹ»³¢ÊÔÈÏÖ¤£¬»òÕß½ö½ö·µ»ØÒ»¸önullÀ´Ìø¹ýÈÏÖ¤¡£Èç¹ûËùÓеÄʵÏÖ¶¼·µ»Ønull£¬ProviderManager»áÅ׳öÒ»¸öÏàÓ¦µÄÒì³£¡£Èç¹ûÄãÏëÁ˽â¸ü¶àchaining providersµÄÐÅÏ¢£¬Çë²ÎÔÄProviderManagerµÄJavaDoc¡£
authentication mechanismʹÓõÄÄÇЩproviderÓÐʱºòÊÇ¿ÉÒÔ»¥»»µÄ£¬¶øÓÐʱºòËüÃÇÓÖÒÀÀµÓÚÌØ¶¨µÄauthentication mechanism¡£ÀýÈ磬DaoAuthenticationProviderÖ»ÐèÒªÒ»¸ö»ùÓÚ×Ö·û´®µÄÓû§ÃûºÍÃÜÂë¡£Èô¸É¸öÈÏÖ¤»úÖÆ»á²úÉú»ùÓÚ×Ö·û´®µÄÓû§ÃûºÍÃÜÂëµÄ¼¯ºÏ£¬°üÀ¨£¨µ«²»ÏÞÓÚ£©BASIC ºÍ form ÈÏÖ¤¡£Í¬Ê±£¬ÓÐЩÈÏÖ¤»úÖÆ»á²úÉúÒ»¸öÖ»ÄܺÍÌØ¶¨ÀàÐ͵ÄAuthenticationProvider½»»¥µÄÈÏÖ¤ÇëÇó¶ÔÏó¡£Ò»¸öÕâÖÖÒ»¶ÔÒ»Ó³ÉäµÄÀý×ÓÊÇJA-SIG CAS£¬ËüʹÓÃservice ticketµÄ¸ÅÄֻÄܱ»Common Authentication Services CasAuthenticationProviderÈÏÖ¤¡£Ò»¸ö¸ü¼ÓÉîÈëµÄÒ»¶ÔÒ»Ó³ÉäµÄÀý×ÓÊÇLDAPÈÏÖ¤»úÖÆ£¬ËüÖ»ÄÜÓÉLdapAuthenticationProvider´¦Àí¡£ÕâÖÖÌØ¶¨µÄ¶ÔÓ¦¹ØÏµÔÚÿ¸öÀàµÄJavaDocÒÔ¼°ÔÚ±¾ÊÖ²áµÄÌØ¶¨ÈÏÖ¤·½·¨Õ½ÚÖÐÓÐÏêϸ˵Ã÷¡£Äã²»Óõ£ÐÄÕâЩʵÏÖµÄϸ½Ú£¬ÒòΪÈç¹ûÄãÍü¼Ç×¢²áÒ»¸öºÏÊʵÄprovider£¬ÄãÔÚ³¢ÊÔÈÏ֤ʱֻ»áÊÕµ½Ò»¸öProviderNotFoundExceptionÒì³£¡£
µ±ÄãÔÚFilterChainProxyÖÐÕýÈ·ÅäÖÃÁËÈÏÖ¤»úÖÆ£¬²¢ÇÒÈ·±£×¢²áÁ˶ÔÓ¦µÄAuthenticationProvider£¬ÄãµÄ×îºóÒ»²½ÊÇÅäÖÃÒ»¸öAuthenticationEntryPoint¡£»ØÒäÒ»ÏÂÔçÏÈÎÒÃÇÌÖÂÛ¹ýµÄExceptionTranslationFilterµÄ½ÇÉ«£¬µ±Ò»¸ö»ùÓÚHTTPµÄÇëÇóÊÕµ½Ò»¸öHTTPÍ·»òÕßÒ»¸öHTTPÖØ¶¨ÏòÒÔ¿ªÊ¼ÈÏ֤ʱËü±»Ê¹Ó᣼ÌÐøÎÒÃÇÔçÏȵÄÀý×Ó£º
xml ´úÂë
- <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
- <property name="authenticationEntryPoint"><ref
- local="authenticationProcessingFilterEntryPoint"/></property>
- <property name="accessDeniedHandler">
- <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
- <property name="errorPage" value="/accessDenied.jsp"/>
- </bean>
- </property>
- </bean>
- <bean id="authenticationProcessingFilterEntryPoint"
- class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
- <property name="loginFormUrl"><value>/acegilogin.jsp</value></property>
- <property name="forceHttps"><value>false</value></property>
- </bean>
×¢Òâµ½ExceptionTranslationFilterÐèÒªÁ½¸öÐ×÷Õß¡£µÚÒ»¸öAccessDeniedHandlerImpl£¬Ê¹ÓÃÒ»¸öRequestDispatcherµ¼ÏòÏÔÊ¾ÌØ¶¨µÄ·ÃÎʾܾøµÄ´íÎóÒ³Ãæ¡£ÎÒÃÇʹÓÃforwadËùÒÔSecurityContextHolderÖÐÈÔÈ»±£ÁôprincipalµÄÏêϸÐÅÏ¢£¬ÕâЩ¶ÔÓÚÏÔʾ¸øÓû§À´ËµÊÇÓÐÓõģ¨ÔÚAcegi SecurityµÄÀϰ汾ÖУ¬ÎÒÃÇÒÀÀµrervletÈÝÆ÷À´´¦Àí403´íÎóÐÅÏ¢£¬Ëüȱ·¦Õâ¸öÓÐÓõÄÉÏÏÂÎÄÐÅÏ¢£©¡£AccessDeniedHandlerImplͬʱ½«»á½«HTTPÍ·ÉèÖÃΪ403£¬ËüÊÇ·ÃÎʾܾøµÄÕýʽ´íÎó´úÂë¡£ÖÁÓÚAuthentionEntryPoint£¬ÕâÀïÉèÖÃÈç¹ûÒ»¸öδÊÜÈÏÖ¤µÄprincipal³¢ÊÔÖ´ÐÐÒ»¸öÊܱ£»¤µÄ²Ù×÷ʱ£¬ÎÒÃÇÐèÒªÖ´ÐÐÄÇЩ¶¯×÷¡£ÒòΪÔÚÎÒÃǵÄÀý×ÓÖÐҪʹÓûùÓÚformµÄÈÏÖ¤£¬Òò´ËÎÒÃÇÉ趨AuthenticationProcessinFilterEntryPointÒÔ¼°µÇÂ¼Ò³ÃæµÄURL¡£ÄãµÄÓ¦ÓÃϵͳͨ³£Ö»ÐèÒªÒ»¸öentry point£¬²¢ÇÒ´ó¶àÊýµÄÈÏÖ¤·½·¨¶¼¶¨ÒåÁË×Ô¼ºÌØÓеÄAuthenticationEntryPoint¡£Ã¿¸öÈÏÖ¤·½Ê½Ëù¶ÔÓ¦µÄÌØ¶¨entry pointµÄÏêϸÇé¿ö»áÔÚ±¾ÊÖ²áÌØ¶¨µÄÈÏÖ¤·½·¨Õ½ÚÖнéÉÜ¡£
6.2. UserDetails ºÍ Associated Types
ÕýÈçÔÚµÚÒ»²¿·ÖÖÐÌáµ½µÄ£¬´ó¶àÊýÈÏÖ¤providerÒªÓõ½UserDetails ºÍUserDetailsService ½Ó¿Ú¡£ºóÃæÄǸö½Ó¿ÚÖ»°üº¬Ò»¸ö·½·¨£º
java ´úÂë
- public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException,
- DataAccessException;
·µ»ØÖµUserDetailsÊÇÒ»¸ö½Ó¿Ú£¬ËüÌṩÁËÈô¸É¸ögetter±£Ö¤·µ»Ø·ÇnullÖµ£¬ÀýÈçÓû§Ãû£¬ÃÜÂ룬ÊÚÓèµÄȨÏÞÒÔ¼°Óû§ÊÇÆôÓû¹ÊǽûÓÃ״̬¡£´ó²¿·ÖÈÏÖ¤provider¶¼»áʹÓÃÒ»¸ö£¬¼´Ê¹ËüÔÚÈÏÖ¤ÅжϹý³ÌÖÐʵ¼Ê²¢²»Ê¹ÓÃÓû§ÃûºÍÃÜÂ롣ͨ³£ÕâЩproviderÖ»»áʹÓ÷µ»ØµÄUserDetailsÖеÄGrantedAuthority[]ÐÅÏ¢£¬ÒòΪÓÐЩϵͳ£¨ÀýÈçLDAP »ò X509 »ò CAS£©ÒѾ³Ðµ£ÁËʵ¼ÊµÄÉí·ÝÑéÖ¤µÄÔðÈΡ£
Acegi SecurityÌṩÁËÒ»¸öUserDetailsµÄʵÌåÀàʵÏÖ£User¡£Acegi SecurityÓû§ÐèҪȷ¶¨Ê²Ã´Ê±ºòʵÏÖUserDetailsServiceÒÔ¼°·µ»ØÊ²Ã´ÑùµÄUserDetailsʵÌåÀࡣͨ³££¬Ö±½ÓʹÓÃUserÀà»òÕ߼̳ÐUserÀà¾Í¿ÉÒÔÁË£¬¾¡¹ÜÓÐÒ»Ð©ÌØÊâÇé¿ö(ÀýÈç object relational mappers)£¬ÐèÒªÓû§´ÓͷдËûÃÇ×Ô¼ºµÄUserDetailsʵÏÖ¡£ÕâÖÖÇé¿öҲʱÓз¢Éú£¬Óû§Ö»Òª·µ»ØËûÃÇÕý³£µÄ´ú±íϵͳÓû§µÄÁìÓò¶ÔÏó¾Í¿ÉÒÔÁË¡£ÌرðÊÇUserDetails¾³£±»ÓÃÀ´´æ´¢¶îÍâµÄprincipalÏà¹ØÊôÐÔ£¨ÀýÈçËûÃǵĵ绰ºÅÂëÒÔ¼°emailµØÖ·£©£¬ÕâÑùËüÃÇ¿ÉÒÔºÜÈÝÒ×±»webÊÓͼʹÓá£
ÌØ¶¨µÄUserDetailsServiceʵÏÖÆðÀ´ÊǺܼòµ¥µÄ£¬ËüÓ¦¸ÃºÜÈÝÒ×ÓÉÓû§À´Ñ¡Ôñ³Ö¾Ã»¯²ßÂÔÀ´»ñÈ¡ÈÏÖ¤ÐÅÏ¢¡£Ëµµ½ÕâÀAcegi Securityȷʵ°üº¬ÁËһЩÓÐÓõĻù´¡ÊµÏÖ£¬ÏÂÃæÈÃÎÒÃÇ¿´Ò»Ï¡£
6.2.1. In-Memory ÈÏÖ¤
ËäÈ»Óû§¿ÉÒÔ´´½¨Ò»¸ö¶¨ÖƵÄUserDetailsServiceʵÏÖÀ´´ÓÒ»¸ö³Ö¾Ã»¯ÒýÇæÖлñÈ¡ÐÅÏ¢£¬ºÜ¶àÓ¦Óò»ÐèÒªÕâÖÖ¸´ÔÓÐÔ¡£ÌرðÊÇÈç¹ûÄãÕýÔÚ½øÐпìËÙÔÐÍ¿ª·¢»òÕ߸տªÊ¼¼¯³ÉAcegi Security£¬µ±Äã²»ÐèÒª»¨·Ñʱ¼äÀ´½øÐÐÊý¾Ý¿âÅäÖûòÕßдUserDetailsServiceµÄʵÏÖ¡£ÕâÖÖÇé¿ö֮ϣ¬ÄãÓÐÒ»¸ö¼òµ¥µÄÑ¡Ôñ£¬¾ÍÊÇÅäÖÃInMemoryDaoImplʵÏÖ¡£
xml ´úÂë
- <bean id="inMemoryDaoImpl" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
- <property name="userMap">
- <value>
- marissa=koala,ROLE_TELLER,ROLE_SUPERVISOR
- dianne=emu,ROLE_TELLER
- scott=wombat,ROLE_TELLER
- peter=opal,disabled,ROLE_TELLER
- </value>
- </property>
- </bean>
ÔÚÉÏÃæµÄÀý×ÓÖУ¬userMapÊôÐÔ°üº¬ÁËÿ¸öÓû§µÄÓû§Ãû£¬ÃÜÂ룬һ¸öÊÚȨÁбíÒÔ¼°Ò»¸ö¿ÉÑ¡µÄÆôÓÃ/½ûÓùؼü´Ê¡£Ê¹ÓöººÅ·Ö¸ô¡£Óû§Ãû±ØÐëÔڵȺŵÄ×ó²à£¬ÃÜÂë±ØÐëÔڵȺÅÓÒ²àµÚÒ»¸ö³öÏÖ¡£ÆôÓúͽûÓùؼü´Ê£¨´óСдÃô¸Ð£©¿ÉÒÔ³öÏÖÔÚµÚ¶þ¸ö»òÕßÖ®ºóÈÎÒâλÖá£Ê£ÓàµÄ×Ö·û´®±»¿´×÷ÊÇÊÚÓèµÄȨÏÞ£¬ÕâЩȨǮ±»´´½¨ÎªGrantedAuthorityImpl¶ÔÏ󣨽ö¹©²Î¿¼£´ó¶àÊýµÄÓ¦Óò»ÐèÒª×Ô¶¨ÒåµÄGrantedAuthorityʵÏÖ£¬ËùÒÔʹÓÃĬÈϵÄʵÏ־ͿÉÒÔÁË£©¡£×¢ÒâÈç¹ûÒ»¸öÓû§Ã»ÓÐÃÜÂë¼°»òûÓб»ÊÚÓèȨÏÞ£¬¸ÃÓû§²»»áÔÚin-memory ÈÏÖ¤¿âÖд´½¨¡£
InMemoryDaoImplÒ²ÌṩÁËÒ»¸ösetUserProperties(Properties)·½·¨£¬¿ÉÒÔÔÊÐíÄãÓÃÁíÒ»¸öSpringµÄÅäÖúõÄbean»òÕßÒ»¸öÍⲿµÄpropertiesÎļþÀ´ÊµÀý»¯ÊôÐÔ¡£Äã¿ÉÄÜҪʹÓÃSpringµÄPropertiesFactoryBean£¬ËüÔÚ¼ÓÔØÍⲿÊôÐÔÎļþµÄʱºò·Ç³£ÓÐÓá£Õâ¸ösetter¿ÉÄܶÔÓÚÓдóÁ¿Óû§µÄÓ¦Ó㬻òÕß¿ª·¢ÆÚÅäÖñä¸üÓÐËùÖúÒæ£¬µ«ÊDz»ÒªÖ¸ÍûʹÓÃÕû¸öÊý¾Ý¿âÀ´´¦ÀíÈÏ֤ϸ½Ú¡£
6.2.2. JDBC ÈÏÖ¤
Ò²°üÀ¨ÁËÒ»¸ö´ÓJDBCÊý¾ÝÔ´»ñÈ¡ÈÏÖ¤ÐÅÏ¢µÄUserDetailsService¡£Ê¹ÓÃSpringÄÚ²¿µÄJDBC£¬±ÜÃâÁ˽ö½öΪÁË´æ´¢Óû§ÐÅÏ¢¶øÊ¹Óø´ÔӵĶÔÏó¹ØÏµCommon Authentication Services Ó³É䣨ORM£©¡£Èç¹ûÄãȷʵʹÓÃORM¹¤¾ß£¬Äã¿ÉÄÜҪдһ¸ö¶¨ÖƵÄUserDetailsServiceÀ´ÖØÓÃÄãÒѾ´´½¨µÄÓ³ÉäÎļþ¡£»Øµ½JdbcDaoImpl£¬ÏÂÃæÊÇÒ»¸öÅäÖõÄÀý×Ó£º
xml ´úÂë
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property>
- <property name="url"><value>jdbc:hsqldb:hsql://localhost:9001</value></property>
- <property name="username"><value>sa</value></property>
- <property name="password"><value></value></property>
- </bean>
- <bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
- <property name="dataSource"><ref bean="dataSource"/></property>
- </bean>
Äã¿ÉÄÜÒªÐÞ¸ÄÉÏÊöµÄDriverManagerDataSourceÀ´Ê¹Óò»Í¬µÄ¹ØÏµÊý¾Ý¿â¹ÜÀíϵͳ¡£Ä㻹¿ÉÒÔʹÓôÓJNDI»ñÈ¡µÄÈ«¾ÖÊý¾ÝÔ´£¬ÈçÉϵij£¹æSpringÑ¡Ïî¡£²»ÂÛÊÇʹÓÃʲôÊý¾Ý¿âÒÔ¼°ÈçºÎ»ñÈ¡Êý¾ÝÔ´£¬±ØÐëʹÓÃÒ»¸ö°´ÕÕdbinit.txtÖÐдÃ÷µÄÊý¾Ý¿âģʽ¡£Äã¿ÉÒÔ´ÓAcegi SecurityÍøÕ¾ÏÂÔØÕâ¸öÎļþ¡£
Èç¹ûÄãµÄĬÈÏÊý¾Ý¿âģʽ²»ÄÜÂú×ãÐèÒª£¬JdbcDaoImplÌṩÁËÁ½¸öÊôÐÔÔÊÐí¶¨ÖÆSQLÓï¾ä¡£Èç¹ûÐèÒª½øÒ»²½¶¨ÖÆ£¬Äã¿ÉÒԼ̳ÐJdbcDaoImpl¡£Çë²Î¿¼JavaDocs»ñÈ¡ÏêÇ飬²»¹ýÇë×¢ÒâÕâ¸öÀಢ²»ÊÇΪÁ˸´ÔÓµÄ×Ô¶¨Òå¼Ì³Ð¶øÐ´µÄ¡£Èç¹ûÄãµÄÐèÇó±È½Ï¸´ÔÓ(ÀýÈçÊý¾Ý¿â½á¹¹±È½ÏÌØÊâ»òÕßÐèÒª·µ»ØÒ»¸öÌØ¶¨µÄUserDetailsʵÏÖ)£¬ÄÇôÄã×îºÃд×Ô¼ºµÄUserDetailsServiceʵÏÖ¡£Acegi SecurityÌṩµÄ»ù´¡ÊµÏÖÖ»ÊÇΪÁ˵äÐͳ¡¾°£¬²¢Ã»ÓÐÌṩÎÞÏÞµÄÅäÖÃÁé»îÐÔ¡£
6.3. ²¢ÐÐConcurrent Session ´¦Àí
Acegi SecurityÄܹ»ÏÞ¶¨´ÎÊý·ÀÖ¹Ò»¸öprincipal¶à´Î²¢ÐÐÈÏÖ¤µ½Í¬Ò»¸öÓ¦Óá£Ðí¶àISVÀûÓÃÕâÒ»µãÀ´¼ÓÇ¿ÊÚȨ¹ÜÀí£¬Íø¹ÜҲϲ»¶Õâ¸öÌØÐÔÒòΪ¿ÉÒÔ·ÀÖ¹Ò»¸öÓû§Ãû±»Öظ´Ê¹Óá£ÀýÈ磬Äã¿ÉÒÔÏÞÖÆ“Batman”Óû§´ÓÁ½¸ö²»Í¬µÄsessionµÇ¼ϵͳ¡£
ʹÓò¢ÐÐsessionÖ§³Ö£¬ÄãÐèÒªÔÚweb.xmlÖÐÔö¼ÓÈçÏÂÄÚÈÝ£º
xml ´úÂë
- <listener>
- <listener-class>org.acegisecurity.ui.session.HttpSessionEventPublisher</listener-class>
- </listener>
¶øÇÒ£¬ÄãÐèÒªÔÚÖÐFilterChainProxyÔö¼Óorg.acegisecurity.concurrent.ConcurrentSessionFilter to your FilterChainProxy¡£ConcurrentSessionFilterÐèÒªÁ½¸öÊôÐÔ£¬sessionRegistryÓÃÀ´Ö¸ÏòÒ»¸öSessionRegistryImplʵÀý£¬expiredUrlÖ¸ÏòÒ»¸ösessionʵЧʱÏÔʾµÄÒ³Ãæ¡£
µ±Ò»¸öHttpSession¿ªÊ¼»òÕß½áÊøµÄʱºòweb.xml HttpSessionEventPublisher·¢ËÍÒ»¸öApplicationEventµ½Spring ApplicationContext¡£ÕâºÜ¹Ø¼ü£¬ÒòΪËüÈ·±£sessionÖÕÖ¹µÄʱºòSessionRegistryImpl»áÊÕµ½Í¨Öª¡£
Ä㻹ҪװÅäConcurrentSessionControllerImpl²¢ÔÚProviderManagerÖÐÒýÓãº
xml ´úÂë
- <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
- <property name="providers">
- <!-- your providers go here -->
- </property>
- <property name="sessionController"><ref bean="concurrentSessionController"/></property>
- </bean>
- <bean id="concurrentSessionController"
- class="org.acegisecurity.concurrent.ConcurrentSessionControllerImpl">
- <property name="maximumSessions"><value>1</value></property>
- <property name="sessionRegistry"><ref local="sessionRegistry"/></property>
- </bean>
- <bean id="sessionRegistry" class="org.acegisecurity.concurrent.SessionRegistryImpl"/>
AuthenticationTagÖ»ÊÇÓÃÀ´°ÑprincipalµÄAuthentication.getPrincipal()¶ÔÏóµÄÊôÐÔÏÔʾµ½webÒ³Ãæ¡£
ÏÂÃæµÄJSPƬ¶ÎչʾÁËÈçºÎʹÓÃAuthenticationTag£º
java ´úÂë
- <authz:authentication operation="username"/>
Õâ¸ö±êÇ©½«»áÏÔʾpricipalµÄÃû×Ö¡£ÕâÀïÎÒÃǼÙÉèAuthentication.getPrincipal()ÊÇÒ»¸öUserDetails¶ÔÏó£¬ÕâÔÚʹÓõäÐ͵ÄDaoAuthenticationProviderʱºòµÄÒ»°ã×´¿ö¡£
°²»ÕлªµçÄÔѧУרҵְҵ¹æ»®Ê¦ÎªÄãÌṩ¸ü¶à°ïÖú¡¾ÔÚÏß×Éѯ¡¿