SpringCloud微服务间安全调用实现

2020-07-02 00:00:00 用户 请求 服务 信息 认证

如果对你有用,请记得点赞哦!!!!

SpringCloud服务间安全调用实现

目前项目中用到了微服务认证这块的技术,查看了相当一大部分的资料发现现在网上的资料都很不全,很零散。而且很多都运行不起来。

简单的介绍一下认证。
传统的项目都是使用session来管理用户的登录信息,返回前端sessionId保存在cookie中。但是在分布式情况下利用session去管理的场景就很少了,也不是不可以,如果你对session很热爱使用它的话,那就没必要继续往下看了。

在我们微服务restful风格下,应该怎么去保证安全信息呢。相信大家可能了解过token,也就是我们熟说的令牌,有人问我什么是token,Token 和 Session ID 不同,并非只是一个 key。Token 一般会包含用户的相关信息,通过验证 Token 就可以完成身份校验。

这里我们先简单介绍一下我们使用的token格式。

采用jwt(JSON WEB TOKEN)
JWT 是由三段信息构成的,段为头部(Header),第二段为载荷(Payload),第三段为签名(Signature)。每一段内容都是一个 JSON 对象,将每一段 JSON 对象采用 BASE64 编码,将编码后的内容用. 链接一起就构成了 JWT 字符串。

认证协议采用Oauth2.0
OAuth 是一种开放的协议,为桌面程序或者基于 BS 的 web 应用提供了一种简单的,标准的方式去访问需要用户授权的 API 服务。OAUTH 认证授权具有以下特点:

简单:不管是 OAuth 服务提供者还是应用开发者,都很容易于理解与使用;

安全:没有涉及到用户密钥等信息,更安全更灵活;

开放:任何服务提供商都可以实现 OAuth,任何软件开发商都可以使用 OAuth;

关于jwt和Oauth我们就不做过多的介绍了。大家直接去百度一大堆,这种内容写出来就没有技术含量了。

思考一个问题:就是在分布式情况下,我们怎么去生成这个token?在哪里生成是好的呢?

现在我们举例说明,有三个服务,会员,订单,支付,这个三个服务,他们都需要用户验证,我们不可能在每个系统中去写一个认证过程,所以,我们的认证是一个单独的服务。

认证流程:用户提供用户信息,到认证中心验证,成功就返回一个token,访问其他服务的时候在请求头携带上token信息,服务只需要去解析token的值就可以了,这样做既满足了微服务轻量级的需求,也避免了了浏览器禁用cookie的情况,岂不美哉。

我们要知道一个事情,对于我们的认证服务器来说,只有两种服务,那就是认证服务器和资源服务器,所有我们这里的会员,订单,支付服务,对于认证服务器来说都是资源服务器。



搭建认证服务

我们采用SpringSecurity Oauth2.0 JWT Redis搭建服务

采用SpringSecurity的密码模式,其他模式请自行百度参考,这里提供当前认证的需求的做法。

pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</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.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-jwt</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.40</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.RC1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.cdhenren.AuthApplication</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

相关文章