Spring Security - 認(rèn)證與授權(quán)(一)

一幌陕、基于配置的認(rèn)證與授權(quán)

新建controller

在該包下新建三個控制器荡含,AdminController,AppController,UserController

image-20201015094116252.png

分別創(chuàng)建測試API

/**
 * 模擬后臺相關(guān)Api接口
 */
@RequestMapping("/admin/api")
@RestController
public class AdminController {
?
 @RequestMapping(value = "/hi",method = RequestMethod.GET)
 public String  hi(){
 return "hi,admin.";
 }
}
/**
 * 模擬對外公開的Api接口
 */
@RequestMapping("/app/api")
@RestController
public class AppController {
?
 @RequestMapping(value = "/hi", method = RequestMethod.GET)
 public String hi() {
 return "hi,app.";
 }
}
/**
 * 模擬用戶相關(guān)Api接口
 */
@RequestMapping("/user/api")
@RestController
public class UserController {
?
 @RequestMapping(value = "/hi", method = RequestMethod.GET)
 public String hi() {
 return "hi,user.";
 }
}

配置資源授權(quán)

配置configure

修改之前的配置

 @Override
 protected void configure(HttpSecurity http) throws Exception {
 http.authorizeRequests()
 .antMatchers("/admin/api/**").hasRole("ADMIN")
 .antMatchers("/user/api/**").hasRole("USER")
 .antMatchers("/app/api/**").permitAll()
 .anyRequest()
 .authenticated()
 .and()
 .formLogin()
 .loginPage("/myLogin.html")
 // 指定處理登錄請求的路徑,修改請求的路徑飒赃,默認(rèn)為/login
 .loginProcessingUrl("/mylogin")
 // 使登錄頁面不設(shè)限訪問
 .permitAll()
 .and()
 .csrf().disable();
 }

antMatchers()一個采用ANT模式的URL匹配器

  • ? 表示匹配任意單個字符

  • * 表示匹配0或任意數(shù)量字符

  • ** 表示匹配0或更多的目錄

重啟服務(wù)

訪問api http://localhost:8080/app/api/hi

訪問成功 頁面顯示 hi,app.

訪問api http://localhost:8080/user/api/hi

跳轉(zhuǎn)到登錄頁面

輸入自定義的用戶名密碼

登錄成功蜜托,頁面卻報403錯誤,表示授權(quán)失敗

認(rèn)證已經(jīng)通過微酬,授權(quán)失敗绘趋,以為我們配置的.antMatchers("/user/api/**").hasRole("USER"),需要用戶具有USER角色權(quán)限

修改配置文件application.yml

spring:
 security:
 user:
 name: caoshenyang
 password: 123456
 roles: USER

給用戶添加USER權(quán)限

重啟項目

訪問api http://localhost:8080/user/api/hi

登錄成功后颗管,頁面顯示hi,user.

訪問api http://localhost:8080/admin/api/hi

出現(xiàn)同樣情況

修改配置文件application.yml

給用戶添加上ADMIN權(quán)限

重啟項目

訪問正常陷遮,頁面顯示hi,admin.

二、基于內(nèi)存的多用戶設(shè)置

1. 實現(xiàn)自定義的UserDetailsService

@Bean
public UserDetailsService userDetailsService(){
 InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
 //MD5 加密 明文 111 加密后 698d51a19d8a121ce581499d7b701668
 //noop 明文
 manager.createUser(User.withUsername("aa").password("{MD5}698d51a19d8a121ce581499d7b701668").roles("USER").build());
 manager.createUser(User.withUsername("bb").password("{noop}222").roles("USER").build());
?
 return manager;
}

注意:SpringSecurity5.x 以上版本需要配置加密否則會出現(xiàn)以下異常

 There is no PasswordEncoder mapped for the id "null"

SpringSecurity5.x 加密方式采用{Id}password的格式配置

我們可以看一下PasswordEncoderFactories自帶的加密方式

public class PasswordEncoderFactories {
 public static PasswordEncoder createDelegatingPasswordEncoder() {
 String encodingId = "bcrypt";
 Map<String, PasswordEncoder> encoders = new HashMap();
 encoders.put(encodingId, new BCryptPasswordEncoder());
 encoders.put("ldap", new LdapShaPasswordEncoder());
 encoders.put("MD4", new Md4PasswordEncoder());
 encoders.put("MD5", new MessageDigestPasswordEncoder("MD5"));
 encoders.put("noop", NoOpPasswordEncoder.getInstance());
 encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
 encoders.put("scrypt", new SCryptPasswordEncoder());
 encoders.put("SHA-1", new MessageDigestPasswordEncoder("SHA-1"));
 encoders.put("SHA-256", new MessageDigestPasswordEncoder("SHA-256"));
 encoders.put("sha256", new StandardPasswordEncoder());
 encoders.put("argon2", new Argon2PasswordEncoder());
 return new DelegatingPasswordEncoder(encodingId, encoders);
 }
?
 private PasswordEncoderFactories() {
 }
}

重新啟動

輸入賬號密碼

登錄成功

此配置會覆蓋原先application.yml中的配置

2. 通過congfigure

@Override
 protected void configure(AuthenticationManagerBuilder auth) throws Exception {
 auth.inMemoryAuthentication()
 .passwordEncoder(NoOpPasswordEncoder.getInstance())
 .withUser("tom").password("111").roles("ADMIN","USER")
 .and()
 .withUser("lisi").password("222").roles("USER");
 }

同實現(xiàn)自定義UserDetailsService大同小異

此配置會覆蓋原先application.yml中的配置

和自定義UserDetailsService中配置

選其中之一就可以

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垦江,一起剝皮案震驚了整個濱河市帽馋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌比吭,老刑警劉巖茬斧,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異梗逮,居然都是意外死亡项秉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門慷彤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娄蔼,“玉大人,你說我怎么就攤上這事底哗∷晁撸” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵跋选,是天一觀的道長涕癣。 經(jīng)常有香客問我,道長前标,這世上最難降的妖魔是什么坠韩? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任距潘,我火速辦了婚禮,結(jié)果婚禮上只搁,老公的妹妹穿的比我還像新娘音比。我一直安慰自己,他們只是感情好氢惋,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布洞翩。 她就那樣靜靜地躺著,像睡著了一般焰望。 火紅的嫁衣襯著肌膚如雪骚亿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天熊赖,我揣著相機(jī)與錄音循未,去河邊找鬼。 笑死秫舌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绣檬。 我是一名探鬼主播足陨,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼娇未!你這毒婦竟也來了墨缘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤零抬,失蹤者是張志新(化名)和其女友劉穎镊讼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體平夜,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蝶棋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忽妒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玩裙。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖段直,靈堂內(nèi)的尸體忽然破棺而出吃溅,到底是詐尸還是另有隱情,我是刑警寧澤鸯檬,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布决侈,位于F島的核電站,受9級特大地震影響喧务,放射性物質(zhì)發(fā)生泄漏赖歌。R本人自食惡果不足惜枉圃,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俏站。 院中可真熱鬧讯蒲,春花似錦、人聲如沸肄扎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犯祠。三九已至旭等,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衡载,已是汗流浹背搔耕。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留痰娱,地道東北人弃榨。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像梨睁,于是被迫代替她去往敵國和親鲸睛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350