构建和实现单点登录解决方案(转载于IBMdeveloperWorks)

将一个开放源码的基于 Java 的身份验证组件集成进 Web 门户中

在现有的应用程序中实现单点登录解决方案(single sign-on,SSO,即登录一次,就可以向所有网络资源验证用户的身份)是非常困难的,但是在构建复杂的门户时,每个开发人员都要面对这个问题。因为门户需要与后端资源集成,而每个后端资源都有自己的身份验证需求,所以门户常常必须向用户提供单点登录特性。在本文中,Chris Dunne 一步步地描述了他为一个 Web 门户构建单点登录解决方案的经历。他将讲解如何设置一个开放源码解决方案(来自 Yale University 的 Central Authentication Service),以及如何将它扩展为根据 Microsoft Active Directory 基础设施进行身份验证。

我在自己的工作中发现,对各种门户应用程序的需求正在增长。门户的技术和功能性需求变得越来越复杂了。尽管出现了可以构建简单门户的工具,但是门户与远程或遗留数据源的集成问题仍然不容易解决。其中一个问题就是身份验证。

身份验证是个复杂的问题。门户需要向后端数据源和应用程序验证用户的身份,但是这些应用程序可能具有互不相同的底层安全基础设施。理想的最高效的身份验证解决方案是单点登录(single sign-on,SSO) 解决方案;在这种解决方案中,用户只需要登录一次,就可以向所有网络资源验证他的身份。

最近,在构建一个需要 SSO 的教育门户时,我研究了许多商业的和开放源码的 SSO 解决方案。在本文中,我将一步步地介绍使用免费的 SSO 实现(来自 Yale University 的 CAS)构建简单 SSO 系统的过程。

为什么要选择单点登录?

有多少人实现过自己的身份验证机制(常常是某种简单的数据库查询)?您是否常常考虑创建和管理用户帐号所需的工作流?在任何开发项目中,身份验证都是很常见的任务。如果幸运的话,公司已经有一些通用的身份验证类或库。但是,这个任务常常被忽视,被当作只在后台发生的微不足道的事情。

一般来说,公司往往没有一致的身份验证策略或可靠的身份验证框架。随着时间的推移,这会导致大量应用程序具有自己的身份验证需求和用户存储库。每个人都需要记住多个用户名和密码,才能访问网络上的不同应用程序。这给管理和支持部门带来很大的负担 —— 必须在每个应用程序中为每个职员设置帐号,当用户忘记密码时还要帮助他们解决问题,等等。

身份验证是多种应用程序、平台和基础设施共有的需求。一般来说,一个用户应该不需要多个用户名。理想情况下,他应该只需要证明自己的身份一次,然后就能够访问所有已经得到授权的网络资源。

SSO 的目标是,让用户能够通过一次登录访问所有应用程序。它提供一个统一的机制来管理用户的身份验证,并实现业务规则来决定用户对应用程序和数据的访问。

在讨论单点登录的技术细节之前,先谈谈单点登录的一些好处和风险。好处包括:

  • 提高用户的效率。用户不再被多次登录困扰,也不需要记住多个 ID 和密码。另外,用户忘记密码并求助于支持人员的情况也会减少。
  • 提高开发人员的效率。SSO 为开发人员提供了一个通用的身份验证框架。实际上,如果 SSO 机制是独立的,那么开发人员就完全不需要为身份验证操心。他们可以假设,只要对应用程序的请求附带一个用户名,身份验证就已经完成了。
  • 简化管理。如果应用程序加入了单点登录协议,管理用户帐号的负担就会减轻。简化的程度取决于应用程序,因为 SSO 只处理身份验证。所以,应用程序可能仍然需要设置用户的属性(比如访问特权)。

