詳解spring security 配置多個(gè)AuthenticationProvider

姓名: 李小娜

[嵌牛導(dǎo)讀]:這篇文章主要介紹了詳解spring security 配置多個(gè)AuthenticationProvider

[嵌牛鼻子]:spring security的大體介紹 ??開(kāi)始配置多AuthenticationProvider ?

[嵌牛提問(wèn)] :spring security 如何配置多個(gè)AuthenticationProvider冠跷?

[嵌牛正文] :spring security的大體介紹

spring security本身如果只是說(shuō)配置,還是很簡(jiǎn)單易懂的(我也不知道網(wǎng)上說(shuō)spring

security難寻咒,難在哪里)荣回,簡(jiǎn)單不需要特別的功能祭钉,一個(gè)WebSecurityConfigurerAdapter的實(shí)現(xiàn),然后實(shí)現(xiàn)UserServiceDetails就是簡(jiǎn)單的數(shù)據(jù)庫(kù)驗(yàn)證了,這個(gè)我就不說(shuō)了威恼。

spring security大體上是由一堆Filter(所以才能在spring

mvc前攔截請(qǐng)求)實(shí)現(xiàn)的,F(xiàn)ilter有幾個(gè)寝并,登出Filter(LogoutFilter)箫措,用戶(hù)名密碼驗(yàn)證Filter(UsernamePasswordAuthenticationFilter)之類(lèi)的,F(xiàn)ilter再交由其他組件完成細(xì)分的功能衬潦,例如最常用的UsernamePasswordAuthenticationFilter會(huì)持有一個(gè)AuthenticationManager引用斤蔓,AuthenticationManager顧名思義,驗(yàn)證管理器镀岛,負(fù)責(zé)驗(yàn)證的弦牡,但AuthenticationManager本身并不做具體的驗(yàn)證工作,AuthenticationManager持有一個(gè)AuthenticationProvider集合哎媚,AuthenticationProvider才是做驗(yàn)證工作的組件喇伯,AuthenticationManager和AuthenticationProvider的工作機(jī)制可以大概看一下這兩個(gè)的java

doc,然后成功失敗都有相對(duì)應(yīng)該Handler 拨与。大體的spring security的驗(yàn)證工作流程就是這樣了稻据。

開(kāi)始配置多AuthenticationProvider

首先,寫(xiě)一個(gè)內(nèi)存認(rèn)證的AuthenticationProvider,這里我簡(jiǎn)單地寫(xiě)一個(gè)只有root帳號(hào)的AuthenticationProvider


packagecom.scau.equipment.config.common.security.provider;

importorg.springframework.security.authentication.AuthenticationProvider;

importorg.springframework.security.authentication.UsernamePasswordAuthenticationToken;

importorg.springframework.security.core.Authentication;

importorg.springframework.security.core.AuthenticationException;

importorg.springframework.security.core.GrantedAuthority;

importorg.springframework.security.core.authority.SimpleGrantedAuthority;

importorg.springframework.security.core.userdetails.User;

importorg.springframework.stereotype.Component;

importjava.util.Arrays;

importjava.util.List;

/**

* Created by Administrator on 2017-05-10.

*/

@Component

publicclassInMemoryAuthenticationProviderimplementsAuthenticationProvider {

privatefinalString adminName ="root";

privatefinalString adminPassword ="root";

//根用戶(hù)擁有全部的權(quán)限

privatefinalList authorities = Arrays.asList(newSimpleGrantedAuthority("CAN_SEARCH"),

newSimpleGrantedAuthority("CAN_SEARCH"),

newSimpleGrantedAuthority("CAN_EXPORT"),

newSimpleGrantedAuthority("CAN_IMPORT"),

newSimpleGrantedAuthority("CAN_BORROW"),

newSimpleGrantedAuthority("CAN_RETURN"),

newSimpleGrantedAuthority("CAN_REPAIR"),

newSimpleGrantedAuthority("CAN_DISCARD"),

newSimpleGrantedAuthority("CAN_EMPOWERMENT"),

newSimpleGrantedAuthority("CAN_BREED"));

@Override

publicAuthentication authenticate(Authentication authentication)throwsAuthenticationException {

if(isMatch(authentication)){

User user =newUser(authentication.getName(),authentication.getCredentials().toString(),authorities);

returnnewUsernamePasswordAuthenticationToken(user,authentication.getCredentials(),authorities);

}

returnnull;

}

@Override

publicbooleansupports(Class authentication) {

returntrue;

}

privatebooleanisMatch(Authentication authentication){

if(authentication.getName().equals(adminName)&&authentication.getCredentials().equals(adminPassword))

returntrue;

else

returnfalse;

}

}

support方法檢查authentication的類(lèi)型是不是這個(gè)AuthenticationProvider支持的捻悯,這里我簡(jiǎn)單地返回true匆赃,就是所有都支持,這里所說(shuō)的authentication為什么會(huì)有多個(gè)類(lèi)型今缚,是因?yàn)槎鄠€(gè)AuthenticationProvider可以返回不同的Authentication算柳。

public Authentication authenticate(Authentication authentication) throws

AuthenticationException 方法就是驗(yàn)證過(guò)程。

如果AuthenticationProvider返回了null姓言,AuthenticationManager會(huì)交給下一個(gè)支持authentication類(lèi)型的AuthenticationProvider處理瞬项。

另外需要一個(gè)數(shù)據(jù)庫(kù)認(rèn)證的AuthenticationProvider,我們可以直接用spring

security提供的DaoAuthenticationProvider何荚,設(shè)置一下UserServiceDetails和PasswordEncoder就可以了


@Bean

