文档章节

基于易水公共组件的单点登录

易水风萧
 易水风萧
发布于 2019/10/30 17:02
字数 1157
阅读 17
收藏 0

如今,随着互联网技术的发展,网络用户规模越来越大,假如公司的每一个应用都建立一个用户系统,不仅极大的增加了开发的工作量,而且容易形成了信息孤岛,用户在使用公司的每个产品时都需要重复注册一次。因此许多公司为了统一管理,建立了统一认证中心,其他的应用需要通过单点登录即可获取用户信息,用户登录该公司的其他应用时也不需要在重新注册,大大节省公司用户导入成本,也提高用户使用体验。

对于单点登录(SSO)而言,现在技术比较成熟,网上各种教程也比较多,但是很多文章都讲述的不怎么全面,在这里本文基于spring security简单明了的介绍下时如何实现单点登录功能。

在使用单点登录之前,需要先搭建一个认证中心,例如通过易水公共组件快速搭建一个自己的认证中心,也可以使用现在网络上现成的认证中心,如 谷歌github.

一 在pom文件中加入依赖

完整的pom文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yishuifengxiao.sso-client</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
      

<!--        <dependency>-->
<!--            <groupId>org.springframework.security.oauth.boot</groupId>-->
<!--            <artifactId>spring-security-oauth2-autoconfigure</artifactId>-->
<!--            <version>2.2.0.RELEASE</version>-->
<!--        </dependency>-->

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

二 加入配置信息

在配置文件中加入以下信息

spring.security.oauth2.client.registration.yishui.provider=yishui
# 登录界面上显示的登录类型的名字,可不填
spring.security.oauth2.client.registration.yishui.client-name=custom
# 该用户对应的clientId
spring.security.oauth2.client.registration.yishui.client-id=zhiyubujian
# 该用户对应的clientSecret
spring.security.oauth2.client.registration.yishui.client-secret=zhiyubujian
# 这里是定值为authorization_code,表示使用授权码模式模式从授权服务器中获取token
spring.security.oauth2.client.registration.yishui.authorization-grant-type=authorization_code
# 回调地址,应该和授权服务器中登记的回调地址一模一样,否则会出错,支持通配符,也可以想下面那样配置为完整的地址
spring.security.oauth2.client.registration.yishui.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
#spring.security.oauth2.client.registration.yishui.redirect-uri=http://192.168.0.172:8006/oauth2/code

# 授权服务器的authorization地址
spring.security.oauth2.client.provider.yishui.authorization-uri=http://192.168.0.172:8000/oauth/authorize
# 授权服务器获取token的地址
spring.security.oauth2.client.provider.yishui.token-uri=http://192.168.0.172:8000/oauth/token
# 授权服务器中获取登录用户信息的地址
spring.security.oauth2.client.provider.yishui.user-info-uri=http://192.168.0.172:8000/me
#定值,必须配置,否则会出错
spring.security.oauth2.client.provider.yishui.user-name-attribute=userAuthentication

注意:

上述配置中的yishui可以为任意值,但是一般最好为有标识意义的值,例如使用google账号登录时,可以进行如下配置:

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: google-client-id
            client-secret: google-client-secret

三 配置启动文件

@SpringBootApplication
@RestController
//@EnableOAuth2Sso
public class DemoApplication {

    @GetMapping("/me")
    public Authentication user(Authentication authentication) {

        return authentication;
    }


    @GetMapping("/")
    public String index(Model model,
                        @RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient,
                        @AuthenticationPrincipal OAuth2User oauth2User) {
        model.addAttribute("userName", oauth2User.getName());
        model.addAttribute("clientName", authorizedClient.getClientRegistration().getClientName());
        model.addAttribute("userAttributes", oauth2User.getAttributes());

        return "index";
    }

    public static void main(String[] args) {

        SpringApplication.run(DemoApplication.class, args);

    }

}

四 使用单点登录

完成上述配置以后,我们就可以使用单点登录功能了。

