欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Spring Security(06)——AuthenticationProvi

系統 1695 0

AuthenticationProvider

目錄

1.1 ???? 用戶信息從數據庫獲取

1.1.1 ??? 使用 jdbc-user-service 獲取

1.1.2 ??? 直接使用 JdbcDaoImpl

1.2 ???? PasswordEncoder

1.2.1 ??? 使用內置的 PasswordEncoder

1.2.2 ??? 使用自定義的 PasswordEncoder

?

?????? 認證是由 AuthenticationManager 來管理的,但是真正進行認證的是 AuthenticationManager 中定義的 AuthenticationProvider AuthenticationManager 中可以定義有多個 AuthenticationProvider 。當我們使用 authentication-provider 元素來定義一個 AuthenticationProvider 時,如果沒有指定對應關聯的 AuthenticationProvider 對象, Spring Security 默認會使用 DaoAuthenticationProvider DaoAuthenticationProvider 在進行認證的時候需要一個 UserDetailsService 來獲取用戶的信息 UserDetails ,其中包括用戶名、密碼和所擁有的權限等。所以如果我們需要改變認證的方式,我們可以實現自己的 AuthenticationProvider ;如果需要改變認證的用戶信息來源,我們可以實現 UserDetailsService

?

?????? 實現了自己的 AuthenticationProvider 之后,我們可以在配置文件中這樣配置來使用我們自己的 AuthenticationProvider 。其中 myAuthenticationProvider 就是我們自己的 AuthenticationProvider 實現類對應的 bean

?? < security:authentication-manager >

????? < security:authentication-provider ref = "myAuthenticationProvider" />

?? </ security:authentication-manager >

?

?????? 實現了自己的 UserDetailsService 之后,我們可以在配置文件中這樣配置來使用我們自己的 UserDetailsService 。其中的 myUserDetailsService 就是我們自己的 UserDetailsService 實現類對應的 bean

?? < security:authentication-manager >

????? < security:authentication-provider user-service-ref = "myUserDetailsService" />

?? </ security:authentication-manager >

?

1.1 ???? 用戶信息從數據庫獲取

?????? 通常我們的用戶信息都不會向第一節示例中那樣簡單的寫在配置文件中,而是從其它存儲位置獲取,比如數據庫。根據之前的介紹我們知道用戶信息是通過 UserDetailsService 獲取的,要從數據庫獲取用戶信息,我們就需要實現自己的 UserDetailsService 。幸運的是像這種常用的方式 Spring Security 已經為我們做了實現了。

?

1.1.1?? 使用jdbc-user-service獲取

?????? Spring Security 的命名空間中在 authentication-provider 下定義了一個 jdbc-user-service 元素,通過該元素我們可以定義一個從數據庫獲取 UserDetails UserDetailsService jdbc-user-service 需要接收一個數據源的引用。

?? < security:authentication-manager >

????? < security:authentication-provider >

???????? < security:jdbc-user-service data-source-ref = "dataSource" /> ??????

????? </ security:authentication-provider >

?? </ security:authentication-manager >

?

?????? 上述配置中 dataSource 是對應數據源配置的 bean 引用。使用此種方式需要我們的數據庫擁有如下表和表結構。


Spring Security(06)——AuthenticationProvider
?


Spring Security(06)——AuthenticationProvider
?

?????? 這是因為默認情況下 jdbc-user-service 將使用 SQL 語句“ select username, password, enabled from users where username = ? ”來獲取用戶信息;使用 SQL 語句“ select username, authority from authorities where username = ? ”來獲取用戶對應的權限;使用 SQL 語句“ select g.id, g.group_name, ga.authority from groups g, group_members gm, group_authorities ga where gm.username = ? and g.id = ga.group_id and g.id = gm.group_id ”來獲取用戶所屬組的權限。需要注意的是 jdbc-user-service 定義是不支持用戶組權限的,所以使用 jdbc-user-service 時用戶組相關表也是可以不定義的。如果需要使用用戶組權限請使用 JdbcDaoImpl ,這個在后文后講到。

?????? 當然這只是默認配置及默認的表結構。如果我們的表名或者表結構跟 Spring Security 默認的不一樣,我們可以通過以下幾個屬性來定義我們自己查詢用戶信息、用戶權限和用戶組權限的 SQL

屬性名

說明

users-by-username-query

指定查詢用戶信息的 SQL

authorities-by-username-query

指定查詢用戶權限的 SQL

group-authorities-by-username-query

指定查詢用戶組權限的 SQL

?

?????? 假設我們的用戶表是 t_user ,而不是默認的 users ,則我們可以通過屬性 users-by-username-query 來指定查詢用戶信息的時候是從用戶表 t_user 查詢。

?? < security:authentication-manager >

????? < security:authentication-provider >

???????? < security:jdbc-user-service

??????????? data-source-ref = "dataSource"

??????????? users-by-username-query = "select username, password, enabled from t_user where username = ?" />

????? </ security:authentication-provider >

