[JavaWeb]SpringSecurity-OAuth2.0 统一认证资源分离的配置,用于分布式架构模块化开发的认证体系
Posted 龙猫的番薯地
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaWeb]SpringSecurity-OAuth2.0 统一认证资源分离的配置,用于分布式架构模块化开发的认证体系相关的知识,希望对你有一定的参考价值。
前言
关于 OAuth2.0的认证体系,翻阅了好多资料,RCF 文档太多,看了一半就看不下去了,毕竟全英文的文档看起来,是有一点让我烦躁,但也对 OAuth2.0的认证流程有了一个基本的概念,之前用 SpringSecurity 做了一个基于 RBAC 的权限管理系统的基础配置,所以对 SpringSecurity 算是比较了解了,于是 OAuth2.0的实现,也想用 SpringSecurity 的来做,心想应该比较简单,然而...事实上,我反反复复,拿起又放弃,放弃又拿起,来来回回折腾了3个多月,才真正的掌握了这个 OAuth2.0插件(OAuth2.0不是一个独立的框架,只是 SpringSecurity 的一个插件而已)。
官网的 Demo 配置,是基于 JavaConfig 的配置方式,以前都用 XML 的,没接触过 JavaConfig,所以又绕了一圈,把 JavaConfig 方式的所有框架(Spring、SpringMVC、Mybatis、SpringSecurity、Web.xml)基本配置方式都走了一圈, 确实,全代码配置是很酷,很清爽,说实话,今后我也会逐渐往这方面走,因为这个方式比较有代码感,哈哈,但是现在还不行,因为有很多插件啊、特殊的配置方式啊,我都还不清楚要怎么配置,处于安全考虑,还是老老实实的用 XML 的比较好。
额外插播一则我团队的招聘广告:
阿里巴巴 - 淘系技术部招聘:https://www.cnblogs.com/wuxinzhe/p/11258226.html
项目的说明
网上有很多,SpringSecurityOAuth2.0的配置文章,但是每个文章,都是将认证服务器和资源服务器写在一起的,并没有将认证与资源分离,也没有讲不同的资源之间如何拆分,然而我们在设计分布式系统的时候,总会以模块化的方式,将不同的资源写成不同的项目,比如,将网站的一个电商系统,专门写成一个项目,把网站中的论坛系统,写成另一个项目,部署的时候,每个项目就可以单独部署,后端系统均以 RESTFull 的方式开放数据接口(RESTFull就是推荐使用 OAuth2.0的方式进行认证管理)。这样的方式来设计程序,最大的优点就是模块之间相互独立,互不干涉,在开发工作当中,可以并行开发,单独维护,同时模块分离出来,今后还可以进行很便利的集群,而不需要修改任何原来的代码,所以对整个项目的扩展性是非常好的,不同的项目之间,可以简单的使用 HttpClient 进行通讯,OAuth2.0五种授权模式当中,有一种授权模式就是为这种资源服务器之间的通讯而设计的。
认证服务器与资源服务器分离的这个配置方式,同时也实现了“统一认证”的模式,只需要在认真服务器上做了认证,拿到了 Token,就可以访问所有授权的资源服务器。
接下来,我们开始搭建认证服务器的配置。
POM
项目用到的框架有这几个:Spring、SpringSecurity、Mybatis
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 <groupId>Showings</groupId> 7 <artifactId>OAuthServer</artifactId> 8 <version>1.0-SNAPSHOT</version> 9 <build> 10 <finalName>showings</finalName> 11 <plugins> 12 <!--Mybatis 逆向工程插件--> 13 <plugin> 14 <groupId>org.mybatis.generator</groupId> 15 <artifactId>mybatis-generator-maven-plugin</artifactId> 16 <version>1.3.2</version> 17 <configuration> 18 <verbose>true</verbose> 19 <overwrite>true</overwrite> 20 </configuration> 21 </plugin> 22 <plugin> 23 <groupId>org.apache.maven.plugins</groupId> 24 <artifactId>maven-compiler-plugin</artifactId> 25 <configuration> 26 <source>1.7</source> 27 <target>1.7</target> 28 </configuration> 29 </plugin> 30 </plugins> 31 </build> 32 <properties> 33 <security.version>4.2.2.RELEASE</security.version> 34 <spring.version>4.3.7.RELEASE</spring.version> 35 <security.oauth.version>2.0.7.RELEASE</security.oauth.version> 36 </properties> 37 <dependencies> 38 <!-- SpringFramework Start --> 39 <dependency> 40 <groupId>org.springframework</groupId> 41 <artifactId>spring-core</artifactId> 42 <version>${spring.version}</version> 43 </dependency> 44 45 <dependency> 46 <groupId>org.springframework</groupId> 47 <artifactId>spring-web</artifactId> 48 <version>${spring.version}</version> 49 </dependency> 50 51 <dependency> 52 <groupId>org.springframework</groupId> 53 <artifactId>spring-oxm</artifactId> 54 <version>${spring.version}</version> 55 </dependency> 56 57 <dependency> 58 <groupId>org.springframework</groupId> 59 <artifactId>spring-tx</artifactId> 60 <version>${spring.version}</version> 61 </dependency> 62 63 <dependency> 64 <groupId>org.springframework</groupId> 65 <artifactId>spring-webmvc</artifactId> 66 <version>${spring.version}</version> 67 </dependency> 68 69 <dependency> 70 <groupId>org.springframework</groupId> 71 <artifactId>spring-aop</artifactId> 72 <version>${spring.version}</version> 73 </dependency> 74 75 <dependency> 76 <groupId>org.springframework</groupId> 77 <artifactId>spring-context-support</artifactId> 78 <version>${spring.version}</version> 79 <!--排除自带的日志工具,从而转向使用SLF4J日志--> 80 <exclusions> 81 <exclusion> 82 <groupId>commons-logging</groupId> 83 <artifactId>commons-logging</artifactId> 84 </exclusion> 85 </exclusions> 86 </dependency> 87 88 <dependency> 89 <groupId>org.springframework</groupId> 90 <artifactId>spring-expression</artifactId> 91 <version>${spring.version}</version> 92 </dependency> 93 <!-- SpringFramework End --> 94 <dependency> 95 <groupId>javax.validation</groupId> 96 <artifactId>validation-api</artifactId> 97 <version>2.0.0.Alpha2</version> 98 </dependency> 99 <!--数据有效性验证框架--> 100 <dependency> 101 <groupId>org.hibernate</groupId> 102 <artifactId>hibernate-validator</artifactId> 103 <version>6.0.0.Alpha2</version> 104 </dependency> 105 <!--c3p0--> 106 <dependency> 107 <groupId>com.mchange</groupId> 108 <artifactId>c3p0</artifactId> 109 <version>0.9.5.1</version> 110 </dependency> 111 <!--Mybatis--> 112 <dependency> 113 <groupId>org.mybatis</groupId> 114 <artifactId>mybatis</artifactId> 115 <version>3.3.0</version> 116 </dependency> 117 <!--Mybatis分页工具 pageHelper--> 118 <dependency> 119 <groupId>com.github.pagehelper</groupId> 120 <artifactId>pagehelper</artifactId> 121 <version>4.1.6</version> 122 </dependency> 123 <!--分页搭配SQL解析工具--> 124 <dependency> 125 <groupId>com.github.jsqlparser</groupId> 126 <artifactId>jsqlparser</artifactId> 127 <version>0.9.6</version> 128 </dependency> 129 <!--Mybatis Spring整合--> 130 <dependency> 131 <groupId>org.mybatis</groupId> 132 <artifactId>mybatis-spring</artifactId> 133 <version>1.2.3</version> 134 </dependency> 135 136 <!--mysql Driver--> 137 <dependency> 138 <groupId>mysql</groupId> 139 <artifactId>mysql-connector-java</artifactId> 140 <version>5.1.6</version> 141 </dependency> 142 <dependency> 143 <groupId>jstl</groupId> 144 <artifactId>jstl</artifactId> 145 <version>1.2</version> 146 </dependency> 147 <!-- https://mvnrepository.com/artifact/javax.el/javax.el-api --> 148 <dependency> 149 <groupId>javax.el</groupId> 150 <artifactId>javax.el-api</artifactId> 151 <version>3.0.1-b04</version> 152 </dependency> 153 154 <!--spring security--> 155 <dependency> 156 <groupId>org.springframework.security</groupId> 157 <artifactId>spring-security-core</artifactId> 158 <version>${security.version}</version> 159 </dependency> 160 <dependency> 161 <groupId>org.springframework.security</groupId> 162 <artifactId>spring-security-web</artifactId> 163 <version>${security.version}</version> 164 </dependency> 165 <dependency> 166 <groupId>org.springframework.security</groupId> 167 <artifactId>spring-security-taglibs</artifactId> 168 <version>${security.version}</version> 169 </dependency> 170 <dependency> 171 <groupId>org.springframework.security</groupId> 172 <artifactId>spring-security-config</artifactId> 173 <version>${security.version}</version> 174 </dependency> 175 176 <dependency> 177 <groupId>org.springframework.security.oauth</groupId> 178 <artifactId>spring-security-oauth2</artifactId> 179 <version>${security.oauth.version}</version> 180 </dependency> 181 182 <!--SLF4J日志 start--> 183 <dependency> 184 <groupId>org.slf4j</groupId> 185 <artifactId>slf4j-api</artifactId> 186 <version>1.7.10</version> 187 </dependency> 188 <dependency> 189 <groupId>ch.qos.logback</groupId> 190 <artifactId>logback-classic</artifactId> 191 <version>1.1.2</version> 192 </dependency> 193 <dependency> 194 <groupId>ch.qos.logback</groupId> 195 <artifactId>logback-core</artifactId> 196 <version>1.1.2</version> 197 </dependency> 198 <!--SLF4J日志 end--> 199 200 <dependency> 201 <groupId>javax.servlet</groupId> 202 <artifactId>javax.servlet-api</artifactId> 203 <version>3.1.0</version> 204 </dependency> 205 206 <!--Jackson start--> 207 <dependency> 208 <JavaWeb学习总结JavaWeb开发入门