对于单点登录,经常提到的一些问题包括:

  • 难以重构。对 SSO 解决方案进行重构来适应现有的应用程序很困难,很耗费时间而且昂贵。
  • 无人看守的桌面。实现 SSO 会减少一些安全风险,但是也增加了其他安全风险。例如,如果用户登录之后离开了他的机器,恶意用户就可以访问他的资源。尽管这是一个普遍存在的安全问题,但是 SSO 会使这个问题更加严重,因为恶意用户可以访问所有获得授权的资源。在采用多次登录方式时,用户每次只能登录进一个系统,所以只有一个资源被泄露。
  • 单点攻击。在使用单点登录时,所有应用程序使用一个集中的身份验证服务。对于希望实施拒绝服务攻击的黑客,这是一个有吸引力的目标。

所以,SSO 并非毫无缺点。但是我相信,在用户、管理员和开发人员看来,它的优点要超过缺点。

SSO 开放源码项目

正如前面提到的,我当前正在为一个教育机构构建 Web 门户。这个门户将为参与远程课程的学生提供一个在线学习环境。

这个门户的构造块已经就位了。站点已经建立了,课程内容已经开发出来了,虚拟学习环境也就位了,辅助应用程序(比如日记、日历、电子邮件和笔记本)已经构建好或已经取得。所有这些组件都正在由学生使用,而且每个应用程序都运行在自己的服务器上。

客户现在希望能够通过 Web 浏览器远程访问这些应用程序,所以要构建一个门户来提供访问应用程序的单一入口,门户应该向用户提供单点登录功能。用户登录进门户之后,对他的身份进行验证,然后他就能够访问门户中所有已授权的资源。

我决定搜索一下关于如何实现 SSO 方案的信息,寻找有帮助的白皮书、产品和开放源码项目。我使用以下条件来限制搜索的范围:

  • Java 实现。这个门户应用程序基础设施是基于 Java 的,所以我希望 SSO 实现也是基于 Java 语言的。
  • 容易实现。在这个场景中,容易实现是指不需要对基础设施或现有的应用程序做大量修改。
  • 其效果已经得到证明。它应该已经被一些大型组织采用,而且仍然处于活跃的开发阶段。
  • 与 LDAP 兼容。我们的客户使用 Microsoft Active Directory Server,所以我需要系统能够轻松地根据 ADS 进行身份验证。

我很高兴地发现了几个出色的开放源码项目。(参见 参考资料 中的列表。)

我开始使用来自 Yale University 的 CAS(Central Authentication Service)系统开发一个原型,因为它满足我的所有条件。它是基于 Java 的,源代码是开放的。只需使用 JSP 标记和 servlet 过滤器,就能够相当轻松地在 Java 应用程序环境中实现它。Yale University 正在使用它,这说明它的品质满足我的条件。它还允许轻松地改变或扩展实际的身份验证机制(无论是查询数据库还是 LDAP 服务器上的用户名和密码)。

CAS 概述

注意,在采用 CAS 协议时,应用程序不会看到用户的密码。CAS 服务器执行身份验证,只有它能够看到用户的密码。这会增强安全性,因为用户名和密码并不通过网络传递给其他应用程序。

下图说明了在集成了 CAS 服务器的系统中身份验证是如何执行的。

图 1. CAS 协议如何执行身份验证

CAS 协议如何执行身份验证

下面是这个身份验证协议中的主要步骤。

  1. 用户尝试使用应用程序的 URL 访问应用程序。用户被重定向到 CAS 登录 URL,采用的是 HTTPS 连接,他请求的服务的名称作为参数传递。这时向用户显示一个用户名/密码对话框。
  2. 用户输入 ID 和密码,CAS 对他进行身份验证。如果身份验证失败,目标应用程序根本不会知道这个用户曾经试图访问它 —— 用户在 CAS 服务器上就被拦住了。
  3. 如果身份验证成功,CAS 就将用户重定向回目标应用程序,并在 URL 中附加一个称为 ticket 的参数。然后,CAS 尝试创建一个称为 ticket-granting cookie 的内存 cookie。这是为了以后进行自动的重新验证;如果存在这个 cookie,就表示这个用户已经成功地登录了,用户就不需要再次输入他的用户名和密码。
  4. 然后,应用程序要检查这个 ticket 是否正确,以及是否代表一个有效用户;检查的方法是,打开一个 HTTPS 连接来调用 CASserviceValidate URL,并作为参数传递 ticket 和服务名称。CAS 检查这个 ticket 是否有效,以及是否与请求的服务相关联。如果检查成功,CAS 就将用户名返回给应用程序。

