天天看點

SpringSecurity+JWT項目實戰之Java權限管理實戰(一)

前言

本文是參考尚學堂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;
}
           

界面顯示

  • 啟動項目

    -

    SpringSecurity+JWT項目實戰之Java權限管理實戰(一)
  • 進傳入連結接(http://localhost:8080/login)
    SpringSecurity+JWT項目實戰之Java權限管理實戰(一)
  • 輸入密碼之後
    SpringSecurity+JWT項目實戰之Java權限管理實戰(一)

項目結構

SpringSecurity+JWT項目實戰之Java權限管理實戰(一)