?? </ security:authentication-manager >

?

role-prefix 屬性

?????? jdbc-user-service 還有一個屬性 role-prefix 可以用來指定角色的前綴。這是什么意思呢?這表示我們從庫里面查詢出來的權限需要加上什么樣的前綴。舉個例子,假設我們庫里面存放的權限都是“ USER ”,而我們指定了某個 URL 的訪問權限 access=”ROLE_USER” ,顯然這是不匹配的, Spring Security 不會給我們放行,通過指定 jdbc-user-service role-prefix=”ROLE_” 之后就會滿足了。當 role-prefix 的值為“ none ”時表示沒有前綴,當然默認也是沒有的。

?

1.1.2?? 直接使用JdbcDaoImpl

?????? JdbcDaoImpl UserDetailsService 的一個實現。其用法和 jdbc-user-service 類似,只是我們需要把它定義為一個 bean ,然后通過 authentication-provider user-service-ref 進行引用。

?? < security:authentication-manager >

????? < security:authentication-provider user-service-ref = "userDetailsService" />

?? </ security:authentication-manager >

??

?? < bean id = "userDetailsService" class = "org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl" >

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

?? </ bean >

?

?????? 如你所見, JdbcDaoImpl 同樣需要一個 dataSource 的引用。如果就是上面這樣配置的話我們數據庫表結構也需要是標準的表結構。當然,如果我們的表結構和標準的不一樣,可以通過 usersByUsernameQuery authoritiesByUsernameQuery groupAuthoritiesByUsernameQuery 屬性來指定對應的查詢 SQL

用戶權限和用戶組權限

?????? JdbcDaoImpl 使用 enableAuthorities enableGroups 兩個屬性來控制權限的啟用。默認啟用的是 enableAuthorities ,即用戶權限,而 enableGroups 默認是不啟用的。如果需要啟用用戶組權限,需要指定 enableGroups 屬性值為 true 。當然這兩種權限是可以同時啟用的。需要注意的是使用 jdbc-user-service 定義的 UserDetailsService 是不支持用戶組權限的,如果需要支持用戶組權限的話需要我們使用 JdbcDaoImpl

?? < security:authentication-manager >

????? < security:authentication-provider user-service-ref = "userDetailsService" />

?? </ security:authentication-manager >

??

?? < bean id = "userDetailsService" class = "org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl" >

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

????? < property name = "enableGroups" value = "true" />

?? </ bean >

?

1.2 ???? PasswordEncoder

1.2.1?? 使用內置的PasswordEncoder

?????? 通常我們保存的密碼都不會像之前介紹的那樣,保存的明文,而是加密之后的結果。為此,我們的 AuthenticationProvider 在做認證時也需要將傳遞的明文密碼使用對應的算法加密后再與保存好的密碼做比較。 Spring Security 對這方面也有支持。通過在 authentication-provider 下定義一個 password-encoder 我們可以定義當前 AuthenticationProvider 需要在進行認證時需要使用的 password-encoder password-encoder 是一個 PasswordEncoder 的實例,我們可以直接使用它,如:

?? < security:authentication-manager >

????? < security:authentication-provider user-service-ref = "userDetailsService" >

???????? < security:password-encoder hash = "md5" />

????? </ security:authentication-provider >

?? </ security:authentication-manager >

?

?????? 其屬性 hash 表示我們將用來進行加密的哈希算法,系統已經為我們實現的有 plaintext sha sha-256 md4 md5 {sha} {ssha} 。它們對應的 PasswordEncoder 實現類如下:

加密算法

PasswordEncoder 實現類

plaintext

PlaintextPasswordEncoder

sha

ShaPasswordEncoder

sha-256

ShaPasswordEncoder ,使用時 new ShaPasswordEncoder(256)

md4

Md4PasswordEncoder

md5

Md5PasswordEncoder

{sha}

LdapShaPasswordEncoder

{ssha}

LdapShaPasswordEncoder

?

使用 BASE64 編碼加密后的密碼

?????? 此外,使用 password-encoder 時我們還可以指定一個屬性 base64 ,表示是否需要對加密后的密碼使用 BASE64 進行編碼,默認是 false 。如果需要則設為 true

<security:password-encoder hash= "md5" base64= "true" />

?

加密時使用 salt

?????? 加密時使用 salt 也是很常見的需求, Spring Security 內置的 password-encoder 也對它有支持。通過 password-encoder 元素下的子元素 salt-source ,我們可以指定當前 PasswordEncoder 需要使用的 salt 。這個 salt 可以是一個常量,也可以是當前 UserDetails 的某一個屬性,還可以通過實現 SaltSource 接口實現自己的獲取 salt 的邏輯, SaltSource 中只定義了如下一個方法。

public Object getSalt(UserDetails user);

?

?????? 下面來看幾個使用 salt-source 的示例。

?????? 1 )下面的配置將使用常量“ abc ”作為 salt

?? < security:authentication-manager >

????? < security:authentication-provider user-service-ref = "userDetailsService" >

