1. 程式人生 > >SpringCloud學習之路(二)-SpringSecurity安全訪問

SpringCloud學習之路(二)-SpringSecurity安全訪問

1.在服務端增加SpringSecurity安全訪問:修改microcloud-provider-dept-8001裡的pom.xml追加Springsecurity依賴包,並在application.yml裡追加security相關配置

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.jmx</groupId>
    <artifactId>microcloud</artifactId>
    <version>0.0.1</version>
  </parent>
  <groupId>com.jmx</groupId>
  <artifactId>microcloud-provider-dept-8001</artifactId>
  <version>0.0.1</version>
  <name>microcloud-provider-dept-8001</name>
  <url>http://maven.apache.org</url>
  
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<dependencies>
		<!-- Springsecurity給服務端提供安全訪問 -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>com.jmx</groupId>
			<artifactId>microcloud-api</artifactId>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<dependency> 
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jetty</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
	</dependencies>
</project>

application.yml

server:
  port: 8001
  
security:
  basic:
    enabled: true    #啟用SpringSecurity的安全配置項
  user:
    name: jmxjava    #認證使用者名稱
    password: jmxhello #認證密碼
    role:              #授權角色
    - USER
mybatis:
  config-location: classpath:mybatis/mybatis.cfg.xml    # mybatis配置檔案所在路徑
  type-aliases-package: com.jmx.vo                      # 定義所有操作類的別名所在包
  mapper-locations:                                     # 所有的mapper對映檔案
  - classpath:mybatis/mapper/**/*.xml
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource    # 配置當前要使用的資料來源的操作型別
    driver-class-name: org.gjt.mm.mysql.Driver      # 配置MySQL的驅動程式類
    url: jdbc:mysql://localhost:3307/jmx8001?useUnicode=true&characterEncoding=utf-8       # 資料庫連線地址
    username: root                                  # 資料庫使用者名稱
    password: 123456                                # 資料庫連線密碼
    dbcp2:                                          # 進行資料庫連線池的配置
      min-idle: 5                                   # 資料庫連線池的最小維持連線數    
      initial-size: 5                               # 初始化提供的連線數
      max-total: 5                                  # 最大的連線數
      max-wait-millis: 200                          # 等待連接獲取的最大超時時間

這樣我們的服務端SpringSecurity配置好了

瀏覽器輸入http://dept-8001.com:8001/dept/list/,輸入剛剛配置的認證賬號密碼才能查詢


2.在消費者microcloud-consumer-80端裡新增認證賬號,首先在RestConfig.java配置裡新增一個Bean修改http頭資訊進行認證

RestConfig.java

package com.jmx.microcloud.config;


import java.nio.charset.Charset;
import java.util.Base64;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestConfig {
	@Bean
	public RestTemplate getRestTemplate() {
		return new RestTemplate() ;
	}
	
	//定義一個Bean修改頭資訊進行客戶端認證
	@Bean
	public HttpHeaders getHeader() {
	    HttpHeaders headers=new HttpHeaders();
	    String auth="jmxjava:jmxhello";//認證的原始資訊
	    byte[] encodeAuth=Base64.getEncoder().encode(auth.getBytes(Charset.forName("US-ASCII")));//將原始認證資訊進行Base64加密
	    String authHeader="Basic "+new String(encodeAuth);//加密後的認證資訊要與Basic有個空格
	    headers.set("Authorization", authHeader);
	    return headers;
	}
}

修改控制層的程式碼ConsumerDeptController.java

package com.jmx.microcloud.controller;
import java.util.List;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.jmx.vo.Dept;



@RestController
public class ConsumerDeptController {
	public static final String DEPT_GET_URL = "http://dept-8001.com:8001/dept/get/";
	public static final String DEPT_LIST_URL = "http://dept-8001.com:8001/dept/list/";
	public static final String DEPT_ADD_URL = "http://dept-8001.com:8001/dept/add";
	@Autowired
	private RestTemplate restTemplate;
	
	@Autowired
	private HttpHeaders headers;
	
	
	@RequestMapping(value = "/consumer/dept/get")
	public Dept getDept(long id) {
		Dept dept = restTemplate.exchange(DEPT_GET_URL+id, HttpMethod.GET,new HttpEntity<Object>(headers),Dept.class).getBody();
		return dept;
	}
	
	
	
