當前位置:首頁 » 密碼管理 » springsecurity密碼加密

springsecurity密碼加密

發布時間: 2022-06-09 10:35:12

『壹』 怎麼用spring security

Spring Security如何控制許可權概要 Spring使用由Filter組成的Chain,來判斷許可權。如下圖所示:<!--[if !vml]--><!--[endif]-->Spring預定義了很多out-of-boxed filter供開發者直接使用。每個Filter一般情況下(有些Filter是abstract的),都和配置文件的一個元素(有的情況下可能是屬性)對應。比如:AUTHENTICATION_PROCESSING_FILTER,對應配置文件裡面的:http/form-login元素。 如果Spring提供的Filter不能滿足系統的許可權功能,開發者可以自定義Filter,然後把Filter放在某個Filter Chain的某個位置。可以替換掉原有Filter Chain的某個Filter,也可以放在某個Filter之前或者之後。 總之,Spring Security採用Filter Chain模式判斷許可權,Spring提供了一些Filter,也支持開發者自定義Filter。與WEB系統的集成 使用java EE的Filter(非Spring的Filter)機制,將需要許可權判斷的url,「牽引」給Spring的Filter Chain即可。 一般情況下,將所有的url都引入Filter Chain。當然也可以在web.xml配置需要許可權判斷的url(配置filter-mapping/url-pattern)。Spring的配置文件也支持過濾掉不需要許可權判斷的url(配置http/intercept-url元素)。控制內容 Spring Security提供了如下內容的控制:<!--[if !supportLists]-->1. <!--[endif]-->url;<!--[if !supportLists]-->2. <!--[endif]-->bean method;<!--[if !supportLists]-->3. <!--[endif]-->http session。 url:可以分為需要許可權判斷的url,不需要許可權判斷的url,登錄表單url。通過我對spring相關帖子和參考文檔的閱讀,需要許可權判斷的url。僅限於做角色判斷,就是說判斷當前用戶是否具有指定的角色。 bean method:Spring支持對Service layer method做許可權判斷。通過我對spring相關帖子和參考文檔的閱讀,也僅限於做角色判斷。配置方式有2種:<!--[if !supportLists]-->1. <!--[endif]-->寫在Java源代碼裡面,如:@Secured("ROLE_TELLER")(該方法只有具有TELLER角色的用戶能夠訪問,否則拋出異常);<!--[if !supportLists]-->2. <!--[endif]-->寫在配置文件裡面,如:<protect method="set*" access="ROLE_ADMIN" />(該bean的所有set方法,只有具有ADMIN角色的用戶能夠訪問,否則拋出異常)。 http session:控制一個用戶名是否能重復登錄,以及重復登錄次數,並非重試密碼次數。 另外,Spring Security還提供了如下一些功能:<!--[if !supportLists]-->1. <!--[endif]-->remember me,記住我;<!--[if !supportLists]-->2. <!--[endif]-->form-login登錄控制;<!--[if !supportLists]-->3. <!--[endif]-->多種身份認證功能;<!--[if !supportLists]-->4. <!--[endif]-->用戶密碼加密和「salt」功能;<!--[if !supportLists]-->5. <!--[endif]-->http協議控制;<!--[if !supportLists]-->6. <!--[endif]-->訪問埠控制;<!--[if !supportLists]-->7. <!--[endif]-->Pre-Invocation & After-Invocation。 remember me,記住我:還記得瀏覽器採用cookie記住用戶名和密碼自動登錄嗎?好像就是這個(不知道我理解錯了沒有,應該沒有。只是我不大敢相信)。使用這個功能,開發者在登錄頁面,使用spring自定義的標簽。 form-login登錄控制:有些頁面不允許匿名訪問,那麼當匿名訪問這些頁面的時候,將彈出(或者轉到)form-login窗口(或者頁面)。這里又牽引出2個問題:1,輸入用戶名和密碼後怎樣驗證;2,密碼是否需要加密,怎麼加密。 多種身份認證功能:Spring提供了豐富的用戶身份認證功能。身份認證是什麼意思?比如您告訴我「我是神仙」。那麼我會問您「憑什麼證明您是神仙」。這就是身份認證。認證手段一般是保存到資料庫表的用戶名/密碼,usb key,ldap等。一般情況下,我們都使用用戶名/密碼的。 用戶密碼加密和「salt」功能:密碼採用md5,還是sha加密演算法。如果我們對密碼加密的時候,不想僅僅對密碼加密,還想把用戶名和密碼放在一起加密做為加密後的密碼。那麼使用salt吧。salt支持也讀取用戶的其他屬性,不僅是用戶名。 http協議控制:哪些url,必須採用https訪問呢?哪些url必須採用http訪問呢?哪些又兩者都可以呢?通過這個配置。 訪問埠控制:類似http協議控制,控制url和訪問埠之間的關系。 Pre-Invocation & After-Invocation:在方法調用之前做許可權判斷,還是方法調用之後做許可權判斷呢?一般情況下是之前調用。也有情況下是之後調用。具體例子可以看官方文檔(22.3小節)。細粒度許可權控制 由上面分析,我們看到url、method的許可權判斷,都僅限於用戶角色許可權判斷。事實上Spring使用投票(Voter)機制,來做許可權判斷。用戶角色許可權也是一種投票。投票這個詞,聽起來不容易懂。舉例:董事會開會,各個股東投票以表決決議是否通過。Spring的角色投票器,只會投出一票。我們平時所說的投票至少要2張票吧,一張還叫什麼投票。Spring的投票有3種結果:允許、拒絕和棄權。棄權?真的有點暈。呵呵,這種情況下還棄權。 那麼投票器,如何集成到Spring的Filter裡面呢?Spring的Filter一般都由一個Manager支撐著。比如accessDecisionManager,可以由RoleVoter和BasicAclEntryVoter提供投票。accessDecisionManager根據RoleVoter,BasicAclEntryVoter投票結果,做出決策判斷。 細粒度(數據級)的許可權控制,Spring Security提供了一種模型以及相關實現。下面我簡要說說這個模型。舉例:張三授權查詢華北區域客戶資料,李四授權查詢華南區域客戶資料。那麼,首先會對所有客戶記錄做個標示(相當於取個id),然後在acl-entry表給張三授權華北所有客戶訪問許可權;給李四華南區域所有客戶許可權。表記錄大致是這樣的:訪問用戶被訪問數據授權操作張三華北電力客戶1讀取張三華北電力客戶2讀取李四華南電力客戶1讀取………這個模型的缺點是非常明顯的:<!--[if !supportLists]-->1. <!--[endif]-->和業務數據綁定死了,業務數據的增/刪,需要維護該許可權表;<!--[if !supportLists]-->2. <!--[endif]-->在大數據量的情況下,系統效率低下。 因此,開發者需要自己書寫投票器了。我們理想中的許可權管理客戶對許可權管理的需求 這里是指我們服務的最終用戶,而不是軟體開發者。客戶對許可權管理的需求,大體可以概括如下:<!--[if !supportLists]-->1. <!--[endif]-->自主靈活地管理角色、角色許可權,並將角色賦予系統相關用戶;<!--[if !supportLists]-->2. <!--[endif]-->數據安全。系統展現數據是滿足許可權的,在系統內部搜索數據也必須在相應許可權訪問內,對系統數據進行增加、修改、刪除必須是滿足許可權的;<!--[if !supportLists]-->3. <!--[endif]-->沒有功能的按鈕、菜單、數據等等,就不要在界面上出現了。開發中遇到的難點 管理用戶、角色、許可權,以及三者之間的關系,這種典型的RBAC模型,非常容易,沒有任何困難。 困難的是,數據級許可權控制。這是和業務直接掛鉤的,最復雜,而且會經常因為客戶需求表達不到位、開發人員需求理解不到位、系統框架庫表結構發生變化,而不斷變化的。這種變化,不僅需要編碼,而且還需要重新測試。甚至這種變化會波及到其他模塊,甚至整個系統。系統開發經歷幾次變化下來,代碼裡面散布著if/else,散布著sql語句。導致bad smell。我們理想的許可權管理 我們期望的許可權管理,應該具有這么幾個特性:<!--[if !supportLists]-->1. <!--[endif]-->能實現角色級許可權;能實現數據級許可權;<!--[if !supportLists]-->2. <!--[endif]-->簡單、易操作,能夠應對各種需求;<!--[if !supportLists]-->3. <!--[endif]-->應對需求變更能力強;<!--[if !supportLists]-->4. <!--[endif]-->最好有相關界面,比如許可權管理界面、角色管理界面,角色和許可權關系維護界面,用戶和角色關系維護界面。如果沒有界面,也是可以接受的。畢竟這些頁面需要最終用戶來使用,不同用戶對系統的界面要求不同。因此我們並不期望統一的管理界面。 Spring Security的評價 在Spring Security世界裡,可以區分出哪些資源可以匿名訪問,哪些需要角色許可權,又是哪個頁面提供登錄功能;怎樣進行用戶身份認證,用戶的密碼如何加密。哪些資源必須使用https協議,資源和訪問埠有怎樣的對應關系。 下面就優點和缺點對Spring Security進行點評。優點 總體說來Spring Security具有以下幾個優點:<!--[if !supportLists]-->1. <!--[endif]-->提供了一套許可權框架,這套框架是可行的;<!--[if !supportLists]-->2. <!--[endif]-->提供了很多用戶身份認證功能,可以節約大量開發工作;<!--[if !supportLists]-->3. <!--[endif]-->提供了角色判斷功能,這點既是優點又是缺點;<!--[if !supportLists]-->4. <!--[endif]-->提供了form-login、remember me等控制。 其中2、4兩點,對於我們中國開發者(我對國外系統不大了解),可用性並不大。我們的系統大多採用用戶名/密碼身份認證模式,大多公司都有可復用代碼。form-login、remember me等這些功能,並不是難以開發,而且可用之處也並不多。缺點 我個人認為Spring Security存在以下幾個硬傷:<!--[if !supportLists]-->1. <!--[endif]-->角色被「編碼」到配置文件和源文件,這樣最終用戶就不能創建角色了。但最終用戶期望自己來控制角色。因為在項目實施過程中,客戶可能並不能確定有哪些角色,以及角色怎麼分配給系統用戶。角色大多需要等到系統上線後,才能確定。這些編碼有:<!--[if !supportLists]-->a) <!--[endif]-->url的許可權控制,<intercept-url pattern="/**" access="ROLE_USER" />;<!--[if !supportLists]-->b) <!--[endif]-->java方法的許可權控制,@Secured("IS_AUTHENTICATED_ANONYMOUSLY");<!--[if !supportLists]-->c) <!--[endif]-->java方法的許可權控制,<protect method="set*" access="ROLE_ADMIN" />;<!--[if !supportLists]-->2. <!--[endif]-->RBCA這種被廣泛運用的模型,沒有在Spring Security體現出來;<!--[if !supportLists]-->3. <!--[endif]-->Spring Security沒有提供好的細粒度(數據級)許可權方案,提供的預設實現維護工作量大,在大數據量情況下,幾乎不可用;<!--[if !supportLists]-->4. <!--[endif]-->Spring Security對於用戶、角色、許可權之間的關系,沒有提供任何一種維護界面。不過從Spring Security角度看,確實沒有必要有界面。角色創建、角色和許可權直接的關系,都被「編碼」到配置文件和源文件了;<!--[if !supportLists]-->5. <!--[endif]-->Spring Security學習難度大,配置文件還是很多。我承認有很多高手,但我們也看到有很多新人加入軟體開發領域。付出如此大的學習代價,獲得這么一點點好處,個人覺得並不值得。 附言:本人在JavaEye創建「許可權管理」圈子快2周了,吸引不少網友進來。我感到很高興,也很榮幸。由於Spring Security運用范圍還是比較廣的,所以我打算好好學習一下,把學習經驗和大家分享一下。

