Ê×Ò³ Ê«´Ê ×Öµä °å±¨ ¾ä×Ó ÃûÑÔ ÓÑ´ð ÀøÖ¾ ѧУ ÍøÕ¾µØÍ¼
µ±Ç°Î»ÖÃ: Ê×Ò³ > ½Ì³ÌƵµÀ > Èí¼þ¹ÜÀí > Èí¼þ¼Ü¹¹Éè¼Æ >

Spring Security Acegi ѧϰ֮·3 (ת)

2012-09-22 
Spring Security Acegi ѧϰ֮·Èý (ת)Éí·ÝÈÏÖ¤¹ÜÀí??ʹÓÃAcegi±£»¤Ó¦ÓóÌÐòµÄµÚÒ»²½ÊǸù¾ÝÓû§ÌṩµÄÈÏ

Spring Security Acegi ѧϰ֮·Èý (ת)

Éí·ÝÈÏÖ¤¹ÜÀí

?

?

ʹÓÃAcegi±£»¤Ó¦ÓóÌÐòµÄµÚÒ»²½ÊǸù¾ÝÓû§ÌṩµÄÈÏÖ¤ÐÅÏ¢½øÐÐÉí·ÝÈÏÖ¤£¬ÒÔÈ·¶¨Óû§µÄÉí·Ý»ñÈ¡¶ÔÓ¦µÄȨÏÞÐÅÏ¢×¼±¸ºÃAuthentication¡£Í¨¹ýÈÏÖ¤µÄAuthenticationÓµÓÐȨÏÞÐÅÏ¢£¬ËüÊÇAcegi½øÐкóÐø°²È«¶ÔÏó·ÃÎʰ²È«¿ØÖƵÄÒÀ¾Ý¡£

?

»ùÓÚÄÚ´æ´æ´¢Óû§ÐÅÏ¢µÄÉí·ÝÈÏÖ¤

?

applicationContext-acegi-plugin.xml

?

<bean id="filterChainProxy" authenticationProcessingFilter " value="/j_acegi_security_check"/> <property name="defaultTargetUrl" value="/main.jsp"/> <property name="authenticationFailureUrl" value="/index.jsp?login_error=1"/></bean>

?

Ìí¼ÓµÇÂ¼Ò³Ãæindex.jsp£º

?

<%@ taglib prefix=¡±c¡± uri=http://java.sun.com/jsp/jstl/core%¡±><form name="form1" method="post" action="<c:url value="/j_acegi_security_check"/>">Óû§Ãû£º<input type="text" name="j_username"/><br/>ÃÜ Â룺<input type="password" name="j_password"/><br/> <input type="submit" value="µÇ¼"/></form>

?

applicationContext-acegi-plugin.xml : ÈÏÖ¤¹ÜÀíÆ÷µÄÅäÖÃ

?

<bean id="authenticationProcessingFilter"value="/j_acegi_security_check"/> <!--ÈÏÖ¤³É¹¦ºóתÏòµÄURL --> <property name="defaultTargetUrl" value="/main.jsp"/> <!--ÈÏ֤ʧ°ÜºóתÏòµÄURL --> <property name="authenticationFailureUrl" value="/index.jsp?login_error=1" /> <!--×¢ÈëÈÏÖ¤¹ÜÀíÆ÷ --> <property name="authenticationManager" ref="authenticationManager"/></bean><bean id="authenticationManager"/> </list> </property></bean><bean id="daoAuthenticationProvider"ref="userDetailsService" /></bean><bean id="userDetailsService"style="">?? AcegiÌṩÁ˲»Í¬µÄAuthenticationProviderµÄʵÏÖ,È磺

