单点登录的应用

单点登录(Single Sign-On,简称SSO)是一种身份验证技术,它允许用户使用一组凭据(如用户名和密码)登录到多个应用程序或系统中,而无需在每个应用程序或系统中单独登录。这种技术可以提高用户体验,减少密码管理的负担,并提高安全性。在本文中,我们将深入探讨单点登录技术的原理、优势和实现方法。

一、单点登录的原理

单点登录的原理是基于身份验证和授权。当用户登录到一个应用程序或系统时,该应用程序或系统会向身份提供者(Identity Provider,简称IdP)发送身份验证请求。身份提供者会验证用户的凭据,并向应用程序或系统发送授权令牌。该令牌包含有关用户身份的信息,例如用户名、角色和权限。当用户尝试访问其他应用程序或系统时,这些应用程序或系统会向身份提供者发送身份验证请求,并使用之前获得的授权令牌进行授权。这样,用户就可以在多个应用程序或系统中无缝地访问资源,而无需在每个应用程序或系统中单独登录。

二、单点登录的优势

单点登录技术有许多优势,包括:

1. 提高用户体验:单点登录可以减少用户需要记住的用户名和密码数量,从而提高用户体验。用户只需要登录一次,就可以访问多个应用程序或系统。

2. 减少密码管理的负担:单点登录可以减少用户需要管理的密码数量,从而减轻密码管理的负担。用户只需要记住一个密码,就可以访问多个应用程序或系统。

3. 提高安全性:单点登录可以提高安全性,因为用户只需要在一个地方输入凭据,而不是在多个应用程序或系统中输入凭据。这可以减少密码泄露的风险,并提高身份验证的可靠性。

4. 降低成本:单点登录可以降低成本,因为它可以减少对密码重置和帐户管理的支出。此外,它还可以减少对IT支持的需求,因为用户可以自己管理他们的帐户。

三、单点登录的实现方法

单点登录可以通过多种方式实现,包括:

1. 基于Cookie的单点登录:这种方法使用Cookie来存储用户的身份验证信息。当用户登录到一个应用程序或系统时,该应用程序或系统会在Cookie中存储用户的身份验证信息。当用户尝试访问其他应用程序或系统时,这些应用程序或系统会检查Cookie中的身份验证信息,并使用该信息进行身份验证和授权。

2. 基于令牌的单点登录:这种方法使用令牌来存储用户的身份验证信息。当用户登录到一个应用程序或系统时,该应用程序或系统会向身份提供者发送身份验证请求,并获得授权令牌。当用户尝试访问其他应用程序或系统时,这些应用程序或系统会向身份提供者发送身份验证请求,并使用之前获得的授权令牌进行授权。

3. 基于SAML的单点登录:这种方法使用安全断言标记语言(Security Assertion Markup Language,简称SAML)来实现单点登录。当用户登录到一个应用程序或系统时,该应用程序或系统会向身份提供者发送身份验证请求,并获得SAML断言。当用户尝试访问其他应用程序或系统时,这些应用程序或系统会向身份提供者发送身份验证请求,并使用之前获得的SAML断言进行授权。

四、单点登录的应用场景

单点登录技术可以应用于许多场景,包括:

1. 企业内部应用程序:企业内部可能有多个应用程序或系统,例如电子邮件、CRM和ERP系统。使用单点登录技术,员工可以在这些应用程序或系统之间无缝地切换,而无需在每个应用程序或系统中单独登录。

2. 云应用程序:许多企业使用云应用程序,例如Office 365和Salesforce。使用单点登录技术,员工可以在这些应用程序之间无缝地切换,而无需在每个应用程序中单独登录。

3. 联合身份验证:许多企业需要与其他企业共享资源,例如供应链合作伙伴和客户。使用单点登录技术,这些企业可以实现联合身份验证,从而提高安全性和便利性。

五、单点登录的安全性考虑

单点登录技术可以提高安全性,但也需要考虑一些安全性问题,例如:

1. 身份提供者的安全性:身份提供者可能成为攻击者的目标,因为它存储了用户的身份验证信息。因此,身份提供者必须采取适当的安全措施,例如加密和访问控制,以保护用户的身份验证信息。