???????? < security:password-encoder hash = "md5" base64 = "true" >

????? ????? < security:salt-source system-wide = "abc" />

???????? </ security:password-encoder >

????? </ security:authentication-provider >

?? </ security:authentication-manager >

?

?????? 2 )下面的配置將使用 UserDetails username 作為 salt

?? < security:authentication-manager >

????? < security:authentication-provider user-service-ref = "userDetailsService" >

???????? < security:password-encoder hash = "md5" base64 = "true" >

??????????? < security:salt-source user-property = "username" />

???????? </ security:password-encoder >

????? </ security:authentication-provider >

?? </ security:authentication-manager >

?

?????? 3 )下面的配置將使用自己實現的 SaltSource 獲取 salt 。其中 mySaltSource 就是 SaltSource 實現類對應的 bean 的引用。

?? < security:authentication-manager >

????? < security:authentication-provider user-service-ref = "userDetailsService" >

???????? < security:password-encoder hash = "md5" base64 = "true" >

??????????? < security:salt-source ref = "mySaltSource" />

???????? </ security:password-encoder >

????? </ security:authentication-provider >

?? </ security:authentication-manager >

?

?????? 需要注意的是 AuthenticationProvider 進行認證時所使用的 PasswordEncoder ,包括它們的算法和規則都應當與我們保存用戶密碼時是一致的。也就是說如果 AuthenticationProvider 使用 Md5PasswordEncoder 進行認證,我們在保存用戶密碼時也需要使用 Md5PasswordEncoder ;如果 AuthenticationProvider 在認證時使用了 username 作為 salt ,那么我們在保存用戶密碼時也需要使用 username 作為 salt 。如:

?? Md5PasswordEncoder encoder = new Md5PasswordEncoder();

?? encoder.setEncodeHashAsBase64( true );

?? System. out .println(encoder.encodePassword( "user" , "user" ));

?

1.2.2?? 使用自定義的PasswordEncoder

?????? 除了通過 password-encoder 使用 Spring Security 已經為我們實現了的 PasswordEncoder 之外,我們也可以實現自己的 PasswordEncoder ,然后通過 password-encoder ref 屬性關聯到我們自己實現的 PasswordEncoder 對應的 bean 對象。

?? < security:authentication-manager >

????? < security:authentication-provider user-service-ref = "userDetailsService" >

???????? < security:password-encoder ref = "passwordEncoder" />

????? </ security:authentication-provider >

?? </ security:authentication-manager >

??

?? < bean id = "passwordEncoder" class = "com.xxx.MyPasswordEncoder" />

?

?????? Spring Security 內部定義有兩種類型的 PasswordEncoder ,分別是 org.springframework.security.authentication.encoding.PasswordEncoder org.springframework.security.crypto.password.PasswordEncoder 。直接通過 password-encoder 元素的 hash 屬性指定使用內置的 PasswordEncoder 都是基于 org.springframework.security.authentication.encoding.PasswordEncoder 的實現,然而它現在已經被廢棄了, Spring Security 推薦我們使用 org.springframework.security.crypto.password.PasswordEncoder ,它的設計理念是為了使用隨機生成的 salt 。關于后者 Spring Security 也已經提供了幾個實現類,更多信息請查看 Spring Security API 文檔。我們在通過 password-encoder 使用自定義的 PasswordEncoder 時兩種 PasswordEncoder 的實現類都是支持的。

?

(注:本文是基于 Spring Security3.1.6 所寫)

(注:原創文章,轉載請注明出處。原文地址: http://haohaoxuexi.iteye.com/blog/2157769

?

?

?

Spring Security(06)——AuthenticationProvider


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色综合色综合网色综合 | 亚洲日本中文 | 亚洲蜜桃AV色情精品成人 | 国产成人久久精品二区三区牛 | 久久综合九色综合97婷婷群聊 | 国产精品国产a级 | 中文一级毛片 | 欧美不卡一区二区三区在线观看 | 亚洲国产欧洲精品路线久久 | 欧美黑人又粗又长 | xx00视频| 一级免费a| 在线视频三级 | 久久蜜桃亚洲一区二区 | com.色.www在线观看 | 免费九九视频 | 边摸边吃奶边做激情叫床文章 | 麻豆视频秘密入口 | 久操久热 | 欧美久久久久 | 亚洲区一 | 亚洲已满18点击进入在线观看 | 久草福利在线视频 | 精品黑人一区二区三区 | 国产一区二区免费 | 久久久婷| 日本高清视频在线播放 | 国产综合久久 | 精品一区二区三区水蜜桃 | 国产亚洲精品精品国产亚洲综合 | 五月天网址 | 欧美亚洲另类视频 | 国产一级片网站 | 亚洲欧美日韩激情在线观看 | 国产精品片aa在线观看 | 91高清免费观看 | 一区二区三区四区免费看 | 久草资源 | 五月婷婷狠狠干 | 久久夜视频 | 欧美日韩一区二区三区高清不卡 |