?DaoAuthenticationProvider ´ÓDaoÀฺÔð¶ÁÈ¡Óû§ÐÅÏ¢ÑéÖ¤Éí·Ý?AnonymousAuthenticationProvider ÄäÃûÓû§Éí·ÝÈÏÖ¤?RememberMeAuthenticationProvider ÒÑ´æcookieÖеÄÓû§ÐÅÏ¢Éí·ÝÈÏÖ¤?AuthByAdapterProvider ʹÓÃÈÝÆ÷µÄÊÊÅäÆ÷ÑéÖ¤Éí·Ý?CasAuthenticationProvider ¸ù¾ÝYaleÖÐÐÄÈÏÖ¤·þÎñÑéÖ¤Éí·Ý, ÓÃÓÚʵÏÖµ¥µãµÇ½?JaasAuthenticationProvider ´ÓJASSµÇ½ÅäÖÃÖлñÈ¡Óû§ÐÅÏ¢ÑéÖ¤Éí·Ý?RemoteAuthenticationProvider ¸ù¾ÝÔ¶³Ì·þÎñÑéÖ¤Óû§Éí·Ý?RunAsImplAuthenticationProvider ¶ÔÉí·ÝÒѱ»¹ÜÀíÆ÷Ìæ»»µÄÓû§½øÐÐÑéÖ¤?X509AuthenticationProvider ´ÓX509ÈÏÖ¤ÖлñÈ¡Óû§ÐÅÏ¢ÑéÖ¤Éí·Ý?TestingAuthenticationProvider µ¥Ôª²âÊÔʱʹÓÃ

DaoAuthenticationProviderͨ¹ýUserDetailsServiceÍê³ÉUserDetailsµÄ»ñÈ¡¹¤×÷£¬¸ù¾Ý´æ´¢Óû§ÐÅϢý½éµÄ²»Í¬£¬AcegiÌṩÁËÁ½¸öUserDetailsServiceµÄʵÏÖÀࣺ

?

InMemoryDaoImpl£º¸ÃʵÏÖÀฺÔð´ÓÄÚÔÚÖлñÈ¡Óû§µÄÐÅÏ¢JdbcDaoImpl:¸ÃʵÏÖÀà´ÓÊý¾Ý¿âÖлñÈ¡Óû§µÄÐÅÏ¢

Èç¹ûÓû§Êý±È½Ï¶à£¬ÔÚSpringÖÐÖ±½Ó½øÐÐÅäÖÃδÃⲻ̫ÑŹۣ¬Õâʱ£¬¿ÉÒÔ½«Óû§ÐÅÏ¢×ªÒÆµ½Ò»¸öÊôÐÔÎļþÖУ¬²¢Í¨¹ýuserProperties½øÐмÓÔØ£¬ÔòÐè¶ÔuserDetailsServiceÉÔ×öÐÞ¸Ä

?

<bean id="userDetailsService"value="/WEB-INF/users.properties"/></bean></property></bean>?

?

?»ùÓÚÊý¾Ý¿â´æ´¢Óû§ÐÅÏ¢µÄÈÏÖ¤

?

?

<bean id="userDetailsService"ref="dataSource" /> <property name="usersByUsernameQuery"> <value> <!--¸ù¾ÝÓû§Ãû²éѯÓû§µÄSQLÓï¾ä--> SELECT username,password,status FROM t_user WHERE username = ? </value> </property> <property name="authoritiesByUsernameQuery"> <value> <!--¸ù¾ÝÓû§Ãû²éѯÓû§È¨Ï޼ǼµÄSQLÓï¾ä--> SELECT u.username,p.priv_name FROM t_user u,t_user_privp WHERE u.user_id =p.user_id AND u.username = ? </value> </property></bean>?

?? ? Ó¦¸Ã˵JdbcDaoImpl»¹²»ÊǷdz£ÊµÓõÄUserDetailsServiceʵÏÖÀ࣬ÒòΪÓû§¶ÔÏó³ý°üº¬Óû§Ãû/ÃÜÂë¡¢ÊÇ·ñ¼¤»î¡¢È¨ÏÞµÈÐÅÏ¢Í⣬»¹¾­³£ÐèÒª°üº¬Ò»Ð©ÖîÈçemail¡¢telephoneµÈµ½ÒµÎñÏà¹ØµÄÐÅÏ¢£¬ËùÒÔÎÒÃÇÍùÍùÐèҪͨ¹ýʵÏÖUserDetailsService½Ó¿ÚÌṩ×Ô¼ºµÄµÄʵÏÖÀàÀ´Íê³ÉÕâЩ¹¤×÷¡£

?? ? ¾ßÌå¿ÉÒÔ²ÎÕÕ£ºSpring Security 2 ÅäÖþ«½²:? http://www.iteye.com/topic/319965

