sping cloud+boot+security 集成教程之框架搭建

spring cloud和spring boot是目前企业级的成熟解决方案,度娘查看二者与spring security的集成方案,写的都不够细,因此计划写一系列的文章,来丰富网络上的此类解决方案。

我们使用Maven来管理各个模块,我们主要分为core、app、browser、demo四个模块和一个管理模块,分别为jzzx-security、jzzx-security-core、jzzx-security-app、jzzx-security-browser、jzzx-security-demo共五个模块:

sping cloud+boot+security 集成教程之框架搭建sping cloud+boot+security 集成教程之框架搭建

首先创建jzzx-security项目,Packaging的选项是pom,因为此模块是统一管理构建模块,其他为实际业务处理模块,此选项是Jar。建完项目以后,将其他四个模块加入到管理模块中,如下图:

sping cloud+boot+security 集成教程之框架搭建

下面就没个模块的代码和其中的坑进行讲解,首先是jzzx-security的pom配置:

<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>
  <groupId>com.jzzx.security</groupId>
  <artifactId>jzzx-security</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  
  <properties>
  	<jzzx-project-version>0.0.1-SNAPSHOT</jzzx-project-version>
  	<java-version>1.8</java-version>
  </properties>
  
  <!-- 使maven可以自动的查找各个框架相互依赖包的版本,无需开发人员来指定或查找,避免出错 -->
  <dependencyManagement>
  	<dependencies>
  		<dependency>
  			<groupId>io.spring.platform</groupId>
  			<artifactId>platform-bom</artifactId>
  			<version>Cairo-SR6</version>
  			<type>pom</type>
  			<scope>import</scope>
  		</dependency>
  		<dependency>
  			<groupId>org.springframework.cloud</groupId>
  			<artifactId>spring-cloud-dependencies</artifactId>
  			<version>Finchley.RELEASE</version>
  			<type>pom</type>
  			<scope>import</scope>
  		</dependency>
  	</dependencies>
  </dependencyManagement>
 	
  <!-- 构造maven编译时间的环境 -->
  <build>
  	<plugins>
  		<plugin>
  			<groupId>org.apache.maven.plugins</groupId>
		    <artifactId>maven-compiler-plugin</artifactId>
		    <version>3.7.0</version>
  			<configuration>
  				<source>${java-version}</source>
  				<target>${java-version}</target>
  				<encoding>UTF-8</encoding>
  			</configuration>
  		</plugin>
  	</plugins>
  </build>
  
  <modules>
  	<module>../jzzx-security-app</module>
  	<module>../jzzx-security-browser</module>
  	<module>../jzzx-security-core</module>
  	<module>../jzzx-security-demo</module>
  </modules>
</project>

其中有dependencyManagement页签是项目间的公共依赖版本号的控制和scope的控制。此处使用了platform-bom和spring-cloud-dependencies,注意此处二者的版本号就有坑,platform-bom会引入root,spring-cloud-dependencies会引入cloud,如果二者版本号不一致,会有一下错误:

java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava/lang/Object;)V

二者版本号的对应关系,也给各位整理了一下,下表所示:

Spring Cloud版本 Spring Root版本
2.0.x Finchley
1.5.x Edgware
1.5.x Dalston
1.4.x, 1.5.x Camden
EOL Brixton
EOL Angel

此处项目使用的是spring boot 2.0.7和spring cloud 2.0.0.RELEASE,pom中的Version页签就是Cairo-SR6和Finchley.RELEASE。

接下来看一下spring core的代码,也是在做权限控制的核心项目,因此主要核心的配置和依赖都在这里,下满是spring-security-core项目的pom配置:

<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>
  <artifactId>jzzx-security-core</artifactId>
  <parent>
  	<groupId>com.jzzx.security</groupId>
  	<artifactId>jzzx-security</artifactId>
  	<version>0.0.1-SNAPSHOT</version>
  	<relativePath>../jzzx-security</relativePath>
  </parent>
  
  <dependencies>
  	<dependency>
  		<groupId>org.springframework.cloud</groupId>
  		<artifactId>spring-cloud-starter-oauth2</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework.boot</groupId>
  		<artifactId>spring-boot-starter-data-redis</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework.boot</groupId>
  		<artifactId>spring-boot-starter-jdbc</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>mysql</groupId>
  		<artifactId>mysql-connector-java</artifactId>
  	</dependency>
  	<!-- 第三方登陆依赖 -->
  	<dependency>
  		<groupId>org.springframework.social</groupId>
  		<artifactId>spring-social-config</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework.social</groupId>
  		<artifactId>spring-social-core</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework.social</groupId>
  		<artifactId>spring-social-security</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework.social</groupId>
  		<artifactId>spring-social-web</artifactId>
  	</dependency>
  	<!-- java开发常用的工具类库 -->
  	<dependency>
  		<groupId>commons-lang</groupId>
  		<artifactId>commons-lang</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>commons-collections</groupId>
  		<artifactId>commons-collections</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>commons-beanutils</groupId>
  		<artifactId>commons-beanutils</artifactId>
  	</dependency>
  </dependencies>
</project>

分为授权认证、第三方登陆验证、工具类库三部分,也是在后续开发过程中使用到的。另外spring-security-browser项目是浏览器端的,需要增加session管理的依赖,pom中增加:

    <dependency>
	    <groupId>org.springframework.session</groupId>
	    <artifactId>spring-session</artifactId>
	    <version>1.3.1.RELEASE</version>
	</dependency>

最后就是spring-security-demo项目的spring boot代码和权限配置类:

sping cloud+boot+security 集成教程之框架搭建

config是security的配置文件,此处因为用的是spring cloud2,所以不能用1的Application.properties文件中进行进行security相关的配置了,配置代码官方已经表示为时效,并给了提示是用WebSecurityConfigure来实现自定义的配置,此处是继承WebSecurityConfigureAdapter,使用@EnableWebSecurity注解来实现的。

spring boot的配置文件是放在Application.properties文件中的:

server.servlet.context-path=/jzzx

##数据库链接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/spring-security?useUnicode=yes&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root

#
spring.session.store-type=none
#关闭server验证
#security.basic.enabled=false 这种配置在spring cloud1时,是支持的,spring cloud2官方已经不支持了,被WebSecurityConfig bean代替

运行spring boot入口类后,就可以浏览器访问了,http://localhost:8080/jzzx/index,除了/和/index后,都需要走spring security验证。

SSS的整个项目的代码,可以从github上下载,点击链接