『貳』 spring提供的幾種密碼加密方式

第一種:不使用任何加密方式的配置

[html]view plain

  • <beanid="AuthenticationProvider"

  • class="org.acegisecurity.providers..DaoAuthenticationProvider">

  • <propertyname="userDetailsService"ref="userDetailsService"/>

  • <!--明文加密,不使用任何加密演算法,在不指定該配置的情況下,Acegi默認採用的就是明文加密-->

  • <!--<propertyname="passwordEncoder"><beanclass="org.acegisecurity.providers.encoding.PlaintextPasswordEncoder">

  • <propertyname="ignorePasswordCase"value="true"></property></bean></property>-->

  • </bean>


  • 第二種:MD5方式加密

    [html]view plain

  • <beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">

  • <propertyname="userDetailsService"ref="userDetailsService"/>

  • <propertyname="passwordEncoder">

  • <beanclass="org.acegisecurity.providers.encoding.Md5PasswordEncoder">

  • <!--false表示:生成32位的Hex版,這也是encodeHashAsBase64的,Acegi默認配置;true表示:生成24位的Base64版-->

  • <propertyname="encodeHashAsBase64"value="false"/>

  • </bean>

  • </property>

  • </bean>


  • 第三種:使用MD5加密,並添加全局加密鹽

    Java代碼

    [html]view plain

  • <beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">

  • <propertyname="userDetailsService"ref="userDetailsService"/>

  • <propertyname="passwordEncoder">

  • <beanclass="org.acegisecurity.providers.encoding.Md5PasswordEncoder">

  • <propertyname="encodeHashAsBase64"value="false"/>

  • </bean>

  • </property>

  • <!--對密碼加密演算法中使用特定的加密鹽及種子-->

  • <propertyname="saltSource">

  • <beanclass="org.acegisecurity.providers..salt.SystemWideSaltSource">

  • <propertyname="systemWideSalt"value="acegisalt"/>

  • </bean>

  • </property>

  • </bean>


  • 第四種:使用MD5加密,並添加動態加密鹽

    [html]view plain

  • <beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">

  • <propertyname="userDetailsService"ref="userDetailsService"/>

  • <propertyname="passwordEncoder">

  • <beanclass="org.acegisecurity.providers.encoding.Md5PasswordEncoder">

  • <propertyname="encodeHashAsBase64"value="false"/>

  • </bean>

  • </property>

  • <!--對密碼加密演算法中使用特定的加密鹽及種子-->

  • <propertyname="saltSource">

  • <!--通過動態的加密鹽進行加密,該配置通過用戶名提供加密鹽,通過UserDetails的getUsername()方式-->

  • <beanclass="org.acegisecurity.providers..salt.ReflectionSaltSource">

  • <propertyname="userPropertyToUse"value="getUsername"/>

  • </bean>

  • </property>

  • </bean>

  • 第五種:使用哈希演算法加密,加密強度為256

    [html]view plain

  • <beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">

  • <propertyname="userDetailsService"ref="userDetailsService"/>

  • <propertyname="passwordEncoder">

  • <beanclass="org.acegisecurity.providers.encoding.ShaPasswordEncoder">

  • <constructor-argvalue="256"/>

  • <propertyname="encodeHashAsBase64"value="false"/>

  • </bean>

  • </property>

  • </bean>

  • 第六種:使用哈希演算法加密,加密強度為SHA-256

    [html]view plain

  • <beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">

  • <propertyname="userDetailsService"ref="userDetailsService"/>

  • <propertyname="passwordEncoder">

  • <beanclass="org.acegisecurity.providers.encoding.ShaPasswordEncoder">

  • <constructor-argvalue="SHA-256"/>

  • <propertyname="encodeHashAsBase64"value="false"/>

  • </bean>

  • </property>

  • </bean>


  • 上述配置只是在Acegi通過表單提交的用戶認證信息中的密碼做各種加密操作。而我們存儲用戶密碼的時候,可以通過一下程序完成用戶密碼操作:

    [java]view plain

  • packageorg.hz.test;

  • importjava.security.NoSuchAlgorithmException;

  • importorg.springframework.security.authentication.encoding.Md5PasswordEncoder;

  • importorg.springframework.security.authentication.encoding.ShaPasswordEncoder;

  • publicclassMD5Test{

  • publicstaticvoidmd5(){

  • Md5PasswordEncodermd5=newMd5PasswordEncoder();

  • //false表示:生成32位的Hex版,這也是encodeHashAsBase64的,Acegi默認配置;true表示:生成24位的Base64版

  • md5.setEncodeHashAsBase64(false);

  • Stringpwd=md5.encodePassword("1234",null);

  • System.out.println("MD5:"+pwd+"len="+pwd.length());

  • }

  • publicstaticvoidsha_256(){

  • ShaPasswordEncodersha=newShaPasswordEncoder(256);

  • sha.setEncodeHashAsBase64(true);

  • Stringpwd=sha.encodePassword("1234",null);

  • System.out.println("哈希演算法256:"+pwd+"len="+pwd.length());

  • }

  • publicstaticvoidsha_SHA_256(){

  • ShaPasswordEncodersha=newShaPasswordEncoder();

  • sha.setEncodeHashAsBase64(false);

  • Stringpwd=sha.encodePassword("1234",null);

  • System.out.println("哈希演算法SHA-256:"+pwd+"len="+pwd.length());

  • }

  • publicstaticvoidmd5_SystemWideSaltSource(){

  • Md5PasswordEncodermd5=newMd5PasswordEncoder();

  • md5.setEncodeHashAsBase64(false);

  • //使用動態加密鹽的只需要在注冊用戶的時候將第二個參數換成用戶名即可

  • Stringpwd=md5.encodePassword("1234","acegisalt");

  • System.out.println("MD5SystemWideSaltSource:"+pwd+"len="+pwd.length());

  • }

  • publicstaticvoidmain(String[]args){

  • md5();//使用簡單的MD5加密方式

  • sha_256();//使用256的哈希演算法(SHA)加密

  • sha_SHA_256();//使用SHA-256的哈希演算法(SHA)加密

  • md5_SystemWideSaltSource();//使用MD5再加全局加密鹽加密的方式加密

  • }

  • }

