摘要:一旦最基本的應(yīng)用創(chuàng)建好了,你可以給他加上安全防護(hù)。一旦成功登出了,我們的應(yīng)用程序重定向到到并顯示相應(yīng)的登陸成功的消息。這標(biāo)記該應(yīng)用程序是一個應(yīng)用程序,并激活一些關(guān)鍵行為,比如創(chuàng)建一個。一旦應(yīng)用程序啟動,用瀏覽器訪問。
原網(wǎng)頁 https://spring.io/guides/gs/securing-web/
本指南將引導(dǎo)您完成創(chuàng)建一個資源由Spring Security的保護(hù)的一個簡單的Web應(yīng)用程序的過程。
你將構(gòu)建你將構(gòu)建一個通過固定的用戶列表作為后端的登錄表單來保護(hù)頁面安全的Spring MVC應(yīng)用程序
你將需要大約15分鐘
一個喜歡的文本編輯器或IDE
JDK 1.8 或更高版本
Gradle 2.3+ 或 Maven 3.0+
你同樣可以將本指南的代碼直接導(dǎo)入Spring Tool Suite (STS)并從這里開始你的工作
如何完成這個指南如同大多數(shù)的Spring入門指南,你可以從頭開始并完成每一個步驟,或者可以跳過這個你已經(jīng)熟悉的基本配置過程。無論哪種方式,您最終會獲得可運(yùn)行的代碼。
要從頭開始,請看“使用gradle構(gòu)建”部分。
要跳過最基本的部分,按下面的步驟操作:
下載然后解壓本項(xiàng)目的代碼,或者使用Git克隆一個代碼倉庫:
git clone https://github.com/spring-guides/gs-securing-web.git
cd 到 gs-securing-web/initial 目錄
直接跳到“部署Spring Security”
使用gradle構(gòu)建首先,你要創(chuàng)建一個基本的構(gòu)建腳本。你可以使用任何你喜歡的構(gòu)建系統(tǒng)來構(gòu)建Spring應(yīng)用程序,但是你所需要的Gralde和Maven構(gòu)建代碼已經(jīng)包含在這里了。如果你對兩者都不熟悉,可以參考“使用Gradle構(gòu)建Java項(xiàng)目”或“使用Maven構(gòu)建Java項(xiàng)目”。
創(chuàng)建目錄結(jié)構(gòu)你需要在你選的一個用作項(xiàng)目目錄的文件夾中,創(chuàng)建下面的子目錄結(jié)構(gòu);例如你可以在*nix系統(tǒng)中使用mkdir -p src/main/java/hello這樣的命令來完成。
└── src └── main └── java └── hello創(chuàng)建Gradle的build文件
下面是initial目錄下的Gradle的build文件(譯注:實(shí)際這個initial指的是項(xiàng)目的根目錄,它包含了上面所創(chuàng)建的src目錄,以及gradle.build文件,這樣執(zhí)行gradle build命令時,gradle才能正確地找到要構(gòu)建的代碼)。
文件名:build.gradle
buildscript { repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.5.RELEASE") } } apply plugin: "java" apply plugin: "eclipse" apply plugin: "idea" apply plugin: "spring-boot" jar { baseName = "gs-securing-web" version = "0.1.0" } repositories { mavenCentral() } sourceCompatibility = 1.8 targetCompatibility = 1.8 dependencies { compile("org.springframework.boot:spring-boot-starter-thymeleaf") testCompile("junit:junit") } task wrapper(type: Wrapper) { gradleVersion = "2.3" }使用maven構(gòu)建
略,請參考原文
使用IDE構(gòu)建略,請參考原文
創(chuàng)建一個不安全的Web應(yīng)用在你可以嘗試將安全性應(yīng)用于Web應(yīng)用之前,你需要一個用于“保護(hù)”的Web應(yīng)用程序。本節(jié)中的步驟指導(dǎo)您完成創(chuàng)建一個非常簡單的Web應(yīng)用程序。然后你將在下一節(jié)使用Spring Security將其保護(hù)起來。
這個web應(yīng)用程序包括兩個簡單的視圖,一個是“主頁”,一個是“Hello World”頁?!爸黜摗钡囊晥D由下面這個themeleaf模板來定義:
文件名:src/main/resources/templates/home.html
Spring Security Example Welcome!
Click here to see a greeting.
如你所見,這個簡單的視圖包括一個指向“/hello”頁面的鏈接,它由下面這個themeleaf模板來定義:
src/main/resources/templates/hello.html
Hello World! Hello world!
這個Web應(yīng)用基于Spring MVC,因此你需要配置Spring MVC,然后設(shè)置view controller來暴露這些模板。下面就是一個配置好Spring MVC的Class。
文件名:src/main/java/hello/MvcConfig.java
package hello; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration public class MvcConfig extends WebMvcConfigurerAdapter { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/home").setViewName("home"); registry.addViewController("/").setViewName("home"); registry.addViewController("/hello").setViewName("hello"); registry.addViewController("/login").setViewName("login"); } }
addViewControllers()方法(覆蓋了WebMvcConfigurerAdapter的同名方法)添加了四個view controller。其中兩個view controller指向了“home”視圖(在home.html中定義),另一個指向了“hello”視圖(在hello.html中定義)。第四個view controller指向另一個視圖“l(fā)ogin”,你將會在下個章節(jié)創(chuàng)建這個視圖。
此刻,你可以直接跳到“讓W(xué)eb應(yīng)用可執(zhí)行”的部分,在不需要任何登陸工作的情況下運(yùn)行Web應(yīng)用。
一旦最基本的Web應(yīng)用創(chuàng)建好了,你可以給他加上安全防護(hù)。
部署Spring Security假設(shè)現(xiàn)在你希望防止未授權(quán)的用戶在輸入“/hello”這個網(wǎng)址后看到歡迎頁的內(nèi)容。當(dāng)前狀態(tài)下,如果用戶點(diǎn)擊“home”頁上的鏈接,他們可以沒有任何阻礙地看到歡迎頁?,F(xiàn)在你需要在用戶看到這個頁面前添加一個強(qiáng)制用戶登錄的阻礙。
你可以通過配置Spring Security來完成上面所說的事。如果Spring Security在classpath中,SpringBoot會自動使用“基本”HTTP認(rèn)證來保護(hù)所有HTTP端點(diǎn),你也可以進(jìn)一步的定制安全設(shè)置。首先要做的事情就是把Spring Security加入到classpath中。
如果使用Gradle,它將會是dependencies部分中的一行:
文件名:build.gradle
dependencies { ... compile("org.springframework.boot:spring-boot-starter-security") ... }
如果使用Maven,他將會是
文件名:pom.xml
... ... org.springframework.boot spring-boot-starter-security
下面是確保只有認(rèn)證過的用戶才能看到“秘密的”歡迎頁的安全配置:
文件名:src/main/java/hello/WebSecurityConfig.java
package hello; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/home").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("user").password("password").roles("USER"); } }
這個WebSecurityConfig類被@EnableWebMvcSecurity標(biāo)注,來啟用Spring Security的web安全支持、以及提供與Spring MVC的融合。這個類還繼承了WebSecurityConfigurerAdapter并重寫了一些方法來指定一些特定的Web安全設(shè)置。
configure(HttpSecurity)方法規(guī)定了哪個URL應(yīng)該被保護(hù),哪個不應(yīng)該。具體而言,“/”和“/home”的路徑被配置為不需要任何認(rèn)證。所有其他URL必須進(jìn)行身份驗(yàn)證。
當(dāng)用戶成功登錄后,他們將被重定向到先前請求的需要身份驗(yàn)證的頁面。還有一個自定義(由loginPage()指定)的“/login”頁面,每個用戶都可以查看。
對于configureGlobal(AuthenticationManagerBuilder)方法,它設(shè)置了一個單一用戶在內(nèi)存中的用戶數(shù)據(jù)庫。該用戶被賦予“user”的用戶名,“password”的密碼,以及“USER”作為角色。
現(xiàn)在,我們需要創(chuàng)建登錄頁面。目前已經(jīng)為“l(fā)ogin”視圖賦予了視圖控制器,所以你只需要創(chuàng)建login視圖本身:
文件名:src/main/resources/templates/login.html
Spring Security Example Invalid username and password.You have been logged out.
正如你所看到的,這個Thymeleaf模板只是給出了一個采集用戶名和密碼,并將它們作為請求post到“/login”的表單。正如剛剛配置的,Spring Security提供一個過濾器,截取該請求,并驗(yàn)證用戶身份。如果用戶身份驗(yàn)證失敗,頁面被重定向到“/login?error”,我們的頁面將顯示相應(yīng)的錯誤信息。一旦成功登出了,我們的應(yīng)用程序重定向到到“/login?logout”并顯示相應(yīng)的登陸成功的消息。
最后,我們需要給用戶提供一種方式來顯示當(dāng)前用戶名和“Sign Out”按鈕。更新hello.html來問好當(dāng)前用戶,并包含一個“Sign Out”的按鈕,如下所示:
文件名:src/main/resources/templates/hello.html
Hello World! Hello [[${#httpServletRequest.remoteUser}]]!
我們通過使用Spring Security所集成的HttpServletRequest#getRemoteUser()來顯示用戶名。該“Sign Out”按鈕提交一個POST請求給“/logout”。一旦成功退出,將用戶重定向到“/login?logout”。
讓W(xué)eb應(yīng)用可執(zhí)行雖然可以打包這項(xiàng)服務(wù)作為一個傳統(tǒng)的web應(yīng)用程序歸檔或WAR文件部署到外部應(yīng)用服務(wù)器,下面展示了更簡單的方法來創(chuàng)建一個獨(dú)立的應(yīng)用程序。你將打包一切到一個單一的,可執(zhí)行的JAR文件中,用一個良好舊式Javamain()方法來調(diào)用。在此過程中,你會用到Spring所支持的嵌入式Tomcat servlet容器作為HTTP運(yùn)行實(shí)例,而不是部署一個外部實(shí)例。
文件名:src/main/java/hello/Application.java
package hello; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) throws Throwable { SpringApplication.run(Application.class, args); } }
@SpringBootApplication是個方便的注解,自動添加了所有以下內(nèi)容:
@Configuration標(biāo)記這個類作為bean以定義應(yīng)用程序上下文的來源。
@EnableAutoConfiguration告訴SpringBoot開始添加基于classpath設(shè)置,其他Beans,以及各種屬性設(shè)置的Beans。
通常情況下你會給Spring MVC應(yīng)用加上@EnableWebMvc注解,但當(dāng)Spring Boot看到classpath中有spring-webmvc時,會自動添加這個注解。這標(biāo)記該應(yīng)用程序是一個Web應(yīng)用程序,并激活一些關(guān)鍵行為,比如創(chuàng)建一個DispatcherServlet。
@ComponentScan告訴Spring去hello包中尋找其他組件,配置,服務(wù)。
該main()方法使用Spring Boot的SpringApplication.run()方法來啟動應(yīng)用程序。你有沒有注意到,這里沒有一行XML,同樣也沒有web.xml文件。這個Web應(yīng)用程序是100%純Java寫的,你不必處理配置任何管道或基礎(chǔ)設(shè)施(譯注:plumbing or infrastructure,我這里直譯了)。
構(gòu)建一個可執(zhí)行的JAR包如果你正在使用gradle,你可以使用./gradlew bootRun命令來運(yùn)行應(yīng)用程序。
你可以構(gòu)建一個包含所有必要的依賴,類和資源的一個可執(zhí)行的JAR文件。這樣使傳輸,版本管理和部署服務(wù)在整個開發(fā)生命周期在不同的環(huán)境,等等,變得更容易
./gradlew build
然后你可以這樣運(yùn)行JAR包:
java -jar build/libs/gs-securing-web-0.1.0.jar
如果你正在使用Maven,你可以通過mvn spring-boot:run來運(yùn)行應(yīng)用,或者你也可以通過mvn clean package來構(gòu)建JAR包,然后輸入下面的命令來運(yùn)行:
java -jar target/gs-securing-web-0.1.0.jar
注意:上述過程將創(chuàng)建一個可運(yùn)行的JAR。你也可以選擇構(gòu)建一個經(jīng)典的WAR包來代替。
一旦應(yīng)用程序啟動,用瀏覽器訪問http://localhost:8080。你應(yīng)該看到主頁:
當(dāng)你點(diǎn)擊這個鏈接,它會嘗試把你帶到/hello所指向的歡迎頁,但因?yàn)檫@個頁面是受保護(hù)的,而且目前為止你沒有登錄,它會帶你到登陸頁
注意:如果你是直接從“不安全”的版本跳到這的,那么你將不會看到登陸頁,請放松地回到上面寫完其余的基于安全的代碼
在登錄頁面,分別輸入“user”和“password”作為用戶名和密碼,即可作為測試用戶登錄。一旦你提交登錄表單,你會被進(jìn)行身份驗(yàn)證,然后帶你到歡迎頁:
如果你點(diǎn)擊“Sign Out”按鈕,你的身份驗(yàn)證被撤銷,你將會返回到登錄頁并顯示一個消息提示你已經(jīng)登出。
小結(jié)恭喜你,你已經(jīng)開發(fā)了一個簡單的、使用Spring Security來保護(hù)的Web應(yīng)用。
想寫一個新的指南,或向已有的指南貢獻(xiàn)自己的能力?請看我們的貢獻(xiàn)指南
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64796.html
摘要:框架具有輕便,開源的優(yōu)點(diǎn),所以本譯見構(gòu)建用戶管理微服務(wù)五使用令牌和來實(shí)現(xiàn)身份驗(yàn)證往期譯見系列文章在賬號分享中持續(xù)連載,敬請查看在往期譯見系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問層和前端控制器但是忽略了對身份進(jìn)行驗(yàn)證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護(hù)REST API 重拾后端之Spring Boot(一):REST API的搭建...
摘要:簡而言之,它將對動畫中變化的屬性數(shù)值做插值運(yùn)算并且刷新視圖。注意我們所建立的的是的一個實(shí)例。最后我們使用,表示這個組件是可動畫組件。一直不停動動畫序列的方法可以傳一個回調(diào)函數(shù),在動畫全部執(zhí)行完時觸發(fā)。 翻譯自 React-native Animated API Basic Example 翻譯過程中有刪改 簡介 本文是探索 react-native 中實(shí)現(xiàn)的的 Animated AP...
摘要:全文為這些年,我曾閱讀深入理解過或正在閱讀學(xué)習(xí)即將閱讀的一些優(yōu)秀經(jīng)典前端后端書籍。當(dāng)然,如果您喜歡這篇文章,可以動手點(diǎn)點(diǎn)贊或者收藏。 全文為這些年,我曾閱讀、深入理解過(或正在閱讀學(xué)習(xí)、即將閱讀)的一些優(yōu)秀經(jīng)典前端/Java后端書籍。全文為純原創(chuàng),且將持續(xù)更新,未經(jīng)許可,不得進(jìn)行轉(zhuǎn)載。當(dāng)然,如果您喜歡這篇文章,可以動手點(diǎn)點(diǎn)贊或者收藏。 基礎(chǔ) 基礎(chǔ)書籍 進(jìn)階 進(jìn)階階段,深入學(xué)習(xí)的書...
摘要:全文為這些年,我曾閱讀深入理解過或正在閱讀學(xué)習(xí)即將閱讀的一些優(yōu)秀經(jīng)典前端后端書籍。當(dāng)然,如果您喜歡這篇文章,可以動手點(diǎn)點(diǎn)贊或者收藏。 全文為這些年,我曾閱讀、深入理解過(或正在閱讀學(xué)習(xí)、即將閱讀)的一些優(yōu)秀經(jīng)典前端/Java后端書籍。全文為純原創(chuàng),且將持續(xù)更新,未經(jīng)許可,不得進(jìn)行轉(zhuǎn)載。當(dāng)然,如果您喜歡這篇文章,可以動手點(diǎn)點(diǎn)贊或者收藏。 基礎(chǔ) 基礎(chǔ)書籍 進(jìn)階 進(jìn)階階段,深入學(xué)習(xí)的書...
閱讀 1833·2021-11-18 13:21
閱讀 1966·2021-10-18 13:30
閱讀 1551·2021-10-12 10:13
閱讀 922·2021-10-09 09:43
閱讀 5436·2021-09-22 15:13
閱讀 3595·2021-08-11 10:22
閱讀 947·2019-08-30 13:46
閱讀 3527·2019-08-30 13:21