日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring Security入門demo案例

瀏覽:47日期:2023-12-13 17:35:56
目錄一、簡介二、入門案例三、自定義認證邏輯四、自定義授權邏輯五、注銷登錄六、記住我功能七、會話管理一、簡介

Spring Security是一個高度自定義的安全框架。利用Spring IoC/DI和AOP功能,為系統提供了聲明式安全訪問控制功能,減少了為系統安全而編寫大量重復代碼的工作。主要包含如下幾個重要的內容:

認證(Authentication),系統認為用戶是否能登錄。 授權(Authorization),系統判斷用戶是否有權限去做某些事情。二、入門案例

首先引入必要的依賴:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>

然后創建一個controller:

@Slf4j@RestControllerpublic class SecurityController { @GetMapping({'/', '/index'}) public String getLogin() {log.info('進入index');return 'index'; }}

此時,我們的入門案例就完成了。啟動項目,Spring Security默認就開啟了,此時訪問localhost:8080/index就會被Spring Security攔截,跳轉到內置的登錄頁面要求登錄。

默認情況下,登錄的用戶名為user,密碼在啟動項目的時候,控制臺有打印出來:

Using generated security password: 0bfad04b-7a47-40fb-ae15-2a4a7c57099b

使用如上的賬密登錄后,再次訪問localhost:8080/index就可以正常返回預期的內容index了。

如果我們不希望使用默認的用戶密碼,可以在配置文件中指定一個,如此Spring Security就會使用我們指定的,而不會使用默認的了。

spring.security.user.name=zhangxunspring.security.user.password=123123三、自定義認證邏輯

當我們開啟自定義認證邏輯后,上面的默認用戶和配置文件中的用戶就不生效了,可以先行刪除。

我們新建一個MySecurityConfig類,并繼承WebSecurityConfigurerAdapter類,用于自定義認證邏輯。