例如当我们想要访问 http://localhost:8080/me 时,系统会重定向到到默认的登录页面 登录页面

注意:这里显示的是默认的登录页面,如果用户想要显示自定义登录界面,可以参见 易水公共组件里面的相关章节进行修改和美化。

点击上面的登录链接,会跳转到授权服务器的登录页面

易水认证中心

在此页面输入用户名和密码登录成功后,请求会跳转到原始等请求地址

响应结果如下:

响应结果

<br/><br/>

资源链接

易水公共组件官方文档地址:http://doc.yishuifengxiao.com/

易水公共组件源码地址:https://gitee.com/zhiyubujian/common-starter

易水风萧个人博客 http://www.yishuifengxiao.com

相关博客

  1. springboot整合单点登录sso

  2. 搭建基于易水公共组件的资源服务器

© 著作权归作者所有

易水风萧

易水风萧

粉丝 9
博文 9
码字总数 9938
作品 2
深圳
私信 提问
易水公共组件 4.2.0 版本发布,新增重要功能

易水公共组件是基于spring security 和 spring security oauth2 上的二次开发,除了对 spring security 和 oauth2 高度可定制化的功能封装外,还集成了在日常开发过程需要经常使用的 swagge...

易水风萧
2019/12/03
1.7K
0
易水公共组件 4.1.3 版本发布,新增 IDEA 配置提示功能

易水公共组件是基于spring security 和 spring security oauth2 上的二次开发,除了对 spring security 和 oauth2 高度可定制化的功能封装外,还集成了在日常开发过程需要经常使用的 swagge...

易水风萧
2019/11/11
870
2
易水公共组件 4.1.2 版本发布了

易水公共组件是基于 spring security 和 spring security oauth2 上的二次开发,除了对 spring security 和 oauth2 高度可定制化的功能封装外,还集成了在日常开发过程需要经常使用的 swagge...

易水风萧
2019/10/31
2.2K
2
开发常用功能集 - 易水公众组件

在日常开发过程中,发现有一个重要的功能会被经常使用到,但是又没有一个比较好用的功能集合,在开发项目是需要反复配置,造成了大量不必要的重复性简单劳动,因此对日常使用到功能进行了一个...

易水风萧
2019/10/23
1.5K
1
单点登录系统--ki4so

ki4so是一个简约、无状态、易扩展、易伸缩的适合于大型互联网web应用场景的单点登录系统,它功能简单,只实现了统一登录和登出,它最大的特色是将用户状态写入到cookie中,最大程度减少了单点...

杨武兵
2013/09/25
1.9W
5

没有更多内容

加载失败,请刷新页面

加载更多

检查字符串是否不为空且不为空

如何检查字符串是否不为null也不为空? public void doStuff(String str){ if (str != null && str != "**here I want to check the 'str' is empty or not**") { /* handl......

javail
24分钟前
43
0
No module named 'apscheduler.schedulers'

关于 ModuleNotFoundError: No module named 'apscheduler.schedulers' 和 ModuleNotFoundError: No module named 'apscheduler' 的问题,网上有不少解决。大多数都是因为,文件起名与模块名......

開援带碼
46分钟前
53
0
如何查看Android的系统版本?

有谁知道我怎么能检查系统版本(例如1.0 , 2.2 ,等)编程? #1楼 我无法对答案发表评论,但是Kaushik的答案存在一个严重错误:SDK_INT与系统版本不同,但实际上是指API级别。 if(Build.VER...

技术盛宴
今天
35
0
引入AI变量,精准农业正在加速豹变?

  不久前,“江苏省脱贫率达 99.99%,尚未脱贫人数仅剩 6 户、17 人”这样一则新闻刷屏。“把这 17 个人迁出,江苏就全省脱贫”、“最后这 6 户人家拖了后腿”,在网民们的调侃和质疑声背后...

水果黄瓜
今天
41
0
Elasticsearch系列---结构化搜索

概要 结构化搜索针对日期、时间、数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么...

清茶豆奶
今天
75
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部