如果采用 Servlet 2.3 规范进行开发,那么甚至不需要为这些步骤操心。一个 servlet 过滤器会处理整个协议。您要做的只是在 web.xml 文件中配置过滤器参数。我就采用这种方式 —— 它意味着对门户中应用程序代码的修改非常少。

对 CAS 的深入讨论超出了本文的范围,我建议您阅读 参考资料 中列出的来自 Yale University 的文章,从而判断这种身份验证方案是否满足您的需要。

CAS 入门

设置 CAS 软件是非常简单的,但是在开始设置之前,您应该了解我用的一些软件。我只用 Tomcat 4.1、Java Development Kit 1.4 和 Ant 1.5 测试了 CAS。(可以从 参考资料 下载这里提到的文件和客户机库。)

首先,下载 CAS 服务器和客户机库。已经针对许多语言和环境开发了客户机库,包括 Java、ASP、Perl、PHP 和 PL/SQL。

CAS 使用 HTTPS,所以必须在 Tomcat 中启用这个功能。我发现这需要点儿技巧,但是如果按照我提供的说明(readme_tomcat_ssl.txt 文件)去做,应该不困难。

对 CAS 服务器 ZIP 文件进行解压,并使用 Ant 构建脚本构建 CAS 服务器软件。将 WAR 文件(Web Archives)部署到 Tomcat 的 /webapps 目录中。在启动 Tomcat 时,用 WAR 文件在 Tomcat/webapps 中创建一个 CAS 目录。

下载 CAS 客户机库。对 ZIP 文件进行解压,就会看到许多目录。我要使用的是 Java 客户机库。同样,也提供了 Ant 构建脚本。运行这个构建脚本。这会生成一个称为 casclient.jar 的 JAR 文件。将这个文件复制到 Tomcat 根目录下的 common/lib 目录中。

现在,需要配置应用程序来使用 CAS。本文中用来进行演示的应用程序是 Tomcat 提供的可靠的 “HelloWorld” servlet 示例。这个应用程序应该在 Tomcat 系统中的 /webapps/examples 目录下面。修改 web.xml 文件来配置 servlet 过滤器。

HelloWorld JSP 的 web.xml 文件包含下面的 servlet 过滤器配置。它对 HTTPS 使用本地主机和端口 8443。根据自己的配置修改这些设置。我提供的 zip 文件中包含一个 web.xml 文件示例。

清单 1. HelloWorld JSP 的默认 servlet 过滤器配置
<filter><filter-name>CAS Filter</filter-name><filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class><init-param><param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name><param-value>https://localhost:8443/cas/login</param-value></init-param><init-param><param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name><param-value>https://localhost:8443/cas/proxyValidate</param-value></init-param><init-param><param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name><param-value>localhost</param-value></init-param></filter><filter-mapping><filter-name>CAS Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

启动 Tomcat。然后输入 URL http://localhost/examples/servlet/HelloWorldExample。这时会重定向到 CAS 登录屏幕。默认的身份验证器只要求为用户名和密码提供相同的字符串,例如在两个域中都输入 demo。然后,就会重定向到 HelloWorld 页面。

这只是个简单的 CAS 演示,但是它说明,通过使用这个强大的 servlet 过滤器,让现有的 Java servlet 应用程序使用 CAS 是多么容易。还可以使用 JSP 标记集替代 servlet 过滤器,这种方法适合那些无法使用 servlet 过滤器的应用程序或应用服务器。

Active Directory Server 身份验证

