1. 程式人生 > >《SpringBoot從入門到放棄》之第(六)篇——Spring Security進行安全控制

《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 頁面。輸入使用者名稱密碼:

 

點選“登出登陸”