springboot整合security和vue的實踐
環(huán)境
springboot1.5.9
完整代碼,內(nèi)有sql,先建庫,在運行sql建表,sql中已插入測試的數(shù)據(jù)。
https://github.com/2010yhh/springBoot-demos/tree/master/springboot-security
訪問首頁:http://localhost:8080
1.security參考資料
Spring Security參考文檔:https://docs.spring.io/spring-security/site/docs/4.1.0.RELEASE/reference/htmlsingle/#what-is-acegi-security
spring-security源碼:https://github.com/spring-projects/spring-security/
主要功能:認證和授權(quán)
Configurer Filter 功能說明
CorsConfigurer CorsFilter 提供跨域訪問配置支持的Filter
SessionManagementConfigurer SessionManagementFilter 會話管理Filter
RememberMeConfigurer RememberMeAuthenticationFilter 記住用戶名及密碼功能支持
ExpressionUrlAuthorizationConfigurer
CsrfConfigurer CsrfFilter 跨站請求偽造保護Filter;
LogoutConfigurer LogoutFilter 退出登錄請求處理Filter
FormLoginConfigurer UsernamePasswordAuthenticationFilter 表單登錄請求處理Filter
OAuth2LoginConfigurer OAuth2AuthorizationRequestRedirectFilter OAuth2請求權(quán)限控制處理Filter,為其它網(wǎng)站提供本網(wǎng)站Oauth2方式登錄,即其它網(wǎng)站通過本網(wǎng)站的賬戶密碼進行登錄授權(quán)
HttpBasicConfigurer BasicAuthenticationFilter Security基礎(chǔ)登錄授權(quán)Filter,將其結(jié)果保存在SecurityContextHolder中
認證流程原理:
參考:https://www.processon.com/view/link/5ac1e565e4b00dc8a026ab46
2.springboot整合security要點
主要是class WebSecurityConfig extends WebSecurityConfigurerAdapter
SecurityConfig配置信息,參考代碼中的WebSecurityConfig類
2.1獲取登錄用戶信息
UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext() .getAuthentication() .getPrincipal();
2.2自定義登入登出url
1)SecurityConfig配置中配置:
.and() .formLogin() //指定url,可由相應(yīng)的controller處理跳轉(zhuǎn)到登錄頁如login_page.html .loginPage("/mylogin")//自定義登錄url //指定自定義form表單請求的路徑 .loginProcessingUrl("/myloginForm").usernameParameter("userName").passwordParameter("passWord") //.defaultSuccessUrl("/success") .successForwardUrl("/success")//設(shè)置了登入登出的Handler,優(yōu)先響應(yīng)Handler .failureUrl("/fail")//設(shè)置了登入登出的Handler,優(yōu)先響應(yīng)Handler
.and() .logout() .logoutUrl("/mylogout")//自定義退出url .logoutSuccessUrl("/mylogin") .logoutSuccessHandler(myLogoutSuccessHandle)//設(shè)置了登入登出的Handler,優(yōu)先響應(yīng)Handler .invalidateHttpSession(true) .permitAll()
2)前端請求中改寫請求的url
如vue請求:
export const login = data => { return http.post(`/myloginForm?userName=${data.userName}&passWord=${data.passWord}&rememberMe=${data.rememberMe}&imageCode=${data.imageCode}`) } export const logout = data => { return http.post(`/mylogout`) }
如一般html表單請求:
<!--要與.loginProcessingUrl("/myloginForm")相對應(yīng)--> <form name="f" action="/myloginForm" method="post"> <br/> 用戶名: <input type="text" name="userName" placeholder="name"><br/> 密碼: <input type="password" name="passWord" placeholder="password"><br/> <input type="text" name="imageCode"> <img src="/createImageCode"><br/> <input type="checkbox" name="rememberMe"/>下次自動登錄<br/> <input name="submit" type="submit" value="提交"> </form> <form action="/mylogout" method="post"> <input type="submit" class="btn btn-primary" value="注銷"/><!-- 5 --> </form>
2.3自定義Handler返回json
1)重寫AuthenticationSuccessHandler、AuthenticationFailureHandler、LogoutSuccessHandler、AccessDeniedHandler、AuthenticationEntryPoint 這5個類,分別是登錄成功、登錄失敗、退出成功、權(quán)限不足、尚未登錄,在這幾個重寫類中自定義返回json格式
2)SecurityConfig配置中配置;
//自定義認證成功或者失敗的返回json .successHandler(myAuthenticationSuccessHandler) .failureHandler(myAuthenticationFailureHandler) .logoutSuccessHandler(myLogoutSuccessHandle)//設(shè)置了登入登出的Handler,優(yōu)先響應(yīng)Handler
http.exceptionHandling().authenticationEntryPoint(myAuthenticationEntryPoint);//未登錄 http.exceptionHandling().accessDeniedHandler(myAccessDeniedHandler); // 無權(quán)訪問
2.4記住我功能
關(guān)掉瀏覽器,重新打開登錄url,無需登錄直接跳轉(zhuǎn)到首頁或其他頁面
1)SecurityConfig配置中配置
.and() .rememberMe()// 記住我 .rememberMeParameter("rememberMe") .tokenRepository(persistentTokenRepository()) .userDetailsService(myUserDetailsService).tokenValiditySeconds(60 * 60 * 24);
2)SecurityConfig配置中配置寫token入數(shù)據(jù)庫的bean
/** * springSecurity會根據(jù)情況自動將token插入persistent_logins * * @return */ @Bean public PersistentTokenRepository persistentTokenRepository() { JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); tokenRepository.setDataSource(dataSource); return tokenRepository; }
2.5驗證碼功能
1)自定義驗證碼過濾器,在其中驗證輸入的驗證碼和保存在session中的驗證碼是否一致
2)SecurityConfig配置中配置
//將我們自定義的驗證碼過濾器,配置 //UsernamePasswordAuthenticationFilter之前http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)
2.6限制登錄次數(shù)
1)自定義登錄成功、登錄失敗的事件監(jiān)聽器
public class AuthenticationSuccessEventListener implements ApplicationListener<AuthenticationSuccessEvent> {} public class AuthenticationFailureListener implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> {}
2)可以利用數(shù)據(jù)庫或者redis或者換成來存儲登錄失敗次數(shù)進行判斷鎖定賬號
3)實際項目管理員角色應(yīng)該有解鎖賬號的功能
2.7密碼加密
1)新建用戶時,存儲密碼為加密后的,本文使用BCryptPasswordEncoder
2)執(zhí)行登錄的過程中:security內(nèi)部會對輸入的密碼加密和查詢得到的用戶的密碼進行校驗
2.8后臺提供接口,返回前端json,整合vue做前端登入登出
這也是前后端分離的模式。
前端可以先獲取當(dāng)前登錄用戶的所有角色及所有權(quán)限(權(quán)限可以細化到菜單、按鈕和接口):進而決定前端顯示效果
注意前端請求的url寫法:
export const login = data => { return http.post(`/myloginForm?userName=${data.userName}&passWord=${data.passWord}&rememberMe=${data.rememberMe}&imageCode=${data.imageCode}`) } export const logout = data => { return http.post(`/mylogout`) }
3.測試
三個用戶:admin manager user2進行測試,本代碼中權(quán)限沒有用,只用到了角色這一級別。測試記住我功能時,要清除cookie,免得影響測試。
用戶 | 角色 | 權(quán)限 |
---|---|---|
admin | admin manager user | add delete query queryall update |
manager | manager user | query queryall |
user2 | user | query |
對http://localhost:8080/user/list http://localhost:8080/user/list2 http://localhost:8080/user/list3(無需登錄都可以訪問) 三個url設(shè)置不同的角色
.antMatchers( "/user/list").hasAuthority("admin") .antMatchers( "/user/list2").hasRole("manager")
輸入:http://localhost:8080 重定向到登錄頁:http://localhost:8080/#/login
2)輸入admin manager user2 的正確用戶名和密碼后,登錄成功返回的頁面顯示不同效果;三個用戶登錄成功后,直接訪問url,會根據(jù)用戶的角色不同進行攔截,點擊退出后,重新回到http://localhost:8080/#/login
user2:
直接訪問url:http://localhost:8080/user/list
manager:
直接訪問url:http://localhost:8080/user/list
admin:
直接訪問url:http://localhost:8080/user/list
直接訪問注銷url:
4)測試記住我
用admin用戶測試
這里關(guān)閉瀏覽器或者重啟進程后,直接訪問需要角色的資源如:http://localhost:8080/#/home或者http://localhost:8080/user/list
可以直接訪問無需登錄。
但是訪問首頁http://localhost:8080 或者http://localhost:8080/#/login卻不能跳轉(zhuǎn)到http://localhost:8080/#/home
5)測試驗證碼
驗證碼過期或者輸錯或者刷新頁面,會重新生成驗證碼。
6)測試限制登錄次數(shù)
在輸入正確驗證碼的情況下,輸錯驗證碼會直接拋出驗證碼的異常,連續(xù)輸錯3次(可以設(shè)置)用戶名或者密碼,賬號會鎖定,拋出賬號鎖定異常。
到此這篇關(guān)于springboot整合security和vue的實踐的文章就介紹到這了,更多相關(guān)springboot整合security和vue內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot安全框架整合SpringSecurity實現(xiàn)方式
- springboot整合springsecurity與mybatis-plus的簡單實現(xiàn)
- SpringBoot如何整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制
- SpringBoot整合SpringSecurityOauth2實現(xiàn)鑒權(quán)動態(tài)權(quán)限問題
- Springboot詳解整合SpringSecurity實現(xiàn)全過程
- SpringBoot整合SpringSecurity實現(xiàn)JWT認證的項目實踐
- SpringBoot整合Security權(quán)限控制登錄首頁
- SpringBoot整合Spring?Security過濾器鏈加載執(zhí)行流程源碼分析(最新推薦)
- SpringBoot整合SpringSecurity和JWT和Redis實現(xiàn)統(tǒng)一鑒權(quán)認證
- SpringBoot整合SpringSecurity認證與授權(quán)
- SpringBoot整合Spring Security構(gòu)建安全的Web應(yīng)用
相關(guān)文章
Java多線程使用阻塞隊列實現(xiàn)生產(chǎn)者消費者模型詳解
這篇文章主要介紹了Java多線程使用阻塞隊列實現(xiàn)生產(chǎn)者消費者模型詳解,主要講解阻塞隊列的特性、實際開發(fā)中常用的到的生產(chǎn)者消費者模型,以及生產(chǎn)者消費者模型解耦合、削峰填谷的好處,需要的朋友可以參考下2023-07-07異常解決SpringBoot項目啟動卡住,無任何異常信息問題
這篇文章主要介紹了異常解決SpringBoot項目啟動卡住,無任何異常信息問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03詳解springboot采用多數(shù)據(jù)源對JdbcTemplate配置的方法
在本篇文章中我們給大家詳細分享了springboot采用多數(shù)據(jù)源對JdbcTemplate配置的方法,有需要的朋友們可以學(xué)習(xí)參考下。2018-10-10java.lang.Instrument 代理Agent使用詳細介紹
這篇文章主要介紹了java.lang.Instrument 代理Agent使用詳細介紹的相關(guān)資料,附有實例代碼,幫助大家學(xué)習(xí)參考,需要的朋友可以參考下2016-11-11springBoot項目中的static和templates文件夾的使用
本文主要介紹了springBoot項目中的static和templates文件夾的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07關(guān)于easyExcel中讀取Excel表頭的實例說明
EasyExcel是阿里巴巴開源的一個excel處理框架,以使用簡單、節(jié)省內(nèi)存著稱,下面這篇文章主要給大家介紹了關(guān)于easyExcel中讀取Excel表頭的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-06-06