	@SuppressWarnings("unchecked")
	@RequestMapping(value = "/consumer/dept/list")
	public List<Dept> listDept() {
		List<Dept> allDepts = restTemplate.exchange(DEPT_LIST_URL,HttpMethod.GET,new HttpEntity<Object>(headers),List.class).getBody();
		return allDepts;
	}
	@RequestMapping(value = "/consumer/dept/add")
	public boolean addDept(Dept dept) {
		Boolean flag = restTemplate.exchange(DEPT_ADD_URL,HttpMethod.POST,new HttpEntity<Object>(dept,headers),Boolean.class).getBody();
		return flag;
	}
}

到這裡客戶端的認證就做好了,我們把消費端與服務端執行起來,瀏覽器輸入http://client.com/consumer/dept/list


OK,完美通過.

3.Session的無狀態配置

由於我們的Rest服務基於Http協議,所有的WEB容器都會提供一個Session的機制,一個使用者不斷連線,如果該使用者狀態應該會被伺服器儲存,微服務有可能同時併發訪問量達到幾十萬,那麼伺服器壓力會很大.

我們來測試一下預設配置狀態下的Session變不變,在microcloud-provider-dept-8001中的DeptRest.java裡新增一個簡單的方法獲取session的Id

    @RequestMapping("/dept/sessionid")
    public String id(HttpServletRequest request) {
		return request.getSession().getId();
    }

開啟瀏覽器輸入http://dept-8001.com:8001/dept/sessionid



每重新整理一次sessionid都是不相同的,說明我們的SpringSecurity預設配置下是不儲存使用者狀態的,如果我們有需求可以修改application.yml的security.session值來設定儲存

server:
  port: 8001
  
security:
  sessions: always   #always設定儲存使用者狀態(記憶體可能會被佔滿)  stateless設定不儲存使用者狀態
  basic:
    enabled: true    #啟用SpringSecurity的安全配置項
  user:
    name: jmxjava    #認證使用者名稱
    password: jmxhello #認證密碼
    role:              #授權角色
    - USER
mybatis:
  config-location: classpath:mybatis/mybatis.cfg.xml    # mybatis配置檔案所在路徑
  type-aliases-package: com.jmx.vo                      # 定義所有操作類的別名所在包
  mapper-locations:                                     # 所有的mapper對映檔案
  - classpath:mybatis/mapper/**/*.xml
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource    # 配置當前要使用的資料來源的操作型別
    driver-class-name: org.gjt.mm.mysql.Driver      # 配置MySQL的驅動程式類
    url: jdbc:mysql://localhost:3307/jmx8001?useUnicode=true&characterEncoding=utf-8       # 資料庫連線地址
    username: root                                  # 資料庫使用者名稱
    password: 123456                                # 資料庫連線密碼
    dbcp2:                                          # 進行資料庫連線池的配置
      min-idle: 5                                   # 資料庫連線池的最小維持連線數    
      initial-size: 5                               # 初始化提供的連線數
      max-total: 5                                  # 最大的連線數
      max-wait-millis: 200                          # 等待連接獲取的最大超時時間

我們開啟瀏覽器在測試sessionId會不會變化


不管怎麼重新整理都不會變化,這個東西根據需求來變化.

4.為了保證安全性所有的程式我們都要進行SpringSecurity安全訪問認證,上面我們所有微服務的認證處理都是在application.yml裡面配置完成,但是如果我們有多個微服務每個微服務都處理是不合適的,所以我們新增一個microcloud-security模組進行配置所有security的安全配置.


修改pom.xml

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.jmx</groupId>
    <artifactId>microcloud</artifactId>
    <version>0.0.1</version>
  </parent>
  <groupId>com.jmx</groupId>
  <artifactId>microcloud-security</artifactId>
  <version>0.0.1</version>
  <name>microcloud-security</name>
  <url>http://maven.apache.org</url>
<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
	</dependencies>
</project>

WebSecurityConfig.java

