前言
本文是參考尚學堂SpringSecurity精講,僅作為學習記錄使用。
這個系列設計到的技術點如下:
- SpringSecurity
- Oauth2
- SpringSecurity + Oauth2
- SpringSecurity +JWT
- SpringSecurity + Oauth2
- SpringSecurity + Oauth2 + JWT
SpringSecurity
SpringSecurity簡介
Spring Security是一個高度自定義的安全架構。利用 Spring IoC/DI和AOP功能,為系統提供了聲明式安全通路控制功能,減少了為系統安全而編寫大量重複代碼的工作。使用 Spring Secruity 的原因有很多,但大部分都是發現了 javaEE的 Servlet 規範或 EJB 規範中的安全功能缺乏典型企業應用場景。同
時認識到他們在 WAR 或 EAR 級别無法移植。是以如果你更換伺服器環境,還有大量工作去重新配置你的應用程式。使用 Spring Security解決了這些問題,也為你提供許多其他有用的、可定制的安全功能。正如你可能知道的兩個應用程式的兩個主要區域是“認證”和“授權”(或者通路控制)。這兩點也是
Spring Security 重要核心功能。“認證”,是建立一個他聲明的主體的過程(一個“主體”一般是指使用者,裝置或一些可以在你的應用程式中執行動作的其他系統),通俗點說就是系統認為使用者是否能登入。“授權”指确定一個主體是否允許在你的應用程式執行一個動作的過程。通俗點講就是系統判斷使用者是否有權限去做某些事情。
安全架構概述
什麼是安全架構? 解決系統安全問題的架構。如果沒有安全架構,我們需要手動處理每個資源的通路
控制,非常麻煩。使用安全架構,我們可以通過配置的方式實作對資源的通路限制。
常用安全架構
- Spring Security:Spring家族一員。是一個能夠為基于Spring的企業應用系統提供聲明式的安全通路控制解決方案的安全架構。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC , DI(控制反轉Inversion of Control,DI:Dependency Injection 依賴注入)和AOP(面向切面程式設計) 功能,為應用系統提供聲明式的安全通路控制功能,減少了為企業系統安全控制編寫大量重複代碼的工作。
- Apache Shiro:一個功能強大且易于使用的Java安全架構,提供了認證,授權,加密,和會話管理。
快速入門
項目環境
- IDEA 2020.1.1
- JDK8
- MAVEN apache-maven-3.5.2
導入依賴
-POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.mjdai</groupId>
<artifactId>spring_security_first</artifactId>
<version>1.0-SNAPSHOT</version>
<name>spring_security_first</name>
<description>Demo project for Spring Security</description>
<!-- JDK 版本-->
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--spring security 元件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--web 元件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- test 元件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
測試代碼
- 啟動類 MjdaiSpringSecurityApplication
package com.mjdai.springsecurity;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
@SpringBootApplication
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)
public class MjdaiSpringSecurityApplication {
public static void main(String[] args) {
SpringApplication.run(MjdaiSpringSecurityApplication.class, args);
}
}
- Controller LoginController
package com.mjdai.springsecurity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LoginController {
/**
* 登入
*/
@RequestMapping("/login")
public String login(){
return "redirect:main.html";
}
}
- html代碼
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>Login</title>
<link rel="stylesheet" type="text/css" href="Login.css" target="_blank" rel="external nofollow" />
</head>
<body>
<div id="login">
<h1>Login</h1>
<form method="post">
<input type="text" required="required" placeholder="使用者名" name="u"></input>
<input type="password" required="required" placeholder="密碼" name="p"></input>
<button class="but" type="submit">登入</button>
</form>
</div>
</body>
</html>
- CSS代碼
html{
width: 100%;
height: 100%;
overflow: hidden;
font-style: sans-serif;
}
body{
width: 100%;
height: 100%;
font-family: 'Open Sans',sans-serif;
margin: 0;
background-color: #4A374A;
}
#login{
position: absolute;
top: 50%;
left:50%;
margin: -150px 0 0 -150px;
width: 300px;
height: 300px;
}
#login h1{
color: #fff;
text-shadow:0 0 10px;
letter-spacing: 1px;
text-align: center;
}
h1{
font-size: 2em;
margin: 0.67em 0;
}
input{
width: 278px;
height: 18px;
margin-bottom: 10px;
outline: none;
padding: 10px;
font-size: 13px;
color: #fff;
text-shadow:1px 1px 1px;
border-top: 1px solid #312E3D;
border-left: 1px solid #312E3D;
border-right: 1px solid #312E3D;
border-bottom: 1px solid #56536A;
border-radius: 4px;
background-color: #2D2D3F;
}
.but{
width: 300px;
min-height: 20px;
display: block;
background-color: #4a77d4;
border: 1px solid #3762bc;
color: #fff;
padding: 9px 14px;
font-size: 15px;
line-height: normal;
border-radius: 5px;
margin: 0;
}
界面顯示
-
啟動項目
-
- 進傳入連結接(http://localhost:8080/login)
- 輸入密碼之後