在我的教育门户项目中,可以很轻松地修改应用程序,因为我能够得到源代码。我在每个应用程序中使用了 servlet 过滤器。在这种情况下,当用户首次访问门户并请求一个受限制的应用程序或数据源时,CAS 将执行身份验证。身份验证成功之后,CAS servlet 过滤器可以检查 ticket,并将用户名作为参数传递给请求的应用程序。我修改了现有的应用程序登录屏幕,让它们在成功的身份验证之后从 CAS 接收用户名参数。然后,应用程序可以使用这个参数对用户进行授权,并对用户的活动进行审计记录。

但是,CAS 本身没有附带任何真正有用的身份验证器。默认的身份验证器仅仅检查用户名和密码是否相同。在教育门户项目中,我使用 Microsoft 的 Active Directory Server 存储用户的个人信息。所以我需要扩展 CAS 服务器,让它根据 Active Directory Server 检查用户名和密码。

Yale University 的 CAS 设计人员开发了一个可插入的身份验证器架构。通过扩展 PasswordHandler 接口,开发人员可以创建一个类来实现密码检查逻辑。

清单 2. CAS 的可插入身份验证器架构
/** Interface for password-based authentication handlers. */
public interface PasswordHandler extends AuthHandler {/*** Authenticates the given username/password pair, returning true* on success and false on failure.*/boolean authenticate(javax.servlet.ServletRequest request,String username,String password);}

我要做的只是了解如何使用 Active Directory Server 检查用户名和密码,创建一个类来扩展这个接口,并添加执行身份验证的代码。

ADS 是一种与 LDAP3 兼容的目录服务器。它支持许多不同的身份验证方法,主要包括匿名(anonymous)简单(simple) 和SASL(Simple Authentication and Security Layer)。匿名身份验证不适合我的项目;简单身份验证用明文发送密码,这也不满足需要。所以我使用 SASL。

SASL 支持可插入的身份验证。这意味着可以对 LDAP 客户机和服务器进行配置,让它们相互协商并使用多种身份验证机制之一。下面是当前定义的一部分 SASL 机制:

  • Anonymous
  • CRAM-MD5
  • Digest-MD5
  • External
  • Kerberos V4
  • Kerberos V5
  • SecurID
  • Secure Remote Password
  • S/Key
  • X.509

在这些机制中,流行的 LDAP 服务器(比如 Sun、OpenLDAP 和 Microsoft 提供的服务器)都支持 External、Digest-MD5 和 Kerberos V5。

CAS 本身与 Kerberos 相似,它们有许多相同的概念,比如 ticket 和 ticket-granting ticket(在 CAS 中实际上称为 ticket-granting cookie),它们的协议也是相似的。所以,选择 Kerberos 机制似乎是很自然的。另外,添加对 Kerberos 身份验证的支持让 CAS 在未来的开发中能够作为基于 Web 的 Kerberos 代理代表用户,这使 CAS 能够替用户管理 Kerberos ticket 的所有方面。这意味着远程用户也可以使用相同的 Kerberos 身份验证机制访问本地和网络资源。

Kerberos 协议已经内置在 ADS 和 Windows 2000/XP 中。Java Authentication and Authorization Service(JAAS)提供了 Kerberos Login Module 的一个实现(参考资料 中列出的一个教程详细描述了如何建立一个示例应用程序)。精确地说,它是 GSS-API SASL 机制,但是它只为 LDAP3 服务器提供 Kerberos v5 身份验证。

Kerberos 身份验证是一个很简单的过程(如果仔细地按照以下说明进行操作的话):

  1. 在 JAAS 配置文件中为应用程序类配置 Login Module。
    edu.yale.its.tp.cas.auth.provider.KerberosAuthHandler  
    {
    com.sun.security.auth.module.Krb5LoginModule required client=TRUE;
    };
  2. 创建一个 LoginContext,传递执行身份验证的类的名称和 CallBackHandler 对象。
    LoginContext lc = new LoginContext(CASApp.class.getName(), new CASCallbackHandler());
  3. 调用 login() 方法来执行身份验证。如果执行过程没有异常,身份验证就成功了。如果抛出了异常,那么这个异常会指出失败的原因。

