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共五个模块:
首先创建jzzx-security项目,Packaging的选项是pom,因为此模块是统一管理构建模块,其他为实际业务处理模块,此选项是Jar。建完项目以后,将其他四个模块加入到管理模块中,如下图:
下面就没个模块的代码和其中的坑进行讲解,首先是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代码和权限配置类:
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上下载,点击链接。