2. 令牌的安全性:令牌可能被攻击者窃取或篡改。因此,令牌必须采取一定的安全措施来保护其安全性,例如加密、签名、防伪标记等。此外,令牌的使用也需要遵循一定的安全规范,例如不要在不安全的网络环境下使用令牌,不要将令牌泄露给他人等。如果令牌被窃取或篡改,应及时采取措施,例如撤销令牌、更改密码等,以保护用户的安全。

以下是单点登录的认证过程:

  1. 用户访问应用A,应用A检测到用户未登录,将用户重定向到认证中心。

  2. 用户在认证中心输入用户名和密码进行认证。

  3. 认证中心验证用户身份,如果验证通过,生成一个令牌(Token)。

  4. 认证中心将令牌返回给应用A。

  5. 应用A将令牌发送给应用B。

  6. 应用B将令牌发送给认证中心进行验证。

  7. 认证中心验证令牌,如果验证通过,返回一个授权令牌(Access Token)。

  8. 应用B使用授权令牌访问认证中心获取用户信息。

  9. 认证中心返回用户信息给应用B。

  10. 应用B使用用户信息完成用户登录。

用户登录成功之后,会与SSO认证中心及各个子系统建立会话,用户与SSO认证中心建立的会话称为全局会话,用户与各个子系统建立的会话称为局部会话,局部会话建立之后,用户访问子系统受保护资源将不再通过SSO认证中心,全局会话与局部会话有如下约束关系:

局部会话存在,全局会话一定存在 全局会话存在,局部会话不一定存在 全局会话销毁,局部会话必须销毁

  • 首先用户访问系统1受保护的资源,系统1发现未登陆,跳转至SSO认证中心,并将自己的参数传递过去

  • SSO认证中心发现用户未登录,将用户引导至登录页面

  • 用户输入用户名和密码提交至SSO认证中心

  • SSO认证中心校验用户信息,创建用户与SSO认证中心之间的会话,称为全局会话,同时创建授权令牌

  • SSO认证中心带着令牌跳转会最初的请求地址(系统1)

  • 系统1拿到令牌,去SSO认证中心校验令牌是否有效

  • SSO认证中心校验令牌,返回有效,注册系统1的地址

  • 系统1使用该令牌创建与用户的会话,称为局部会话,返回给用户受保护资源

  • 用户访问系统2受保护的资源

  • 系统2发现用户未登录,跳转至SSO认证中心,并将自己的地址作为参数传递过去

  • SSO认证中心发现用户已登录,跳转回系统2的地址,并附上令牌

  • 系统2拿到令牌,去SSO认证中心校验令牌是否有效

  • SSO认证中心校验令牌,返回有效,注册系统2地址

  • 系统2使用该令牌创建与用户的局部会话,返回给用户受保护资源

单点登录的实现方案: 1.cookie+redis 把用户的id,ip为key,及用户账号密码数据信息为value存放在redis中; 把用户凭证存放在cookie里,用户登录系统后,返回一个加密的cookie,然后用户访问其他系统时带上这个cookie,与sso认证中心校验,通过验证后登录 2、session广播 用户登录其中一个系统时,系统服务器会将用户登录的信息复制到另一个系统服务器中,当用户登录另一个系统时,服务器查看是否已有用户信息,如果有就会直接进行登录 3、token 用jwt生成字符串,把用户信息保存到字符串里,通过cookie或地址栏方式返回前端,前端把收到的token存放在请求中或url地址里,每次请求就可以携带token进行请求,访问其他系统时,在地址栏或者请求头里面获取token,根据字符串获取用户信息,可以把token放在redis中设置有效期

代码实现

1 Tomcat HTTPS支持

注意: 生成密钥库的时候要填的名字姓氏,一定要填域名。

# 1 生成密钥库
	1)d盘下面建一个文件夹cas,文件夹下面再建一个文件夹keystore(存放证书的地方)
	2)keytool -genkey -v -alias laohan -keyalg RSA -keystore D:\cas\keystore\laohan.keystore 
	输入口令(随便输,自己记得就行)
# 2 从密钥库导出证书
	keytool -export -trustcacerts -alias laohan -file D:/cas/keystore/laohan.cer -keystore D:/cas/keystore/laohan.keystore