?

?


ÔÚ»ñÈ¡UserDetailsºó£¬DaoAuthenticationProviderÒª×öµÄ¹¤×÷ÊDZȽÏAuthentication ºÍUserDetailsµÄÆ¥Åä¹ØÏµ²¢¸ø³öÈÏÖ¤³É¹¦»òʧ°ÜµÄÈÏÖ¤½á¹û¡£ÏÂÃæÊÇÁ½¸ö¹Ø¼ü½Ó¿Ú£º

?

org.acegisecurity.providers.encoding.PasswordEncoderorg.acegisecurity.providers.dao.SaltSource

?

?? ?PasswordEncoderÍê³ÉÁ½¼þ¹¤×÷£º

?

?? ¶ÔÃ÷ÎĵÄÃÜÂ루Authentication#getCredentials()£©½øÐбàÂë?? ¶Ô´¦ÓڷǶԳÆ×´Ì¬£¨Ò»¸öÊǼÓÃܵģ¬ÁíÒ»¸öÊÇÃ÷Îĵģ©

?

?? ?PasswordEncoder½øÐÐÃÜÂë±È½Ïʱ£¬ÐèҪʹÓõ½Ò»¸öSaltSource,Ëü´ú±íÒ»¸ö¡°¼ÓÃÜÑΡ±£¬¶ÔÓû§ÌṩµÄÃÜÂë½øÐмÓÃÜʱ²ÉÓõļÓÃÜÑαØÐëºÍϵͳÖб£´æµÄÓû§¼ÓÃÜÃÜÂëËù²ÉÓõļÓÃÜÑÎÏàͬ¡£ËüÓÐÁ½¸ö½Ó¿Ú·½·¨£º??

String encodePassword(String rawPass, Object salt) //¶Ôԭʼδ¼ÓÃܵÄÃÜÂëͨ¹ýÒ»¶¨µÄËã·¨½øÐмÓÃÜÔËËã Boolean isPasswordValid(String encPass, String rawPass, Object salt) //ͨ¹ýËã·¨ÅжϴýÈÏÖ¤Óû§ËùÌṩµÄÃÜÂëÊÇ·ñÓÐЧ

?

?? ?¼¸ÖÖ³£µÄPasswordEncoderʵÏÖÀ࣬ÃÜÂë±àÂëÆ÷

Md5PasswordEncoder?? ʹÓÃMD5Ëã·¨¼ÓÃÜShaPasswordEncoder?? ʹÓÃSHAËã·¨¼ÓÃÜLdapShaPasswordEncoder??? ʹÓÃLDAP SHA ºÍƽSSHAËã·¨¼ÓÃÜPlaintextPasswordEncoder??? ²»¼ÓÃÜ

SaltSource½Ó¿Ú¹«ÓÐÒ»¸öObject gestalt(UserDetails user)·½·¨£¬ËüÓÐÁ½¸öʵÏÖÀࣺ

org.acegisecurity.providers.dao.salt.ReflectionSaltSource:ÔÊÐíÓû§ÔÚUserDetailsÖÐÌṩһ¸ö´ú±í¼ÓÃÜÑεÄÊôÐÔ

org.acegisecurity.providers.dao.salt.SystemWideSaltSource£º¸ÃʵÏÖÀ಻ÔÊÐí²»Í¬Óû§²ÉÓø÷×ԵļÓÃÜÑΣ¬Ëü²ÉÓÃÈ«¾Ö·¶Î§Í³Ò»µÄ¼ÓÃÜÑΡ£

?

applicationContext-acegi-plugin.xml :?

<bean id="daoAuthenticationProvider"ref="userDetailsService" /> <property name="passwordEncoder"> <bean value="ccd1010"/> </bean> </property></bean>?

?

³É¹¦µÇ¼ϵͳµÄºóÖô¦Àí

?

?

?? ? Ò»°ãµÄÒµÎñϵͳÔÚÓû§µÇ¼³É¹¦ºó£¬ÐèÒªÔÚÊý¾Ý¿âÖмǼһÌõÏàÓ¦µÄÓû§µÇ¼ÈÕÖ¾¡£Acegi»á²úÉúÒ»¸öAuthenticationSuccessEventʼþ£¬¸ÃʼþÊÇorg.springframework.context.ApplicationEventµÄ×ÓÀ࣬ËùÒÔËüÊÇÒ»¸öSpringÈÝÆ÷ʼþ¡£