@EnableWebSecuritypublic class MySecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception {// 指定使用BCryptPasswordEncoder對前端傳過來的明文密碼進行encodePasswordEncoder encoder = new BCryptPasswordEncoder();// 用戶的真實密碼需要encode,security是比較兩個密文是否一致auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser('root').password(encoder.encode('root123')).roles(); }}

需要注意的是,密碼必須使用如上的PasswordEncoder進行編碼,否則會拋出如下錯誤:

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id 'null'

此時,我們重啟應用,訪問localhost:8080/index進入內置的登錄頁面,輸入root/root123之后就能正常返回index內容了。

四、自定義授權邏輯

一般權限管理都是基于RBAC模型的,即登錄的用戶肯定擁有某些角色,這些角色允許訪問某些資源。我們先來改造下認證的邏輯:

@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception { PasswordEncoder encoder = new BCryptPasswordEncoder(); auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser('root').password(encoder.encode('root123')).roles('admin','manager').and().withUser('manager').password(encoder.encode('mm000')).roles('manager');}

使得root用戶擁有admin和manager兩個角色,zhang用戶擁有manager一個角色。

然后我們在該配置類中再增加自定義授權的邏輯:

@Overrideprotected void configure(HttpSecurity http) throws Exception { http.authorizeRequests()// 任何角色允許訪問.antMatchers('/', '/index').permitAll()// 僅admin角色可以訪問.antMatchers('/admin/**').hasRole('admin')// admin和manager兩個角色可以訪問.antMatchers('/manager/**').hasAnyRole('admin', 'manager'); // 沒有權限則進入內置的登錄頁面 http.formLogin();}

然后為了測試,我們還需要增加幾個資源:

@Slf4j@RestControllerpublic class SecurityController { @GetMapping({'/', '/index'}) public String getLogin() {log.info('進入index');return 'index'; } @GetMapping('admin/getHello') public String getAdminHello(){return 'hello admin!'; } @GetMapping('manager/getHello') public String getManagerHello(){return 'hello manager!'; } @GetMapping('guest/getHello') public String getGuestHello(){return 'hello guest!'; }}

此時,重啟項目,我們發現:

訪問/,/index,/guest/**的資源直接就能返回,不需要認證和授權。 訪問/admin/**資源的時候,由于沒有登錄,會跳轉到內置的登錄頁面;如果已經登錄,只有root用戶登錄后才可以訪問; 訪問/admin/**資源的時候,由于沒有登錄,會跳轉到內置的登錄頁面;如果已經登錄,那么root和zhang用戶都能訪問;

我們還可以定制自己的登錄頁面,用于替換Spring Security內置的登錄頁面,這塊需要定制html頁面,本文不再詳述,比較簡單,可以參考formLogin的源碼注釋,里面講的比較清楚。

五、注銷登錄

因為我們使用的是Spring Security內置的登錄頁面,各個資源返回的也是json字符串,并非頁面,所以如何實現注銷登錄是個問題。但可以通過閱讀HttpSecurity:logout中的源碼注釋,我們基本就能學會怎么操作了。

注銷登錄默認就開啟了,默認是訪問/logout,和/login一樣都是Spring Security自己實現的,我們調用即可; 注銷登錄會清除服務器端的session,清除remember me等設置;這個后面再詳細解說; 注銷登錄后默認會跳轉到/login頁面;

還是如上的案例,我們在登錄后,直接調用http://localhost:8080/logout就可以實現上述的注銷登錄功能了。

但是在有些時候,我們會自定義登出的URL以及成功登出后應該跳轉到哪個URL,Spring Security也支持我們進行自定義。

@Override protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()// 任何角色允許訪問.antMatchers('/', '/index').permitAll()// 僅admin角色可以訪問.antMatchers('/admin/**').hasRole('admin')// admin和manager兩個角色可以訪問.antMatchers('/manager/**').hasAnyRole('admin', 'manager');// 沒有權限進入內置的登錄頁面http.formLogin();// 自定義登出邏輯http.logout().logoutUrl('/myLogOut').logoutSuccessUrl('/index'); }

當Post方式請求/myLogOut的時候就會觸發Spring Security的登出邏輯,并且登出后會跳轉到/index界面。

注意:在本案例中,是使用瀏覽器進行測試的,而且沒有html的頁面,所以使用瀏覽器發起post請求比較困難,那么使用get請求發起可以嗎?默認是不行的,因為Spring Security默認開啟了CSRF校驗,所有改變狀態的請求都必須以POST方式提交,為了能驗證我們這個例子,我們需要把CSRF校驗關掉,即在如上logout代碼后面加上如下的配置:

// 暫時關閉CSRF校驗,允許get請求登出http.csrf().disable();

此時再重啟應用,就可以驗證localhost:8080/myLogOut的登出邏輯了。

六、記住我功能

當我們沒有開啟記住我功能的時候,登錄root用戶后,如果關掉瀏覽器,重新打開網址,會發現登錄已經退出了,這是因為登錄信息只在當前會話有效。

如果我們想要在某個時間段以內,一直使root用戶處于登錄狀態,那么就需要在瀏覽器端設置一個cookie,在有效期內,這個cookie所屬的用戶就一直是登錄的狀態。同樣的,只要在上面注銷登錄的代碼后面加上:

// 開啟remember me功能,有效期默認14天http.rememberMe();

此時內置的登錄頁面會出現記住我的選擇框,當我們選擇上登錄后,瀏覽器端就會有當前用戶的cookie信息了(名稱為remember-me),在它過期之前,登錄狀態就一直有效。

需要用戶主動退出登錄,也就是調用我們上面的/myLogOut才能將cookie清除并退出登錄。

如果是自定義的登錄頁面,可以在后面鏈式調用rememberMeParameter()方法,傳入自己的rememberme參數名稱即可。

以上是關于Spring Security的基本使用方法,使用數據庫及其它特性將會在后面的文章中予以說明。

七、會話管理

在以上例子中,認證和授權都是Spring Security自動進行的。但是有的時候我們需要管理會話,比如從會話中獲取用戶姓名、用戶的權限信息;會話策略選擇以及會話超時設置等。

我們只需要增加如下的方法即可:

private String getName(){Authentication authentication = SecurityContextHolder.getContext().getAuthentication();Object principal = authentication.getPrincipal();if(principal == null){ return '游客';}if(principal instanceof UserDetails){ UserDetails userDetails = (UserDetails) principal; return userDetails.getUsername();} else{ return principal.toString();} }

該方法使用SecurityContextHolder獲取上下文信息,然后再獲取到其中的用戶名即可,當然其中還提供了可以獲取密碼、權限信息等方法。

Session的管理策略有以下幾種:

always,如果沒有Session就會創建一個; ifRequired,登錄時如果有需要,就創建一個; never,不會主動創建session,如果其它地方創建了session,就會使用它; stateless,不會創建也不會使用session;

其中ifRequired是默認的模式,stateless是采用token機制時,session禁用的模式,設置方法如下:

@Override protected void configure(HttpSecurity http) throws Exception {http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED); }

至于session的超時和安全可以在配置文件中設置:

# 超時時間設置server.servlet.session.timeout=3600s# 瀏覽器腳本將無法訪問cookieserver.servlet.session.cookie.http‐only=true# cookie將僅通過HTTPS連接發送server.servlet.session.cookie.secure=true

到此這篇關于Spring Security入門demo案例的文章就介紹到這了,更多相關Spring Security入門內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本免费一区二区视频| 亚洲精品网址| 国产精品网站在线看| 国产美女久久| 欧美日韩激情在线一区二区三区| 蜜臀a∨国产成人精品| 欧美xxxx中国| 婷婷精品在线| 激情婷婷亚洲| 国产精品久久久久77777丨| 久久久久久久久99精品大| 日韩 欧美一区二区三区| 久久精品国语| 中文字幕亚洲在线观看| 色老板在线视频一区二区| xxxxx性欧美特大| 热久久久久久| 欧美aa一级| 91看片一区| 欧美一区不卡| 欧美黄色一区二区| 精品国产一区二区三区av片| 黄色在线网站噜噜噜| 国产综合精品| 亚洲精品一级二级三级| 国产伦乱精品| 日韩精品不卡一区二区| 美女少妇全过程你懂的久久| 久久午夜影视| 国产精品亚洲欧美一级在线| 久久尤物视频| 五月婷婷亚洲| 日韩一区精品| 国产激情综合| 亚洲福利一区| 欧美专区一区| 欧美天堂视频| 蜜桃传媒麻豆第一区在线观看| 欧美日韩夜夜| 精精国产xxxx视频在线播放| 日韩专区一卡二卡| 久久av免费| 在线视频精品| 精品一区二区三区的国产在线观看| 久久要要av| 日本免费新一区视频| 电影91久久久| 蜜桃久久av一区| 国产精品亚洲四区在线观看| 久久久久午夜电影| 欧美亚洲自偷自偷| 自由日本语亚洲人高潮| 欧美激情视频一区二区三区免费 | 日韩不卡一区| 自拍自偷一区二区三区| 国产精品专区免费| 日韩高清一级| 亲子伦视频一区二区三区| 日韩国产精品久久久久久亚洲| a天堂资源在线| 日韩激情一区二区| 亚洲国内欧美| 国产欧美日韩精品一区二区免费| 激情欧美亚洲| 国产va免费精品观看精品视频| 最近国产精品视频| 欧美日韩在线播放视频| 国产在线观看91一区二区三区| 日本不卡高清| 中文欧美日韩| 日本韩国欧美超级黄在线观看| 国产精品久久国产愉拍| 喷白浆一区二区| 久久视频精品| 日韩天堂在线| 黄色精品视频| 国产精品欧美大片| 久久高清一区| 激情综合网五月| 日韩欧美在线中字| 久久超级碰碰| 久久国内精品| 亚洲精品高潮| 少妇精品久久久| 亚洲女人av| 99re国产精品| 91看片一区| 国产一区二区三区四区五区传媒 | 国产一区二区三区成人欧美日韩在线观看| 日韩欧美另类中文字幕| 日韩精品欧美| 91亚洲精品视频在线观看| 亚洲欧美日本国产 | 成人在线观看免费视频| 日韩精品一级| 好看的亚洲午夜视频在线| 国产不卡精品在线| 国产一区2区| 国产精品115| 青青伊人久久| 另类激情亚洲| 成人在线免费观看网站| 四虎成人av| 国产精品伦一区二区| 亚洲少妇诱惑| 欧美+日本+国产+在线a∨观看| 日本欧美不卡| а√天堂8资源中文在线| 国产极品嫩模在线观看91精品| 18国产精品| 亚洲乱码视频| 免费在线观看视频一区| 久草免费在线视频| 午夜国产一区二区| 欧美精品九九| 国产第一亚洲| 久久三级中文| 久久久久久色| 亚洲免费专区| 久久精品一区二区不卡| 黄色网一区二区| 精品国产鲁一鲁****| 黑丝一区二区| 蜜桃av一区二区在线观看| 在线亚洲激情| 午夜精品免费| 亚洲欧美日韩在线观看a三区 | 久久国产亚洲| 999久久久精品国产| 亚洲成人va| 欧美日韩尤物久久| а√天堂8资源在线| 精品一区欧美| 69堂免费精品视频在线播放| 日韩欧美网址| 婷婷成人综合| 亚洲女同中文字幕| 国产精品毛片在线| 在线视频观看日韩| 日本91福利区| 国产精品www.| 久久精品三级| 久久久成人网| 日本伊人久久| 国产精品久久777777毛茸茸| 精品日韩一区| 日本在线啊啊| 蜜桃av.网站在线观看| 国内精品福利| 亚洲欧美视频| 欧美一区91| 成人午夜网址| 久久国产福利| 国产日韩高清一区二区三区在线 | 亚洲精品88| 99国产精品久久久久久久| 亚洲午夜国产成人| 日本aⅴ亚洲精品中文乱码| 国产日产精品_国产精品毛片 | 亚洲在线电影| 国产日韩一区二区三免费高清| 鲁大师精品99久久久| 欧美中文字幕一区二区| 亚洲午夜久久| 国产suv精品一区二区四区视频 | 国产精品探花在线观看| 成人在线超碰| 国产亚洲高清视频| 日韩欧美不卡| 日韩高清成人在线| 日韩av福利| 三级欧美在线一区| 婷婷综合六月| 日韩一区中文| 中文在线免费视频| 一区二区三区午夜视频| 久久久精品日韩| 欧美综合精品| 免费毛片在线不卡| 国产精品hd| 亚洲1区在线| 日韩综合在线| 天堂久久av| 久久免费国产| 欧美日韩亚洲一区在线观看| 一本一道久久a久久| sm久久捆绑调教精品一区| 中文字幕av一区二区三区人| 伊人久久在线| 久久久久观看| 午夜电影一区| 黄色精品网站| 美女国产一区二区三区| 日韩精品免费视频一区二区三区 | 综合日韩在线| 亚洲色诱最新| 久久久久国产| 午夜av一区| 日韩有吗在线观看| 福利片在线一区二区|