/**
 * 因為我們的這個模組是提供給microcloud-provider-dept-8001的,
 * 而這個的啟動類是在com.jmx.microcloud包裡,所以我們的配置類
 * 也應該在這個包下才能被掃描的到
 */
package com.jmx.microcloud.config;

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;
import org.springframework.security.config.http.SessionCreationPolicy;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            //表示所有的訪問都必須進行認證請求處理後才能正常進行
            http.httpBasic().and().authorizeRequests().anyRequest().fullyAuthenticated();
            //設定session為無狀態,提升操作效率
            http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        }
        
        @Autowired
        public void configGlobal(AuthenticationManagerBuilder auth) throws Exception{
            auth.inMemoryAuthentication().withUser("jmxjava").password("jmxhello").roles("USER").and().withUser("admin").password("admin").roles("adminstrator");   
        }
}

修改microcloud-provider-dept-8001的pom.xml新增microcloud-security模組

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.jmx</groupId>
    <artifactId>microcloud</artifactId>
    <version>0.0.1</version>
  </parent>
  <groupId>com.jmx</groupId>
  <artifactId>microcloud-provider-dept-8001</artifactId>
  <version>0.0.1</version>
  <name>microcloud-provider-dept-8001</name>
  <url>http://maven.apache.org</url>
  
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<dependencies>
		<!-- 新增認證配置模組 -->
		<dependency>
		  <groupId>com.jmx</groupId>
		  <artifactId>microcloud-security</artifactId>
		  <version>0.0.1</version>
		</dependency>
		<!-- Springsecurity給服務端提供安全訪問 -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>com.jmx</groupId>
			<artifactId>microcloud-api</artifactId>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<dependency> 
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jetty</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
	</dependencies>
</project>

把microcloud-provider-dept-8001裡的SpringSecurity相關配置去掉,執行

瀏覽器輸入http://dept-8001.com:8001/dept/list

先使用jmxjava這個賬戶


完美通過,使用admin這個賬戶


一樣測試通過

有關SpringSecurity安全訪問暫記到此

相關推薦

SpringCloud學習()-SpringSecurity安全訪問

1.在服務端增加SpringSecurity安全訪問:修改microcloud-provider-dept-8001裡的pom.xml追加Springsecurity依賴包,並在application.yml裡追加security相關配置pom.xml<?xml ver

新手算法學習----叉樹(叉樹的路徑和)

== style oid 添加 roo span 一個 int 二叉 題目: 給定一個二叉樹,找出所有路徑中各節點相加總和等於給定 目標值 的路徑。 一個有效的路徑,指的是從根節點到葉節點的路徑。 代碼加思路: public List<List<Intege

【python3的學習】數據類型和變量

添加 變量 之路 get 學習 如果 地板 www ins 整數 python可以處理任意大小的整數(包括負整數),如100,0,-8080等。 浮點數 浮點數也就是小數,如1.23,-9.01等。但對於很大或很小的浮點數,就必須用科學計數法表示,把10用e代

框架學習

ger set 圖片 bsp lar comm 使用 string int 上一章我們使用了xml解析技術和java反射技術實現了一個簡單的功能,這一章我們更進一步,模仿mybatis,實現一個sql映射功能 1,安裝mysql 2,新建數據庫myemployees,並

小程式學習:開發工具部分功能和專案結構介紹