『叄』 springsecurity登陸問題

是報什麼錯誤,密碼不正確嗎,如果密碼有加密,new UserDetail時,密碼應該是加密後的密碼。

『肆』 spring security為什麼要加密

spring security也就是被大家廣為熟悉的acegi security,2007年底Acegi Security正式成為Spring Portfolio項目,並更名為Spring Security。Spring Security是一個能夠為基於spring的企業應用系統提供描述性安全訪問控制解決方案的安全框架。 他提供了一組可以基於springIoC(依賴注入,也稱控制反轉)和AOP(面向切面編程)應用上下文中配置的Bean,充分利用了Spring功能,為應用系統提供聲明式的安全訪問控制功能,減少了為企業系統安全控制編寫大量重復代碼的工作。

『伍』 如何對資料庫進行加密和解密

資料庫賬號密碼加密詳解及實例
資料庫中經常有對資料庫賬號密碼的加密,但是碰到一個問題,在使用UserService對密碼進行加密的時候,spring security 也是需要進行同步配置的,因為spring security 中驗證的加密方式是單獨配置的。如下:
<authentication-manager>
<authentication-provider user-service-ref="userDetailService">
<password-encoder ref="passwordEncoder" />
</authentication-provider>
</authentication-manager>

<beans:bean class="com.sapphire.security.MyPasswordEncoder" id="passwordEncoder">
<beans:constructor-arg value="md5"></beans:constructor-arg>
</beans:bean>