# 3 将证书导入到JDK证书库
	keytool -import -trustcacerts -alias laohan -file D:/cas/keystore/laohan.cer -keystore "D:\java\jdk8\jre\lib\security\cacerts"
	密码:laohan
# 4 查看证书列表:
	keytool -list -keystore "D:\java\jdk8\jre\lib\security\cacerts"
# 5 删除证书
	keytool -delete -alias laohan -keystore "D:\java\jdk8\jre\lib\security\cacerts"

2 tomcat配置https支持

  • 打开tomcat下的conf下的server.xml文件然后放进去保存,协议 最大线程 开启ssl

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"  
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
			   keystoreFile="D:\cas\keystore\laohan.keystore"
			   keystorePass="laohan"/>
  • 乱码 conf 找 logging.properties 文件 找到下面配置修改,把UTF-8改为下面的GBK

 java.util.logging.ConsoleHandler.encoding = GBK
  • 下载war包,放到tomcat/webapp目录下,修改war包名字为cas.war

  • 修改用户名和密码

D:\devlop\apache-tomcat-cas\webapps\cas\WEB-INF\classes    如果没有,先启动一下tomcat

找这个文件
application.properties

打开最后一行有用户名密码
cas.authn.accept.users=casuser::Mellon

  https://localhost:8443/cas/login

3 支持数据库密码

D:\devlop\apache-tomcat-cas\webapps\cas\WEB-INF\classes    

找这个文件
application.properties

cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=root
cas.authn.jdbc.query[0].sql=select * from t_cas where username=?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver

cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true

 D:\devlop\apache-tomcat-cas\webapps\cas\WEB-INF\lib下放入以下包

 4 数据库配置 t_cas

CREATE TABLE `t_cas` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

4 支持http

D:\devlop\apache-tomcat-cas\webapps\cas\WEB-INF\classes\services\HTTPSandIMAPS-10000001.json

增加http "serviceId" : "^(https|http|imaps)://.*",

4 Springboot整合

1 导入依赖

<dependency>
    <groupId>net.unicon.cas</groupId>
    <artifactId>cas-client-autoconfig-support</artifactId>
    <version>2.3.0-GA</version>
</dependency>

<dependency>
    <groupId>org.jasig.cas.client</groupId>
    <artifactId>cas-client-core</artifactId>
    <version>3.6.2</version>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-cas</artifactId>
</dependency>

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

2 application.yml

server:
  port: 7777
cas:
  #  cas服务端地址
  server-url-prefix: https://www.laohan.com:8443/cas
  # 没有带票据或者票据过期,定义的就是服务端的登录地址
  server-login-url: https://www.laohan.com:8443/cas/login
  #  登录成功后回调的地址
  client-host-url: http://www.laohan.com:8888
  #  类型
  validation-type: cas3

3 前端页面

<!DOCTYPE html>
<html  xmlns:th="http://www.thymeleaf.org">

    <head>
        <meta http-equiv="Content-Type" content="text/html" charset="UTF-8"/>
        <title>风展超市</title>
    </head>
    <body>
        欢迎:&nbsp;&nbsp;<font th:text="${session._const_cas_assertion_.principal.name}"></font>&nbsp;&nbsp;进入风展超市
        <br>
        <a href="http://www.laohan.com:7777" target="_blank">后台系统</a><br>
        <a href="http://www.laohan.com:8888" target="_blank">前台系统</a><br>
        <br><br>
        &nbsp;&nbsp; <a href="/logout">安全退出</a>
	</body>
</html>

4 后端

@Controller
@EnableCasClient
public class IndexController {
    /**
     * 网站根目录请求
     * @return
     */
    @RequestMapping("/")
    public ModelAndView root(){
        //它可以返回前端页面
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        return modelAndView;
    }

    /**
     * 退出
     * @return
     */
    @RequestMapping("/logout")
    public String logout(){
        return "redirect:https://www.laohan.com:8443/cas/logout";
    }
}

5 再配置两个同样的服务器,端口不一样就可以了

猜你喜欢

转载自blog.csdn.net/weixin_46894136/article/details/131033714