javajohn

          金色年華

          acegi源碼學習之用戶登錄篇

          acegi 源碼學習之用戶登錄篇

          一、查看 applicationContext-acegi-security.xml 配置文件,涉及到登錄的配置為:

          ?1

          < bean id = "authenticationProcessingFilter" class = "org.javajohn.test.plugins.security.UserAuthenticationProcessingFilter" >

          ??????? < property name = "authenticationManager" ref = "authenticationManager" />

          ??????? < property name = "authenticationFailureUrl" >

          ??????????? < value > /login.jsp?login_error=1 </ value >

          ??????? </ property >

          ??????? < property name = "defaultTargetUrl" >

          ??????????? < value > /index.jsp </ value >

          ??????? </ property >

          ??????? < property name = "filterProcessesUrl" >

          ??????????? < value > /j_acegi_security_check </ value >

          ??????? </ property >

          ??????? < property name = "userManager" ref = "userManager" />

          ??????? < property name = "rememberMeServices" ref = "rememberMeServices" />

          ??????? < property name = "exceptionMappings" >

          ??????????? < value >

          ??????????????? org.acegisecurity.AuthenticationException=/login.jsp?login_error=user_psw_error

          ??????????????? org.acegisecurity.concurrent.ConcurrentLoginException=/login.jsp?login_error=too_many_user_error

          ??????? ???? </ value >

          ??????? </ property >

          </ bean >

          ?

          ?

          2 < 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 = "javajohnKey" />

          ????????????? </ bean >

          ????????????? < bean class = "org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider" >

          ????????????????? < property name = "key" value = "javajohnKey" />

          ????????????? </ bean >

          ?????????? </ list >

          ?????? </ property > ??

          ??? </ bean >

          ?

          3

          < bean id = "daoAuthenticationProvider" class = "org.acegisecurity.providers.dao.DaoAuthenticationProvider" >

          ?????? < property name = "userDetailsService" ref = "jdbcDaoImpl" />

          ?????? < property name = "userCache" >

          ?????????? < bean class = "org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache" >

          ????????????? < property name = "cache" >

          ????????????????? < bean class = "org.springframework.cache.ehcache.EhCacheFactoryBean" >

          ???????????????????? < property name = "cacheManager" >

          ???????????????????????? < bean class = "org.springframework.cache.ehcache.EhCacheManagerFactoryBean" />

          ???????????????????? </ property >

          ???????????????????? < property name = "cacheName" value = "userCache" />

          ????????????????? </ bean >

          ????????????? </ property >

          ?????????? </ bean >

          ?????? </ property >

          ?????? < property name = "passwordEncoder" ref = "passwordEncoder" />

          ??? </ bean >

          ?

          ?

          4 < bean id = "jdbcDaoImpl"

          ????????? class = "org.acegisecurity.userdetails.jdbc.JdbcDaoImpl" >

          ??????? < property name = "dataSource" ref = "dataSource" />

          ??????? < property name = "usersByUsernameQuery" >

          ??????????? < value >

          ??????????????? select loginid,passwd,1 from users where status='1' and loginid = ?

          ??????????? </ value >

          ??????? </ property >

          ??????? < property name = "authoritiesByUsernameQuery" >

          ??????????? < value >

          ??????????????? select u.loginid,p.name from

          ??????????????? users u,roles r,permissions p,user_role ur,role_permis rp

          ??????????????? where

          ??????????????? u.id=ur.user_id and

          ??????????????? r.id=ur.role_id and

          ??????????????? p.id=rp.permis_id and

          ??????????????? r.id=rp.role_id and

          ??????????????? p.status='1' and u.loginid=?

          ??????????? </ value >

          ??????? </ property >

          </ bean >

          ?

          ?

          二、程序流程:

          1 .登錄的時候執行的過濾為 authenticationProcessingFilter ,查看其實現為 org.bookStore.test.plugins.security.UserAuthenticationProcessingFilter ,該類繼承自 org.acegisecurity.ui.webapp.AuthenticationProcessingFilter ,又繼承自 org.acegisecurity.ui.AbstractProcessingFilter ,這時候看到了 doFilter() 該方法取了 web 層傳過來的 request response ,然后對登錄路徑執行了判斷等操作,接下來執行至 authResult = attemptAuthentication(httpRequest);

          2 .從類繼承關系上找到該方法的實現來自 AuthenticationProcessingFilter ,執行的邏輯為先取出 web 層傳過來的用戶名和密碼接著將得到的信息包裝為 UsernamePasswordAuthenticationToken

          public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {

          ??? super ( null );

          ??? this . principal = principal;????

          ??? this . credentials = credentials;

          ??? setAuthenticated( false );

          }

          3 .接下來執行了 setDetails(request, authRequest); request 實例賦給 authRequest 的屬性。

          4 .調用 authenticationManager authenticate(authRequest) 方法。

          5 .程序轉至 authenticationManager 內執行。該類繼承自 org.acegisecurity. AbstractAuthenticationManager ,執行方法 authenticate(authRequest)

          public final Authentication authenticate(Authentication authRequest)

          ??? throws AuthenticationException {

          ??? try {

          ??????? Authentication authResult = doAuthentication(authRequest);

          ??????? copyDetails(authRequest, authResult);

          ?

          ??????? return authResult;

          ??? } catch (AuthenticationException e) {

          ??????? e.setAuthentication(authRequest);

          ??????? throw e;

          ??? }

          }

          doAuthentication(authRequest) 來自 ProviderManager 該方法執行了其 providers 中的方法 authenticate(Authentication authentication)

          6 .此方法中調用了 retrieveUser(username, (UsernamePasswordAuthenticationToken) authentication) 該方法內按 web 層用戶輸入的用戶名和密碼從數據庫內比較是否有該用戶,如果有則將其 user 表內對應的信息包裝為 UserDetail( 接口 , 實際為 User 的實例 ) List 對象,并將該用戶相應的權限包裝為 GrantedAuthorityImpl 對象的 List 集合對象。至此程序返回至( 3. )繼續執行

          7 .繼續執行 org.acegisecurity.ui.AbstractProcessingFilter successfulAuthentication(

          HttpServletRequest request,

          HttpServletResponse response,

          Authentication authResult){

          ??? ......

          SecurityContextHolder.getContext().setAuthentication(authResult);// 將包裝好的 UsernamePasswordAuthenticationToken 對象保存至系統上下文

          ......

          }

          8 .登錄執行完畢。

          posted on 2006-12-06 17:33 javajohn 閱讀(1973) 評論(3)  編輯  收藏 所屬分類: 其他類

          Feedback

          # re: acegi源碼學習之用戶登錄篇 2006-12-07 14:51

          最近在學習這個東西
          老兄多分析一下 跟進學習  回復  更多評論   

          # re: acegi源碼學習之用戶登錄篇 2007-02-06 16:07 mircle_wang

          正在 學習中 請問 它對數據庫的建表有什么特別的限制嗎?
          權限

            回復  更多評論   

          # re: acegi源碼學習之用戶登錄篇 2009-03-10 11:07 陳一

          這個不錯~ 我剛好在找這個! 在這謝過!  回復  更多評論   


          My Links

          Blog Stats

          常用鏈接

          留言簿(7)

          隨筆分類(36)

          隨筆檔案(39)

          classmate

          good blog

          企業管理網站

          好友

          站點收藏

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 平罗县| 兰考县| 班戈县| 涟水县| 株洲县| 平度市| 林西县| 泾川县| 崇礼县| 甘南县| 小金县| 会宁县| 将乐县| 昭通市| 双柏县| 灵台县| 武隆县| 咸丰县| 梁平县| 赫章县| 玛沁县| 卓尼县| 安陆市| 稷山县| 启东市| 班玛县| 咸宁市| 道真| 兴文县| 霍林郭勒市| 荆州市| 山阳县| 福安市| 綦江县| 靖边县| 离岛区| 张家口市| 呈贡县| 庐江县| 阳新县| 恩平市|