上一篇講到了新建專案進來,本篇主要講解開發工具部分功能和專案結構介紹,按照我的風格來,先上目錄 開發工具的部分功能簡介 小程式專案目錄簡介 以下幾個功能是我覺得比較方便喜歡的 自動儲存(設定----編輯設定-----選中修改檔案時自動儲存) console(控

Python學習

2018.9.12筆記 1.什麼是作業系統? 作業系統的本質是一個軟體,用來協調,管理,控制計算機硬體資源與軟體資源的一個程式 作業系統將複雜的硬體操作應用封裝成簡單的功能給使用者/應用程式使用。 作業系統使得應用程式對硬體的競爭變得

從 Python到Tensorflow 學習()

最近畢業設計題目是研究對抗樣本,要用tensorflow來搭建神經網路,因此python必不可少,這個不是一個傳統的Python學習教程只是把學習Python過程中遇到的問題和經驗記錄下來(基於Python3.5),如果想要一步一步學習Python建議看下面的網站。 Python

opengl學習,你好,三角形

譯註 在學習此節之前,建議將這三個單詞先記下來: •頂點陣列物件:Vertex Array Object,VAO •頂點緩衝物件:Vertex Buffer Object,VBO •索引緩衝物件:Element Buffer Object,EBO或Index

springcloud學習總覽

從零開始的spring cloud學習,學習的過程中有些收穫,爬過些坑。所以分享出來,一是鞏固自己的學習,溫故而知新。在分享的過程中,如果能夠幫助到其他的初學者也是一件值得開心的事。 這是一個系列的部落格,主要講述微服務spring cloud的基礎搭建內容,

Python學習()----Python的執行方式

前面我們已經在window環境下安裝好了我們的Python(地址:https://blog.csdn.net/qq_34584694/article/details/81566288),現在我們來學習Python的幾種執行方式。其主要分為REPL(read,eval,print,loop)和Py

Hibernate的學習(一對多的級聯刪除)

前言    這篇主要說明了級聯刪除,比較繁瑣需要舉例子說明 程式碼 技術分析之級聯刪除 1. 先來給大家在資料庫中演示含有外來鍵的刪除客戶功能,那麼SQL語句是會報出錯誤的 * 例如:delete from customers where cid = 1;

java痛苦學習[] ---JSONObject使用

一、Strut2必須引入的包          要使程式可以執行必須引入JSON-lib包,JSON-lib包同時依賴於以下的JAR包:       1.commons-lang.jar       2.commons-beanutils.jar       3.c

用gradle手動編譯出android的簡單的apk檔案(gradle學習)

     轉載請附上原文地址:  http://blog.csdn.net/strangenightmare/article/details/52233395           隨著gradle和

vue學習 初步接觸vue-router

怎麽辦 size 地方 font href nts 小程序 後綴 route 今天把vue-router繼續下去; 還是跟這個外國網友的學習教程走的。想想也是挺那啥的;國內的東西沒有找到相對比較滿意是教程反倒是朋友介紹的國外的教程好一點……不多扯上地址:ht

TCP/IP網路程式設計學習

基於Windows下的網路程式設計: 網路程式設計基本上都有伺服器端和客戶端,這兩個端所實現的方法是不一樣的。 伺服器端的一般框架 用socket()函式建立一個套接字,並建立資源所使用的資源 SOCKET socket(int af,int type,int proto

UNIX環境高階程式設計學習()----檔案和目錄

對於UNIX環境程式設計,工作中經常會用到相關知識,作為學習UNIX環境程式設計的經典書籍--UNIX環境高階程式設計,是每個UNIX程式設計人員必看的經典書籍之一,為了將相關知識重新進行學習,以系統的整合所學知識,遂以博文形式作為總結。 一、概述 本章將描述檔案系統

Kotlin 全面學習 () -- 控制流(If、When、For、While)

1、If/else 語句 在 Kotlin 中 If/else 可以和在 Java 一樣使用,與之不一樣的是在 Kotlin 中它可以作為 帶有返回值的表示式,如同 Java 中的三目運算子: val max = if(a > b) a else

Kaggle學習() —— Digit Recognizer問題分析

Digit Recognizer是數字手寫體識別。 Kirill Kliavin基於TensorFlow 框架與深度學習演算法,給出了準確率高達0.99的解決方法,值得我們學習。 閱讀本篇的先決條件:需要有一定python基礎,一些線性代數的理論基礎,

Qt學習——一個簡單的計算圓的面積程式

一、使用ui編輯器來佈局計算面積的一些控制元件我們新建一個專案,專案名稱為CalArea。並且勾選建立圖形介面,基類選擇QWidget然後我們將我們需要的一些控制元件拖到中間的區域,這個區域就是將要設計的頂層視窗部件。我們這個計算面積的小程式需要兩個QLabel 類的控制元件

PHp學習(陣列練習)

有關陣列的練習,,php不同於java和c++他是弱型別的語言,php陣列卻很強大····它既有java中陣列的特性 又有集合的用途。<?php //遍歷陣列, 方法一:列印變數 $a=array("Hello", "World!", ); var_d