摘要:一旦最基本的應用創建好了,你可以給他加上安全防護。一旦成功登出了,我們的應用程序重定向到到并顯示相應的登陸成功的消息。這標記該應用程序是一個應用程序,并激活一些關鍵行為,比如創建一個。一旦應用程序啟動,用瀏覽器訪問。
原網頁 https://spring.io/guides/gs/securing-web/
本指南將引導您完成創建一個資源由Spring Security的保護的一個簡單的Web應用程序的過程。
你將構建你將構建一個通過固定的用戶列表作為后端的登錄表單來保護頁面安全的Spring MVC應用程序
你將需要大約15分鐘
一個喜歡的文本編輯器或IDE
JDK 1.8 或更高版本
Gradle 2.3+ 或 Maven 3.0+
你同樣可以將本指南的代碼直接導入Spring Tool Suite (STS)并從這里開始你的工作
如何完成這個指南如同大多數的Spring入門指南,你可以從頭開始并完成每一個步驟,或者可以跳過這個你已經熟悉的基本配置過程。無論哪種方式,您最終會獲得可運行的代碼。
要從頭開始,請看“使用gradle構建”部分。
要跳過最基本的部分,按下面的步驟操作:
下載然后解壓本項目的代碼,或者使用Git克隆一個代碼倉庫:
git clone https://github.com/spring-guides/gs-securing-web.git
cd 到 gs-securing-web/initial 目錄
直接跳到“部署Spring Security”
使用gradle構建首先,你要創建一個基本的構建腳本。你可以使用任何你喜歡的構建系統來構建Spring應用程序,但是你所需要的Gralde和Maven構建代碼已經包含在這里了。如果你對兩者都不熟悉,可以參考“使用Gradle構建Java項目”或“使用Maven構建Java項目”。
創建目錄結構你需要在你選的一個用作項目目錄的文件夾中,創建下面的子目錄結構;例如你可以在*nix系統中使用mkdir -p src/main/java/hello這樣的命令來完成。
└── src └── main └── java └── hello創建Gradle的build文件
下面是initial目錄下的Gradle的build文件(譯注:實際這個initial指的是項目的根目錄,它包含了上面所創建的src目錄,以及gradle.build文件,這樣執行gradle build命令時,gradle才能正確地找到要構建的代碼)。
文件名: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構建
略,請參考原文
使用IDE構建略,請參考原文
創建一個不安全的Web應用在你可以嘗試將安全性應用于Web應用之前,你需要一個用于“保護”的Web應用程序。本節中的步驟指導您完成創建一個非常簡單的Web應用程序。然后你將在下一節使用Spring Security將其保護起來。
這個web應用程序包括兩個簡單的視圖,一個是“主頁”,一個是“Hello World”頁。“主頁”的視圖由下面這個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應用基于Spring MVC,因此你需要配置Spring MVC,然后設置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指向另一個視圖“login”,你將會在下個章節創建這個視圖。
此刻,你可以直接跳到“讓Web應用可執行”的部分,在不需要任何登陸工作的情況下運行Web應用。
一旦最基本的Web應用創建好了,你可以給他加上安全防護。
部署Spring Security假設現在你希望防止未授權的用戶在輸入“/hello”這個網址后看到歡迎頁的內容。當前狀態下,如果用戶點擊“home”頁上的鏈接,他們可以沒有任何阻礙地看到歡迎頁。現在你需要在用戶看到這個頁面前添加一個強制用戶登錄的阻礙。
你可以通過配置Spring Security來完成上面所說的事。如果Spring Security在classpath中,SpringBoot會自動使用“基本”HTTP認證來保護所有HTTP端點,你也可以進一步的定制安全設置。首先要做的事情就是把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
下面是確保只有認證過的用戶才能看到“秘密的”歡迎頁的安全配置:
文件名: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標注,來啟用Spring Security的web安全支持、以及提供與Spring MVC的融合。這個類還繼承了WebSecurityConfigurerAdapter并重寫了一些方法來指定一些特定的Web安全設置。
configure(HttpSecurity)方法規定了哪個URL應該被保護,哪個不應該。具體而言,“/”和“/home”的路徑被配置為不需要任何認證。所有其他URL必須進行身份驗證。
當用戶成功登錄后,他們將被重定向到先前請求的需要身份驗證的頁面。還有一個自定義(由loginPage()指定)的“/login”頁面,每個用戶都可以查看。
對于configureGlobal(AuthenticationManagerBuilder)方法,它設置了一個單一用戶在內存中的用戶數據庫。該用戶被賦予“user”的用戶名,“password”的密碼,以及“USER”作為角色。
現在,我們需要創建登錄頁面。目前已經為“login”視圖賦予了視圖控制器,所以你只需要創建login視圖本身:
文件名:src/main/resources/templates/login.html
Spring Security Example Invalid username and password.You have been logged out.
正如你所看到的,這個Thymeleaf模板只是給出了一個采集用戶名和密碼,并將它們作為請求post到“/login”的表單。正如剛剛配置的,Spring Security提供一個過濾器,截取該請求,并驗證用戶身份。如果用戶身份驗證失敗,頁面被重定向到“/login?error”,我們的頁面將顯示相應的錯誤信息。一旦成功登出了,我們的應用程序重定向到到“/login?logout”并顯示相應的登陸成功的消息。
最后,我們需要給用戶提供一種方式來顯示當前用戶名和“Sign Out”按鈕。更新hello.html來問好當前用戶,并包含一個“Sign Out”的按鈕,如下所示:
文件名:src/main/resources/templates/hello.html
Hello World! Hello [[${#httpServletRequest.remoteUser}]]!
我們通過使用Spring Security所集成的HttpServletRequest#getRemoteUser()來顯示用戶名。該“Sign Out”按鈕提交一個POST請求給“/logout”。一旦成功退出,將用戶重定向到“/login?logout”。
讓Web應用可執行雖然可以打包這項服務作為一個傳統的web應用程序歸檔或WAR文件部署到外部應用服務器,下面展示了更簡單的方法來創建一個獨立的應用程序。你將打包一切到一個單一的,可執行的JAR文件中,用一個良好舊式Javamain()方法來調用。在此過程中,你會用到Spring所支持的嵌入式Tomcat servlet容器作為HTTP運行實例,而不是部署一個外部實例。
文件名: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是個方便的注解,自動添加了所有以下內容:
@Configuration標記這個類作為bean以定義應用程序上下文的來源。
@EnableAutoConfiguration告訴SpringBoot開始添加基于classpath設置,其他Beans,以及各種屬性設置的Beans。
通常情況下你會給Spring MVC應用加上@EnableWebMvc注解,但當Spring Boot看到classpath中有spring-webmvc時,會自動添加這個注解。這標記該應用程序是一個Web應用程序,并激活一些關鍵行為,比如創建一個DispatcherServlet。
@ComponentScan告訴Spring去hello包中尋找其他組件,配置,服務。
該main()方法使用Spring Boot的SpringApplication.run()方法來啟動應用程序。你有沒有注意到,這里沒有一行XML,同樣也沒有web.xml文件。這個Web應用程序是100%純Java寫的,你不必處理配置任何管道或基礎設施(譯注:plumbing or infrastructure,我這里直譯了)。
構建一個可執行的JAR包如果你正在使用gradle,你可以使用./gradlew bootRun命令來運行應用程序。
你可以構建一個包含所有必要的依賴,類和資源的一個可執行的JAR文件。這樣使傳輸,版本管理和部署服務在整個開發生命周期在不同的環境,等等,變得更容易
./gradlew build
然后你可以這樣運行JAR包:
java -jar build/libs/gs-securing-web-0.1.0.jar
如果你正在使用Maven,你可以通過mvn spring-boot:run來運行應用,或者你也可以通過mvn clean package來構建JAR包,然后輸入下面的命令來運行:
java -jar target/gs-securing-web-0.1.0.jar
注意:上述過程將創建一個可運行的JAR。你也可以選擇構建一個經典的WAR包來代替。
一旦應用程序啟動,用瀏覽器訪問http://localhost:8080。你應該看到主頁:
當你點擊這個鏈接,它會嘗試把你帶到/hello所指向的歡迎頁,但因為這個頁面是受保護的,而且目前為止你沒有登錄,它會帶你到登陸頁
注意:如果你是直接從“不安全”的版本跳到這的,那么你將不會看到登陸頁,請放松地回到上面寫完其余的基于安全的代碼
在登錄頁面,分別輸入“user”和“password”作為用戶名和密碼,即可作為測試用戶登錄。一旦你提交登錄表單,你會被進行身份驗證,然后帶你到歡迎頁:
如果你點擊“Sign Out”按鈕,你的身份驗證被撤銷,你將會返回到登錄頁并顯示一個消息提示你已經登出。
小結恭喜你,你已經開發了一個簡單的、使用Spring Security來保護的Web應用。
想寫一個新的指南,或向已有的指南貢獻自己的能力?請看我們的貢獻指南
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64796.html
摘要:框架具有輕便,開源的優點,所以本譯見構建用戶管理微服務五使用令牌和來實現身份驗證往期譯見系列文章在賬號分享中持續連載,敬請查看在往期譯見系列的文章中,我們已經建立了業務邏輯數據訪問層和前端控制器但是忽略了對身份進行驗證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護REST API 重拾后端之Spring Boot(一):REST API的搭建...
摘要:簡而言之,它將對動畫中變化的屬性數值做插值運算并且刷新視圖。注意我們所建立的的是的一個實例。最后我們使用,表示這個組件是可動畫組件。一直不停動動畫序列的方法可以傳一個回調函數,在動畫全部執行完時觸發。 翻譯自 React-native Animated API Basic Example 翻譯過程中有刪改 簡介 本文是探索 react-native 中實現的的 Animated AP...
摘要:全文為這些年,我曾閱讀深入理解過或正在閱讀學習即將閱讀的一些優秀經典前端后端書籍。當然,如果您喜歡這篇文章,可以動手點點贊或者收藏。 全文為這些年,我曾閱讀、深入理解過(或正在閱讀學習、即將閱讀)的一些優秀經典前端/Java后端書籍。全文為純原創,且將持續更新,未經許可,不得進行轉載。當然,如果您喜歡這篇文章,可以動手點點贊或者收藏。 基礎 基礎書籍 進階 進階階段,深入學習的書...
摘要:全文為這些年,我曾閱讀深入理解過或正在閱讀學習即將閱讀的一些優秀經典前端后端書籍。當然,如果您喜歡這篇文章,可以動手點點贊或者收藏。 全文為這些年,我曾閱讀、深入理解過(或正在閱讀學習、即將閱讀)的一些優秀經典前端/Java后端書籍。全文為純原創,且將持續更新,未經許可,不得進行轉載。當然,如果您喜歡這篇文章,可以動手點點贊或者收藏。 基礎 基礎書籍 進階 進階階段,深入學習的書...
閱讀 1818·2021-11-18 13:21
閱讀 1953·2021-10-18 13:30
閱讀 1539·2021-10-12 10:13
閱讀 906·2021-10-09 09:43
閱讀 5413·2021-09-22 15:13
閱讀 3583·2021-08-11 10:22
閱讀 936·2019-08-30 13:46
閱讀 3520·2019-08-30 13:21