如上述配置文件所示,passwordEncoder才是在spring security對賬號加密校驗的地方。
spring security在攔截之後,會首先對用戶進行查找,通過自己定義的userDetailService來找到對應的用戶,然後由框架進行密碼的匹配驗證。
從userDetailService得到user以後,就會進入到DaoAuthenticationProvider中,這是框架中定義的 ,然後跳入其中的authenticate方法中。
該方法會進行兩個檢查,分別是
* preAuthenticationChecks : 主要進行的是對用戶是否過期等信息的校驗,調用的方法在userDetail中有定義的。
* : 這個就是用戶名密碼驗證的過程了。
而PasswordEncoder是我們xml中注入的bean,所以了,我們調用的則是我們自己完成的passwordEncoder
public class MyPasswordEncoder extends MessageDigestPasswordEncoder {
public MyPasswordEncoder(String algorithm) {
super(algorithm);
}

@Override
public boolean isPasswordValid(String encPass, String rawPass, Object salt) {
return encPass.equals(DigestUtils.md5DigestAsHex(rawPass.getBytes()));
}
}

這是我對其實現的一個簡單版本,調用的就是spring自帶的加密演算法,很簡單了,當然也可以使用復雜的加密方法,這個就靠自己了
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

『陸』 spring安全框架在什麼方法加密

你好,Spring框架是基礎,它提供了基礎的IOC和AOP服務。
Spring security 是在Spring的基礎服務上,提供的基於Spring的企業應用系統安全訪問控制的服務。
Spring Security框架大量使用了Spring框架的AOP服務。它不能脫離Spring而使用。

『柒』 Java中的spring security登錄驗證好在哪裡,相比較傳統的登錄加密驗證

主要的是一整套完整的許可權系統 和shiro差不多!

『捌』 spring配置文件中的資料庫用戶名和密碼怎麼加密

一般spring容器啟動時,通過PropertyPlaceholderConfigurer類讀取jdbc.properties文件里的資料庫配置信息。
通過這個原理,我們把加密後的資料庫配置信息放到jdbc.properties文件里,然後自定義一個繼承PropertyPlaceholderConfigurer的類重寫processProperties方法,實現解密,把解密後的信息又放回去。

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:645
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:936
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:632
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:821
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:731
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1066
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:299
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:160
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:851
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:763