要想深入了解 Kerberos 身份验证,建议您利用本文末尾的参考资料。(我还提供了自己的实现和配置文件,KerberosAuthHandler 和CASCallBackHandler。)

需要创建一个新的 PasswordHandler 实现,KerberosAuthHandler,它按照上面的方法根据使用 Kerberos v5 的 Active Directory Server 进行身份验证。

清单 3. 创建新的 PasswordHandler 实现
public class KerberosAuthHandler implements PasswordHandler {public boolean authenticate(javax.servlet.ServletRequest request,String username,String password) {LoginContext lc = null;try {/* Set up the Callback handler, and initialise *//* the userid and password fields */CASCallbackHandler ch = new CASCallbackHandler();ch.setUserId(username);ch.setPassword(password);/* Initialise the login context - LoginModule configured *//* in cas_jaas.conf and *//* set to use Krb5LoginModule. */lc = new LoginContext(KerberosAuthHandler.class.getName(), ch);/* Perform the authentication */lc.login();} catch (LoginException le) {System.err.println("Authentication attempt failed" + le);return false;}return true;}
}

在创建 LoginContext 时,传递这个类名和 CASCallbackHandler 对象。JAAS 配置文件指定这个类使用的登录模块。

在调用 login() 方法时,登录模块知道为了进行身份验证它需要从用户/应用程序获得哪些信息。在使用 Kerberos 时,它需要用户名和密码,所以它构造一个数组,其中包含两个回调对象(NameCallback 和 PasswordCallback),然后调用 CallbackHandler 对象,这个对象决定如何执行这些回调并获得用户名和密码。

我采用最简单最有利的方式,使用 CallbackHandler 上的 setter 方法显式地设置用户 ID 和密码。然后,CallbackHandler 将它们传递给NameCallback 和 PasswordCallback 对象。

