Spring Boot2.0使用Spring Security的示例代碼
一、Spring Secutity簡(jiǎn)介
Spring 是一個(gè)非常流行和成功的 Java 應(yīng)用開(kāi)發(fā)框架。Spring Security 基于 Spring 框架,提供了一套 Web 應(yīng)用安全性的完整解決方案。一般來(lái)說(shuō),Web 應(yīng)用的安全性包括用戶認(rèn)證(Authentication)和用戶授權(quán)(Authorization)兩個(gè)部分。用戶認(rèn)證指的是驗(yàn)證某個(gè)用戶是否為系統(tǒng)中的合法主體,也就是說(shuō)用戶能否訪問(wèn)該系統(tǒng)。用戶認(rèn)證一般要求用戶提供用戶名和密碼。系統(tǒng)通過(guò)校驗(yàn)用戶名和密碼來(lái)完成認(rèn)證過(guò)程。用戶授權(quán)指的是驗(yàn)證某個(gè)用戶是否有權(quán)限執(zhí)行某個(gè)操作。在一個(gè)系統(tǒng)中,不同用戶所具有的權(quán)限是不同的。比如對(duì)一個(gè)文件來(lái)說(shuō),有的用戶只能進(jìn)行讀取,而有的用戶可以進(jìn)行修改。一般來(lái)說(shuō),系統(tǒng)會(huì)為不同的用戶分配不同的角色,而每個(gè)角色則對(duì)應(yīng)一系列的權(quán)限。
對(duì)于上面提到的兩種應(yīng)用情景,Spring Security 框架都有很好的支持。在用戶認(rèn)證方面,Spring Security 框架支持主流的認(rèn)證方式,包括 HTTP 基本認(rèn)證、HTTP 表單驗(yàn)證、HTTP 摘要認(rèn)證、OpenID 和 LDAP 等。在用戶授權(quán)方面,Spring Security 提供了基于角色的訪問(wèn)控制和訪問(wèn)控制列表(Access Control List,ACL),可以對(duì)應(yīng)用中的領(lǐng)域?qū)ο筮M(jìn)行細(xì)粒度的控制。
另外Spring Security也集成了OAuth2.0,接下來(lái)我們就介紹下這兩種使用的,當(dāng)然Spring Security還集成CAS等等,如果你要了解更多請(qǐng)查看 官方文檔 ,我們下面的都是使用Spring Boot2.0做的demo,2.0以后已經(jīng)集成了Spring Security5.0以上的版本;
二、Basic認(rèn)證
這個(gè)也是我們經(jīng)常使用的基于表單的認(rèn)證,輸入一個(gè)賬號(hào)和密碼點(diǎn)擊登錄這種,就是Basic認(rèn)證,我們接下主要會(huì)講一下使用以及5.0以后做了那些升級(jí);
1.使用以及常用的一些參數(shù)的介紹
第一步使用Maven引入Spring Security jia包,這里我們使用Thymeleaf作為前端模板頁(yè)面,這里也有一個(gè)地方可以探討一波,為什么Spring MVC可以自由切換模板,這個(gè)地方我們找個(gè)機(jī)會(huì)一起探討,這里先做下簡(jiǎn)單的介紹;
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- 前端模板 thymeleaf 依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!--安全認(rèn)證框架--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> </dependencies>
第二步引入Java配置配置方案
這里我們先使用@Configuration和@EnableWebSecurity對(duì)Java類(lèi)進(jìn)行配置,接下來(lái)我們就是繼承WebSecurityConfigurerAdapter,對(duì)里面的方法重寫(xiě)就可以了,分別是對(duì)AuthenticationManagerBuilder,WebSecurity,HttpSecurity方法,我們主要介紹AuthenticationManagerBuilder和HttpSecurity,通過(guò)對(duì)這兩種方法重寫(xiě)最終實(shí)現(xiàn)我們自定義認(rèn)證;
先來(lái)介紹一下HttpSecurity常用參數(shù),如下圖用法基本脫離不了下面這些方法,可以基于認(rèn)證的方式有formLogin、openidLogin、oauth2Login,還可以做一些記住賬號(hào)操作rememberMe,還可以進(jìn)行session配置管理,還支持登出loginout等等,使用起來(lái)還是蠻簡(jiǎn)單的,大家可以參照一下這篇文章,還是蠻詳細(xì)的;
接下來(lái)我們?cè)倏聪翧uthenticationManagerBuilder,我們重寫(xiě)這個(gè)方法,可以基于內(nèi)存用戶認(rèn)證、數(shù)據(jù)庫(kù)認(rèn)證、LDAP認(rèn)證、還可以自定義用戶服務(wù)、還可以自己定義認(rèn)證。這里我們使用自定義認(rèn)證的做demo,另外這個(gè)大家還可能有一個(gè)困惑的點(diǎn),configGlobal和configure的差別在哪里,這里大家可以 參考下這篇文章 ,Spring Security從3.2版本以后就默認(rèn)開(kāi)啟了CRSF防護(hù),這里是通過(guò)Token方式去檢測(cè)的,在登陸的時(shí)候Thymeleaf模板會(huì)生成_csrf的標(biāo)簽來(lái)防止CRSF,對(duì)CSRF不懂的大家可以看下這篇文章 ,這個(gè)里面介紹一些防護(hù)CSRF的手段,大家可以思考下,我的demo只是一個(gè)簡(jiǎn)單的架子,為了是給大家介紹一些知識(shí),可擴(kuò)展大家根據(jù)這些介紹的知識(shí)可以隨心所欲的擴(kuò)展自己想要的,不要拘泥于一種方法;
最后我還要介紹一下加密的方式,Spring Security 4的時(shí)候我們常用的加密方式是MD5加鹽的方式,5.0以后版本就找不到Md5PasswordEncoder,說(shuō)明這個(gè)方法還是不夠安全,還是可以通過(guò)暴力破解可以搞定,可能我不行但是攔不住一些高手,大家可以看下官方支持的以及棄用一些方法:
使用我就不介紹了,有興趣可以自己探索一波,還可以參考一下 文章一 、文章二 ,下面我粘貼我的代碼,講到的這些可以擴(kuò)展的地方大家我在代碼中會(huì)標(biāo)識(shí)清楚,喜歡動(dòng)手可以嘗試一下,我的重點(diǎn)是OAuth2驗(yàn)證;
/** *自定義認(rèn)證 * Created by wangt on 2018/7/29. */ @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { /** * http資源認(rèn)證 * @param http * @throws Exception */ @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/","/home").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } /** * 自定義認(rèn)證策略 */ @Autowired public void configGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(authProvider()).eraseCredentials(true); } @Bean public AuthProvider authProvider(){ return new AuthProvider(); } } /** * 自定義認(rèn)證 * Created by wangt on 2018/8/18. */ public class AuthProvider implements AuthenticationProvider { private final BCryptPasswordEncoder bCryptPasswordEncoder=new BCryptPasswordEncoder(); @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String userName = authentication.getName(); String inputPassword = (String) authentication.getCredentials(); //如果你要使用thymeleaf認(rèn)證方言可以擴(kuò)展一下User //GrantedAuthority這個(gè)是使用方言的屬性,有興趣了解下 //其實(shí)也就是通過(guò)這個(gè)使用if去判斷 User user =new User(); user.setName("admin"); user.setPassword("admin"); if (user == null) { throw new AuthenticationCredentialsNotFoundException("authError"); } //這一塊可以自定義一些加密方式 //自己動(dòng)手實(shí)現(xiàn)一下 if (true) { //這塊有好幾個(gè)構(gòu)造 //如果使用方言你可以使用3個(gè)參數(shù)的構(gòu)造函數(shù) return new UsernamePasswordAuthenticationToken(user, null); } throw new BadCredentialsException("authError"); } @Override public boolean supports(Class<?> aClass) { return true; } } /** * Created by wangt on 2018/8/18. */ @Configuration public class WebMvcConfig implements WebMvcConfigurer { //如果使用thymeleaf方言在這塊擴(kuò)展 @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/index").setViewName("index"); registry.addViewController("/").setViewName("index"); registry.addViewController("/hello").setViewName("hello"); registry.addViewController("/login").setViewName("login"); } } <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--主頁(yè)面 index--> 您好!歡迎光臨! <a href="/login">登錄</a> <a href="/hello">限制訪問(wèn)的頁(yè)面</a> </body> </html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--hello頁(yè)面--> hello </body> </html> <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--登錄頁(yè)面--> <form th:action="@{/login}" method="post"> <div><label> User Name : <input type="text" name="username"/> </label></div> <div><label> Password: <input type="password" name="password"/> </label></div> <div><input type="submit" value="登錄"/></div> </form> </body> </html> /** * 登錄控制器 * Created by wangt on 2018/8/18. */ @Controller public class LoginController { @GetMapping("/login") public String login(){ return "/login"; } } /** * 主頁(yè) * Created by wangt on 2018/7/28. */ @Controller public class HomeController { @GetMapping("/") public String index(){ return "index"; } } /** * hello頁(yè) * Created by wangt on 2018/8/19. */ @Controller public class HelloController { @GetMapping("/hello") public String index(){ return "hello"; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解Spring Boot Security工作流程
- Spring Boot Security 結(jié)合 JWT 實(shí)現(xiàn)無(wú)狀態(tài)的分布式API接口
- SpringBoot+Spring Security+JWT實(shí)現(xiàn)RESTful Api權(quán)限控制的方法
- Spring Boot整合Spring Security簡(jiǎn)單實(shí)現(xiàn)登入登出從零搭建教程
- SpringBoot + SpringSecurity 短信驗(yàn)證碼登錄功能實(shí)現(xiàn)
- SpringBoot結(jié)合SpringSecurity實(shí)現(xiàn)圖形驗(yàn)證碼功能
- Spring Boot Security配置教程
相關(guān)文章
Java設(shè)計(jì)模式之單態(tài)模式(Singleton模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之單態(tài)模式(Singleton模式)介紹,本文講解了如何使用單例模式、使用單例模式注意事項(xiàng)等內(nèi)容,需要的朋友可以參考下2015-03-03高可用架構(gòu)etcd選主故障主備秒級(jí)切換實(shí)現(xiàn)
這篇文章主要為大家介紹了高可用架構(gòu)etcd選主故障主備秒級(jí)切換的實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-02-02Java?Servlet實(shí)現(xiàn)表白墻的代碼實(shí)例
最近用Servlet做了個(gè)小項(xiàng)目,分享給大家,下面這篇文章主要給大家介紹了關(guān)于Java?Servlet實(shí)現(xiàn)表白墻的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02Mybatis之解決collection一對(duì)多問(wèn)題(顯示的結(jié)果沒(méi)有整合到一起)
這篇文章主要介紹了Mybatis之解決collection一對(duì)多問(wèn)題(顯示的結(jié)果沒(méi)有整合到一起),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Java編程實(shí)現(xiàn)數(shù)組轉(zhuǎn)成list及l(fā)ist轉(zhuǎn)數(shù)組的方法
這篇文章主要介紹了Java編程實(shí)現(xiàn)數(shù)組轉(zhuǎn)成list及l(fā)ist轉(zhuǎn)數(shù)組的方法,結(jié)合實(shí)例形式較為詳細(xì)的總結(jié)分析了java實(shí)現(xiàn)數(shù)組與list之間相互轉(zhuǎn)換的操作技巧,需要的朋友可以參考下2017-09-09Spring使用AOP完成統(tǒng)一結(jié)果封裝實(shí)例demo
這篇文章主要介紹了Spring使用AOP完成統(tǒng)一結(jié)果封裝,本文通過(guò)實(shí)現(xiàn)demo給大家詳細(xì)講解,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02Spring Boot中操作使用Redis實(shí)現(xiàn)詳解
Spring Boot與Redis結(jié)合使用,通過(guò)使用Spring Data Redis來(lái)實(shí)現(xiàn)對(duì)Redis的操作,實(shí)現(xiàn)數(shù)據(jù)緩存和高效存儲(chǔ),提高應(yīng)用程序的性能和響應(yīng)速度??梢岳肧pring Boot自帶的Redis Starter方便地集成和配置Redis2023-04-04