DaoAuthenticationProvider daoAuthenticationProvider(){

DaoAuthenticationProvider daoAuthenticationProvider =newDaoAuthenticationProvider();

daoAuthenticationProvider.setPasswordEncoder(newBCryptPasswordEncoder());

daoAuthenticationProvider.setUserDetailsService(userServiceDetails);

returndaoAuthenticationProvider;

}

最后在WebSecurityConfigurerAdapter里配置一個(gè)含有以上兩個(gè)AuthenticationProvider的AuthenticationManager囱淋,依然重用spring

security提供的ProviderManager




packagecom.scau.equipment.config.common.security;

importcom.scau.equipment.config.common.security.handler.AjaxLoginFailureHandler;

importcom.scau.equipment.config.common.security.handler.AjaxLoginSuccessHandler;

importcom.scau.equipment.config.common.security.provider.InMemoryAuthenticationProvider;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.context.annotation.Bean;

importorg.springframework.context.annotation.Configuration;

importorg.springframework.security.authentication.AuthenticationManager;

importorg.springframework.security.authentication.ProviderManager;

importorg.springframework.security.authentication.dao.DaoAuthenticationProvider;

importorg.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;

importorg.springframework.security.config.annotation.authentication.configurers.provisioning.InMemoryUserDetailsManagerConfigurer;

importorg.springframework.security.config.annotation.authentication.configurers.provisioning.UserDetailsManagerConfigurer;

importorg.springframework.security.config.annotation.web.builders.HttpSecurity;

importorg.springframework.security.config.annotation.web.builders.WebSecurity;

importorg.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

importorg.springframework.security.core.GrantedAuthority;

importorg.springframework.security.core.authority.SimpleGrantedAuthority;

importorg.springframework.security.core.userdetails.UserDetailsService;

importorg.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

importjava.util.Arrays;

importjava.util.List;

/**

* Created by Administrator on 2017/2/17.

*/

@Configuration

publicclassSecurityConfigextendsWebSecurityConfigurerAdapter {

@Autowired

UserDetailsService userServiceDetails;

@Autowired

InMemoryAuthenticationProvider inMemoryAuthenticationProvider;

@Bean

DaoAuthenticationProvider daoAuthenticationProvider(){

DaoAuthenticationProvider daoAuthenticationProvider =newDaoAuthenticationProvider();

daoAuthenticationProvider.setPasswordEncoder(newBCryptPasswordEncoder());

daoAuthenticationProvider.setUserDetailsService(userServiceDetails);

returndaoAuthenticationProvider;

}

@Override

protectedvoidconfigure(HttpSecurity http)throwsException {

http

.csrf().disable()

.rememberMe().alwaysRemember(true).tokenValiditySeconds(86400).and()

.authorizeRequests()

.antMatchers("/","/*swagger*/**","/v2/api-docs").permitAll()

.anyRequest().authenticated().and()

.formLogin()

.loginPage("/")

.loginProcessingUrl("/login")

.successHandler(newAjaxLoginSuccessHandler())

.failureHandler(newAjaxLoginFailureHandler()).and()

.logout().logoutUrl("/logout").logoutSuccessUrl("/");

}

@Override

publicvoidconfigure(WebSecurity web)throwsException {

web.ignoring().antMatchers("/public/**","/webjars/**","/v2/**","/swagger**");

}

@Override

protectedAuthenticationManager authenticationManager()throwsException {

ProviderManager authenticationManager =newProviderManager(Arrays.asList(inMemoryAuthenticationProvider,daoAuthenticationProvider()));

//不擦除認(rèn)證密碼,擦除會(huì)導(dǎo)致TokenBasedRememberMeServices因?yàn)檎也坏紺redentials再調(diào)用UserDetailsService而拋出UsernameNotFoundException

authenticationManager.setEraseCredentialsAfterAuthentication(false);

returnauthenticationManager;

}

/**

* 這里需要提供UserDetailsService的原因是RememberMeServices需要用到

*@return

*/

@Override

protectedUserDetailsService userDetailsService() {

returnuserServiceDetails;

}

}

基本上都是重用了原有的類(lèi)餐塘,很多都是默認(rèn)使用的妥衣,只不過(guò)為了修改下行為而重新配置。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末戒傻,一起剝皮案震驚了整個(gè)濱河市税手,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌需纳,老刑警劉巖芦倒,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異候齿,居然都是意外死亡熙暴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)慌盯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)周霉,“玉大人,你說(shuō)我怎么就攤上這事亚皂【阆洌” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵灭必,是天一觀的道長(zhǎng)狞谱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)禁漓,這世上最難降的妖魔是什么跟衅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮播歼,結(jié)果婚禮上伶跷,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好叭莫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布蹈集。 她就那樣靜靜地躺著,像睡著了一般雇初。 火紅的嫁衣襯著肌膚如雪拢肆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天靖诗,我揣著相機(jī)與錄音郭怪,去河邊找鬼。 笑死刊橘,一個(gè)胖子當(dāng)著我的面吹牛移盆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伤为,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼据途!你這毒婦竟也來(lái)了绞愚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颖医,失蹤者是張志新(化名)和其女友劉穎位衩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體熔萧,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡糖驴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佛致。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贮缕。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖俺榆,靈堂內(nèi)的尸體忽然破棺而出感昼,到底是詐尸還是另有隱情,我是刑警寧澤罐脊,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布定嗓,位于F島的核電站,受9級(jí)特大地震影響萍桌,放射性物質(zhì)發(fā)生泄漏宵溅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一上炎、第九天 我趴在偏房一處隱蔽的房頂上張望恃逻。 院中可真熱鬧,春花似錦、人聲如沸辛块。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)润绵。三九已至线椰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尘盼,已是汗流浹背憨愉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卿捎,地道東北人配紫。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像午阵,于是被迫代替她去往敵國(guó)和親躺孝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容