清单 4. 用 setName (CASUserId) 和 setPassword (CASPassword) 设置 ID 和密码
public class CASCallbackHandler implements CallbackHandler 
{private String CASUserId;private char [] CASPassword;public void handle(Callback[] callbacks) throws java.io.IOException, UnsupportedCallbackException {for (int i = 0; i < callbacks.length; i++) {if (callbacks[i] instanceof NameCallback) {NameCallback cb = (NameCallback)callbacks[i];cb.setName(CASUserId);} else if (callbacks[i] instanceof PasswordCallback) {PasswordCallback cb = (PasswordCallback)callbacks[i];cb.setPassword(CASPassword);} else {throw new UnsupportedCallbackException(callbacks[i]);}}}public void setUserId(String userid){CASUserId = userid;}public void setPassword(String password){CASPassword = new char[password.length()];password.getChars(0, CASPassword.length, CASPassword, 0);}

下面要做的是让 CAS 使用新的身份验证处理器。方法是在 webapps/cas 中 CAS 服务器的 web.xml 文件中进行以下设置:

清单 5. 让 CAS 使用新的身份验证处理器
<!-- Authentication handler --><context-param><param-name>edu.yale.its.tp.cas.authHandler</param-name><param-value>edu.yale.its.tp.cas.auth.provider.KerberosAuthHandler</param-value></context-param>

ZIP 文件(参考资料 中的 KerberosAuthSrc.zip)中包含一个 web.xml 示例。

必须重新启动 Tomcat,但是这一次还需要设置一些 Java 运行时属性。对 ZIP 文件(KerberosAuthSrc.zip)进行解压,并将文件 cas_jaas.conf、krb5.conf 和 setkerberosjvmoptions.bat 复制到 TOMCAT_HOME 目录中。运行 setkerberosjvmoptions.bat,然后启动 Tomcat。

现在,可以再用 HelloWorld 应用程序做实验了。这一次,可以使用 Active Directory Server 中定义的有效的 Kerberos 用户名和密码对。

转载于:https://www.cnblogs.com/lxchma/p/6428023.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一个基于Abp 和Yarp 开发的API网关项目

这个项目起源于去年公司相要尝试用微服务构建项目,在网关的技术选型中,我们原本确认了ApiSix 网关,如果需要写网关插件需要基于Lua脚本去写,我和另外一个同事当时基于这个写了一个简单的插件,但是开发测试以及发布都很麻烦,而且使用Lua脚本作为插件的开发语言本身也不是我们强项…

罗振宇2022“时间的朋友”跨年演讲全文稿(pdf)

2021年12月31日20:30&#xff0c;五粮液成都金融城演艺中心&#xff0c;罗振宇“时间的朋友”跨年演讲如约而至。 罗胖曾发下大愿望&#xff1a;跨年演讲要连办二十年。今年是第七场&#xff0c;也是最特殊的一场&#xff0c;罗胖面对12000个空座位&#xff0c;用53个好故事&am…

08.LoT.UI 前后台通用框架分解系列之——多样的Tag选择器

LOT.UI分解系列汇总&#xff1a;http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下&#xff1a;https://github.com/dunitian/LoTCodeBase/tree/master/LoTUI 这个必须说下&#xff0c;本来是用Bootstrap-Select做的&#xff0c;很漂亮&#xff0c;正好…

jquery文档加载完毕后执行的几种写法

2019独角兽企业重金招聘Python工程师标准>>> 1.js文档加载完毕 标签内 οnlοad"test()"window.οnlοadfunction(){}2.jquery文档加载完毕 //方式1 $(document).ready(function(){//TODO }); //方式2 $(function(){//TODO }) //方式3 $(function($){//TO…

新型基础测绘与实景三维中国建设技术文件【3】基础地理实体空间身份编码规则

基础地理实体是新型基础测绘产品体系中的核心成果&#xff0c;是推动基础测绘工作转型升级的关键。与现有的测绘地理信息数据不同&#xff0c;基础地理实体具有多粒度、多模态、多层次&#xff0c;以及搭载结构化、半结构化和非结构化多样化信息的鲜明特点。 基础地理实体空间…

oracle 表 视图 存储过程 序列 job

table 表--delete tabledrop table Test1;-- Create tablecreate table TEST1(ID NUMBER,T_NAME VARCHAR2(100),DT DATE);-- 添加注释comment on column TEST1.T_NAME is 名称;--添加age字段alter table Test1 add (age NUMBER(8));--删除字段alter table TABLE_NAME …

[转]Docker 大势已去,Podman 即将崛起

Podman Podman 什么是Podman&#xff1f;Podman和Docker的主要区别是什么&#xff1f;Podman的使用与docker有什么区别&#xff1f;Podman 常用命令 容器镜像部署 PodmanPodman 加速器使用 Podman 运行一个容器列出运行的容器检查正在运行的容器查看一个运行中容器的日志查看一…

基于Kubernetes v1.24.0的集群搭建(一)

一、写在前面 K8S 1.24作为一个很重要的版本更新&#xff0c;它为我们提供了很多重要功能。该版本涉及46项增强功能&#xff1a;其中14项已升级为稳定版&#xff0c;15项进入beta阶段&#xff0c;13项则刚刚进入alpha阶段。此外&#xff0c;另有2项功能被弃用、2项功能被删除。…

思科三层交换机充当路由器实现全网互通

转载于:https://blog.51cto.com/13568840/2059797

mpvue开发小程序分享朋友圈无法自定义标题解决方法

在node_modules里面找到mpvue&#xff0c;手动修改一下mpvue这个包下的index.js文件 // 用户点击右上角分享 到朋友圈 onShareTimeline: rootVueVM.$options.onShareTimeline? function (options) { return callHook$1(rootVueVM, onShareTimeline, options); } : null,找到 L…

【ArcGIS Pro微课1000例】0020:ArcGIS Pro中河流(曲线)、湖泊(水体色)图例制作案例教程

相关阅读:【ArcGIS微课1000例】0032:ArcGIS中河流(曲线)、湖泊(水体色)图例制作案例教程 河流、湖泊的样式设置功能在ArcGIS Pro得到了延续,本文讲解ArcGIS Pro中河流湖泊图例的设置方法。 《ArcGIS Pro从入门到精通系列精品教程(微课版)》专栏包括完整的实验数据包,…

swift学习选pizza项目

2019独角兽企业重金招聘Python工程师标准>>> 原文: https://makeapppie.com/2014/09/18/swift-swift-implementing-picker-views/ 效果: 步骤: 新建iOS single view application 名字为SwiftPickerViewPizzaDemo, 打开main storyboard选中view controoler, 右上角, …

Windows 11 新版 25163 推送!任务栏全新菜单、应用商店更新、文件资源管理器大量修复...

面向 Dev 频道的 Windows 预览体验成员&#xff0c;微软现已推送 Windows 11 预览版 Build 25163。主要变化1.微软宣布为 Windows 11 任务栏引入全新溢出体验&#xff0c;当任务栏上的应用程序图标或窗口达到任务栏容量上限时&#xff0c;将启用全新溢出菜单。2.微软更新了 Mic…

[转]Web3 是去中心化的“骗局”?

作者 | InvisibleUp 译者 | 弯月 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; Web3 不是去中心化。 虽然我觉得这一点很明显&#xff0c;根本不需要通过一篇文章来说明&#xff0c;但我也是迫不得已&#xff0c;因为突然之间各大科技巨头&#xff0c;比如 Redd…

实景三维建设背景下,三维GIS面临哪些挑战?

2021年8月26日&#xff0c;自然资源部印发《实景三维中国建设技术大纲&#xff08;2021版&#xff09;》&#xff0c;明确指出“实景三维中国建设是落实数字中国、平安中国、数字经济战略的重要举措&#xff0c;是落实国家新型基础设施建设的具体部署&#xff0c;是服务生态文明…

第一次玩,试试手(标题)

Hello Blog&#xff01;&#xff01;转载于:https://blog.51cto.com/10999994/1786094

【CASS精品教程】CASS9.1生成标准图幅案例教程

在CASS中,可以很方便的生成标准图幅,如50*50。本文演示cass中,根据测区范围标准图幅生成过程。 一、图幅预览: 二、图幅生成 打开测区范围,如下图所示: 点击【绘图处理】→【批量分幅】→【格网建立】,如下图所示: 选择比例尺500,直接回车。 选择图幅50*50。 根据测区…

分布式日志收集系统 - ExceptionLess的安装、配置、使用

前言Exceptionless 是一个开源的实时的日志收集框架&#xff0c;它可以应用在基于 ASP.NET&#xff0c;ASP.NET Core&#xff0c;Web API&#xff0c;Web Forms&#xff0c;WPF&#xff0c;Console&#xff0c;ASP.NET MVC 等技术开发的应用程序中&#xff0c;并且提供了REST接…

[转]使用npm发布vue组件

&#x1f636; NPM 是随同 NodeJS 一起安装的 javascript 包管理工具&#xff0c;能解决 NodeJS 代码部署上的很多问题 发布前的准备 注册一个 npm 账号 前往 NPM 官网进行注册 初始化项目 这里用的是webpack-simple,可以理解为精简版的vue-cli。 如果没有全局安装 vue 的话&am…

[置顶]tcpflow 抓包

转自&#xff1a; http://www.rwifeng.com/jekyll/update/2015/04/16/how-to-tcpflow/ tcpflow 抓包 Apr 16, 2015 大家都知道 tcpdump 是一个很方便的抓包工具&#xff0c; 但是 tcpdump 是以包为单位进行输出的&#xff0c;阅读起来不是很方便。 而 tcpflow 是面向 TCP 流的…