spring security30自定義表結(jié)構(gòu)_第1頁
spring security30自定義表結(jié)構(gòu)_第2頁
spring security30自定義表結(jié)構(gòu)_第3頁
spring security30自定義表結(jié)構(gòu)_第4頁
spring security30自定義表結(jié)構(gòu)_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

SpringSecurity3.0前面講到了SpringSecurity3的基礎(chǔ)知識。在實際項目中一般是將認(rèn)證和信息存放在數(shù)據(jù)庫中。SpringSecurity也提供了數(shù)據(jù)庫表結(jié)構(gòu),但是這些數(shù)據(jù)庫表結(jié)構(gòu)往往SpringSecurity戶名當(dāng)SpringSecurity框架確認(rèn)之后,生成安全實體對象。安全實體對象可以簡單的url資源,其二應(yīng)用系統(tǒng)中的業(yè)務(wù)方法的執(zhí)行??偨Y(jié)出來就是有沒有權(quán)限某個url 狀態(tài)(0禁用,1可用 admin用戶擁有ROLE_ADMINROLE_NORMAL角色其它用戶只擁有ROLE_NORMAL角色resource 資源的資源的ROLE_NORMARL角色可以執(zhí)行/user_list*其它需要ROLE_ADMIN才能操作因為SpringSecurity3中用到了Spring3中的一些特性,如Spring3中的的SpringSpring 配置這里設(shè)置了默認(rèn)的登錄頁 /login.jsp,一旦登錄失敗之后跳轉(zhuǎn)的頁 對登錄頁面/login.jsp不進(jìn)行過濾default-target-url="/user_list.do"/>

/login.jsp頁面。這里定義了兩個類樣式選擇器,一個是“error”,一個是”errorhide”,根據(jù)不同情況<divclass="error${param.error==true?'':<inputtype="text"name="j_username"<br<br<div

MVCuser_list.doServletindex.jsp,在這個頁面上顯示歡迎信息Servlet中的代碼:publicpublicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{this.doPost(request,}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{}<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01可以看到user的信息交給了userService,userService交給了authenticationProvider,最后authenticationproviderauthenticationmanager認(rèn)證管理器。關(guān)authenticationProviderauthenticationprovider我們不用關(guān)注,我們只需要關(guān)publicpublicinterfaceUserDetailsServicethrowsUsernameNotFoundException, }SpringSecurity出用戶以及它的權(quán)限信息,然后封裝成UserDetails格式的對象即可。那么如何實現(xiàn)呢?在參考文檔的6.2章節(jié)提到,對于UserDetailsService接口,SpringSecurity已經(jīng)有兩個實現(xiàn)類了,分別是:InMemoryDaoImpl和JdbcDaoImpl.Security提供的數(shù)據(jù)庫表結(jié)構(gòu)用戶數(shù)據(jù)進(jìn)行認(rèn)證。我們編寫自己的UserDetailService的時候可以參考它們的寫法。(包中提供了源代碼)。通過UserDetailsUser。所以我們接下來要做的事情就是仿照框架的實現(xiàn)代碼來定義自己的UserDetail接口的實現(xiàn)類和UserDetailService接口的實現(xiàn)類publicclassUserimplementsUserDetails{publicclassUserimplementsUserDetails{privateintid;privateStringname;privateStringpassword;privateintstate;privateStringdesc;privateList<Role>roles;gettersetter}…publicString{return…publicString{return}publicString{return}publicboolean{return}publicboolean{return}publicboolean{return}publicbooleanisEnabled()//TODOAuto-generatedmethodstubreturnthis.state==0?false:true;}//獲取用戶權(quán)限集合,權(quán)限使用GrantedAuthority接口表示,框架中有它的實現(xiàn)類publicCollection<GrantedAuthority>get (){List<GrantedAuthority>list=newArrayList<GrantedAuthority>();for(Rolerole:roles){list.add(new}return}publicpublicclass{privateintid;privateStringname;privateStringdesc;}<beanid<beanid="dataSource"<propertyname="url"這里使用了SpringJDBC組件來數(shù)據(jù)庫,不管使用哪種方式數(shù)據(jù)庫,只要得到用戶對象以及填充User類中的Roles集合就可以publicpublicinterfaceUserDAOpublicUserfindUserByName(String}UserDAImplUserDAO接口,從SpringjdbcJdbcDAOSupport承,為的是使用Springjdbc組件中的jdbcTemte模板類publicclassUserDAOImplextendsJdbcDaoSupportUserDAO{privateLoggerprivateList<Role>getRolesByUserID(StringStringsql="SELECTr.id,,r.descFROMUSERu,roler,user_roleurWHEREu.id=ur.user_idANDr.id=ur.role_idANDu.username=?";returngetJdbcTemte().query(sql,newString[]{username},newRowMapper<Role>(){publicRolemapRow(ResultSetrs,introwNum)throws{Rolerole=newRole();return}}publicUserfindUserByName(finalStringname)Stringsql="select`id`,`username`,`PASSWORD`,`STATUS`,`DESC`FROM`user`whereusername=?";Useruser=null;user=this.getJdbcTemte().queryForObject(sql,newObject[]{name},newpublicUsermapRow(ResultSetrs,introwNum)throws{Useruser=newUser();returnuser;}ex){}}return}}在定義UserService接口的時候,我們讓它繼承SpringSecurity中的UserDetailsService接口,而UserService實現(xiàn)UserSerivce接口,在實現(xiàn)類中通過UserDAO獲取用戶信息。在獲取用戶信息之后,將用戶信息轉(zhuǎn)換為SpringSecurity框架publicinterfacepublicinterfaceUserServiceextends}publicpublicclassUserServiceImplimplements{privateUserDAOpublicvoidsetUserDAO(UserDAO{this.userDAO=}publicUserDetailsloadUserByUsername(String {User}returnuser;}}applicationContext.xmlUserDAO和UserService。將DataSource注入到UserDAO,UserDAO注入UserService。UserDAO注入DataSource<beanid="userDAO"中的配置因為有了自己的UserDetailsService組件,替換掉SpringSecurity<form-loginlogin="/login.jsp" auto-config=”true”>的配置的背后FilterSecurityInterceptor,這一點可以參看SpringSecurity參考文檔的第8.1章節(jié).它負(fù)責(zé)處理HTTP資源的安全。我們需要為其注入3個屬性才能工作:securityMetadataSourceintercept-url它實現(xiàn)了javax.servlet.Filter接口,是一個標(biāo)準(zhǔn)的Servlet過濾器 SecurityInterceptor繼承而來,定義了securityMetadataSource,并提供了getter/setter方法。而 中定義了accessDecisionManager屬性,并提供getter/setter方法,類型為AccessDecisionManager(接口),還有authenticationManager屬性,并提供了getter/setter方法,類型為AuthenticationManager(接口).過濾器中三個主要屬性都找查詢FilterInvocationSecurityMetadataSourceAPI,知道SpringSecurity框架已經(jīng)有兩個類實現(xiàn)了該接口DefaultFilterInvocationSecurityMetadataSource,于SpEL(springEL表達(dá)式)的。即:查詢AccessDecisionManager的API,我們知道SpringSecurity個參數(shù)就是資源的配置屬性集合。其中ConfigAttribute其實就是當(dāng)前正在的資源的配上面的三個類都實現(xiàn)了這個方法,只是判定的方式不同,假個資/list_user.do這個資源配置了兩個角色ROLE_ADMIN,和ROLE_NORMAL,而當(dāng)前正在ROLE_NORMALAffirmativeBased:資源配置了N個角色,而當(dāng)前用戶只需要擁有其中一個角色即可通過ConsensusBased:資源配置了N個角色,而當(dāng)前用戶擁有其中m個,如果m>=n/2,則實現(xiàn)類RoleVoter就是其中一個。所以要想讓這些類工作必須為他們設(shè)定AccessDecisionVoter,實際上在AffirmativeBased,ConsensusBased, 啟了SpringSecurityEL,則實例化ExpressionBasedFilterInvocationSecurityMetadataSourcexml當(dāng)用戶要某個URL的時候,如”user_list.do”,那么過濾器請求,在SecurityMetadataSource中查找與user_list.do對應(yīng)的權(quán)限配置,假如我們配置的是接著開始調(diào)用accessDecisionManager的decide方法,將當(dāng)前的用戶信息,資源配置信息傳入進(jìn)行判斷當(dāng)前用戶是否有權(quán)限資源,如果沒有則拋出異常FilterInvocationSecurityMetadataSource定義ResourceDAOResourceDAOImplResourcepublicpublicclass{privateintid;privateStringname;privateStringurl;privateList<Role>roles=newgettersetter}publicpublicinterfaceResourceDAOpublicList<Resource>}publicpublicclassResourceDAOImplextendsJdbcDaoSupportimplements{publicList<Resource>getAllResource()List<Resource>Stringsql="SELECT*from te().query(sql,newRowMapper<Resource>(){publicResourcemapRow(ResultSetrs,intarg1)throwsSQLException{Resourceresource=newResource();return}return}privateList<Role>getRoleByResourceId(intStringsql="SELECTr.id,,r.descFROMroler,role_resourcerrWHERErr.role_id=r.idANDrr.resource_id=?";returnthis.getJdbcTem te().query(sql,newObject[]{id},newpublicRolemapRow(ResultSetrs,intarg1)throws{Rolerole=newRole();returnrole;}}}實現(xiàn)接口首先定義一個接口,ResourceServiceFilterInvocationSecurityMetadataSourcepublicpublicinterfaceResourceServiceextendsFilterInvocationSecurityMetadataSource} @throws voidinit()throwsExceptionfor(Resource}}@paramroles){List<ConfigAttribute>list=newfor(Rolerole:roles)list.add(new}return} publicCollection<ConfigAttribute>getAttributes(Objectobject)throwsIllegalArgumentException{Stringurl=((FilterInvocation)object).getRequestUrl();if(logger.isDebugEnabled()){ } tor<String>it=resourceMap.keySet().i while(it.hasNext()){StringresURL=改returnreturnCollection;}}return}publicpublicbooleansupports(Class<?>{return}{Set<ConfigAttribute>allAttributes=new{}return}applicationContext.xmlResourceDAO和ResourceService注意需要調(diào)用初始化方

resourceDAO注入DataSourceresourceService注入resourc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論