?

package com.ccd.service;import org.acegisecurity.Authentication;import org.acegisecurity.event.authentication.AuthenticationSuccessEvent;import org.springframework.context.ApplicationEvent;import org.springframework.context.ApplicationListener;public class LoginSuccessListener implements ApplicationListener{public void onApplicationEvent(ApplicationEvent event){if(event instanceof AuthenticationSuccessEvent){AuthenticationSuccessEvent authEvent = (AuthenticationSuccessEvent) event;Authentication auth = authEvent.getAuthentication();String username = auth.getName();System.out.println(¡°Ä£Äâ¼Ç¼Óû§[¡±+username+¡±]³É¹¦µÇ¼ÈÕÖ¾...¡±);}}}

?? ? ??½ÓÏÂÀ´£¬ÔÚSpringÈÝÆ÷ÖÐÉùÃ÷Õâ¸ö¼àÌýÆ÷£¬½öÐèÒªÒ»ÐоͿÉÒÔÁË£º

?

?? ? ? ? <bean class=¡±com.ccd.service.LoginSuccessListener¡±/>

?

?

ÔÚ¶à¸öÇëÇóÖ®¼ä¹²ÏíSecurityContext

?

Acegiͨ¹ýHttpSessionContextIntegrationFilterʹSecurityContextÔÚSession¼¶±ðÖй²Ïí£¬µ±Ò»¸öÇëÇóµ½´ïʱ£¬Ëü³¢ÊÔ´ÓSessionÖлñÈ¡Óû§¹ØÁªµÄSecurityContext²¢½«Æä·ÅÈëµ½SecurityContextHolderÖУ¬µ±ÇëÇó½áÊøÊ±£¬HttpSessionContextIntegrationFilterÓÖ½«SecurityContextת´æµ½HttpSessionÖС£ÕâÑù£¬Acegi¾Íͨ¹ýHttpSessionContextIntegrationFilter½«SecurityContext¶ÔÏóÔÚÇëÇó¼¶µÄSecurityContextHolderºÍSession¼¶µÄHttpSessionÖаڶɣ¬´Ó¶ø±£Ö¤SecurityContext¿ÉÒÔÔÚ¶à¸öÇëÇóÖ®¼ä¹²Ïí¡£×¢Ò⣬´Ëfilter±ØÐëÓÚÆäËûAcegi FilterǰʹÓá£

?

applicationContext-acegi-plugin.xml :

?

<bean id="filterChainProxy" />?

Í˳öϵͳµÄºóÖô¦Àí

?

?? ?SecyrityContext±£´æÔÚHttpSessionÖУ¬µ±Óû§Í˳öϵͳʱ±ØÐëÇå³ýÖ®£¬·ñͬҪµÈµ½Session¹ýÆÚºó²Å»á±»Çå³ý£¬Ôì³É¶îÍâµÄÄÚ´æÏûºÄ¡£AcegiΪÍê³ÉһϵÁÐÓÉÍ˳öϵͳÒý·¢µÄ²Ù×÷£¬×¨ÃÅÌṩÁËÒ»¸öÍ˳ö¹ýÂËÆ÷£ºorg.acegisecurity.ui.logout.LogoutFilter¡£

?

applicationContext-acegi-plugin.xml :

?

<bean id="filterChainProxy" /> </list> </constructor-arg> <!¡ªÍ˳öϵͳºóתÏòµÄURL --> <constructor-arg value="/index.jsp" /> <!¡ªÓÃÓÚÏìÓ¦Í˳öϵͳÇëÇóµÄURL--> <property name="filterProcessesUrl" value="/j_acegi_logout" /></bean>

?? ? ?ÅäÖÃÒ»¸öÍ˳öϵͳµÄ²Ù×÷Á´½Ó

?

?? ?<Ahref= "<c:url value="/j_acegi_logout"/>">Í˳öϵͳ</A>

?

ʵʩRemember-MeÈÏÖ¤

?

ÈȵãÅÅÐÐ