《SpringBoot從入門到放棄》之第(六)篇——Spring Security進行安全控制
一個好的系統,幾乎都離不開許可權控制。要實現訪問許可權控制的方式有多種多樣,可以通過AOP、攔截器實現,也可以使用Shiro框架。現在研究使用Spring Security。
O的K,先建立一個無需許可權的Web小例子。(本篇部落格接著之前寫的系列,已忽略環境配置,如pom.xml 的依賴等等)
在 src/main/resources/static目錄下建立 welcome.html 檔案:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>英雄聯盟</title> </head> <body> <h2>歡迎您來到英雄聯盟</h2> <h3><a th:href="@{/play}">點選開始遊戲</a></h3> </body> </html>
在 src/main/resources/static目錄下建立 game.html 檔案:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>歡迎來到英雄聯盟</title>
</head>
<body>
<h2>是時候表演真正的技術了!</h2>
</body>
</html>
建立 loginController 類:
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class LoginController { @RequestMapping("/") public String index() { return "welcome"; } @RequestMapping("/play") public String play() { return "game"; } }
啟動服務,瀏覽器訪問:http://localhost:9090/
點選“點選開始遊戲”:
O的K,一個沒有許可權控制的例子搞定。
現在,學習如何使用 Spring Security。
先在 pom.xml 中新增 jar 依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
Spring Security 配置
建立 MySpringSecurityConfig 類繼承WebSecurityConfigurerAdapter介面卡(如果對介面卡理解不深,可以參考):
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.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class MySpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.authorizeRequests()
.antMatchers("/", "/play").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("biandan").password("123").roles("Admin");
}
}
程式碼說明:
①通過@EnableWebSecurity註解開啟Spring Security的功能,繼承WebSecurityConfigurerAdapter介面卡,並重寫它的方法來設定一些安全的細節
②重寫configure(HttpSecurity http)方法:
通過authorizeRequests()定義哪些URL需要被保護、哪些不需要被保護。例如以上程式碼指定了/和/game不需要任何認證就可以訪問,其他的路徑都必須通過身份驗證。
通過formLogin()定義當需要使用者登入時候,轉到的登入頁面。
configureGlobal(AuthenticationManagerBuilder auth)方法,在記憶體中建立了一個使用者,該使用者的名稱為biandan,密碼為123,使用者角色為Admin。
O的K,我們還缺少一個登入的頁面,在 src/main/resources/static目錄下建立 login.html 檔案:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>使用者登陸頁面</title>
</head>
<body>
<div th:if="${param.logout}">
已退出遊戲
</div>
<form th:action="@{/play}" method="post">
<div><label>賬戶:<input type="text" name="username"/></label></div>
<div><label>密碼:<input type="password" name="password"/></label></div>
<div><input type="submit" value="擼起"/></div>
</form>
</body>
</html>
O的K,我們需要提供一個登出的入口,改造一下 game.html 檔案:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>歡迎來到英雄聯盟</title>
</head>
<body>
<h2>是時候表演真正的技術了!</h2>
<form th:action="@{/logout}" method="post">
<input type="submit" value="登出登陸"/>
</form>
</body>
</html>
改造一下 welcome.html 檔案
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>英雄聯盟</title>
</head>
<body>
<h2>歡迎您來到英雄聯盟</h2>
<h3><a th:href="@{/login}">點選開始遊戲</a></h3>
</body>
</html>
啟動服務,瀏覽器地址輸入:http://localhost:9090/
“點選開始遊戲”
系統判斷到請求 /login ,跳轉到 login 頁面。輸入使用者名稱密碼:
點選“登出登陸”