`
longgangbai
  • 浏览: 7325900 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JBoss下的单点登陆(SSO)技术实现分析

阅读更多

本文介绍了单点登陆(SSO, Single Sign On)的实现原理,详细地解释了单点登陆的实现原理以及实现过程中的关键点和相关选项的含义,并且通过Josso与JBoss服务器的集成,简要介绍了在JBoss环境中单点登陆的实施。

     随着互联网的不断发展,各种网络化应用服务的不断普及,在大中型企业中,用户可能每天需要登录到许多不同的信息应用系统,如协同办公系统、邮件系统、文件关系系统、各种网络化的应用服务等。而每个系统都要求拥护遵循它们所定义的一套安全策略,比如要求输入用户名和密码。随着用户所拥有的服务的不断增多,用户登陆所带来的出错可能性便会随之增加,信息受到非法截获和破坏的可能性也会增大,系统的安全性就会相应降低。同时对于系统管理员来说他除了要管理用户的用户名和密码之外,还需要对不同的用户进行相应安全策略的设置。这样就势必造成了系统和安全管理资源的开销,降低了生产效率,同时还增加了企业IT部门的管理成本。为了解决以上的问题,现在很多企业在进行信息化实施的过程中引入了单点登陆,就是先通过一个应用程序的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。当然,要求该用户使用的用户名和口令在访问的应用中一致,且拥有足够权限。下面我们将通过Josso与JBoss的集成的单点登陆(SSO)的实例,对单点登陆(SSO)的原理及其在JBoss环境下的技术实现进行更进一步的分析。
 
    1. 什么是单点登陆(SSO) 
    单点登录(SSO,Single Sign On)是指在分布式环境下,整个系统只有一个可以登录进入的点,它对所有的请求(Request)都是通用的。单点登录可以保证用户能够访问到可以访问的资源,如果有一个未被授权的请求要求访问被保护的资源,这个请求将自动被导向到相应的验证点进行登录验证。

    2. 单点登录(SSO)的实现原理
    (1) 登陆点。理想的情况是用户通过任何应用系统都能进行登陆,而且效果一样。这种单一的登陆点在整个系统的设计中是唯一认证用户的地方,由登陆点将相应的用户信息传递给应用系统,应用系统利用这些信息来进行用户的验证。

    (2) 应用系统的单点登录(SSO)集成。并不是任何系统都能够使用SSO,只有那些符合SSO规范,使用SSO API的应用系统才具有SSO的功能。简单地说就是要修改已有的应用系统,屏蔽已有的应用系统的用户认证模块,使用系统提供的SSO API来验证用户,以及对用户的操作进行授权。

    (3) 统一的认证,权限信息库。通常SSO要求有统一的认证,权限存放库。但现实中,有的系统无法使用外部的认证,授权信息库,所以就需要在应用系统和SSO认证系统之间进行认证,同时进行授权信息的数据同步。
实现描述:在用户成功通过SSO认证系统认证之后,系统提供的映射授予权限来为用户登录到其有权可以使用的应用系统。系统提供的映射取消用户权限来实现用户的注销功能。

用户存取由SSO认证系统所提供的安全策略,SSO会话服务保存了对用户授权的证明,这样就不再需要用户重新进行身份验证。在这种方式下,用户就拥有了访问通过SSO应用系统集成的应用服务的权限,我们提供的SSO Session将会为它保持会话服务。(见图1)


图1 SSO登陆过程

    同时,SSO应用系统还包括的与登录恰恰相反的,统一的注销点,即用户注销,就失去了应用系统集成的应用服务的访问权限。(见图2)
图2 SSO注销过程

 

 

3. Josso与JBoss集成的单点登录(SSO)环境的搭建
    (1)、部署环境的准备及配置。
    在搭建单点登陆(SSO)开发环境之前,需要准备的开发工具有:
    JDK1.5.04 (http://java.sun.com) 
    JBoss 4.0.4GA (http://www.jboss.org) 
    josso-1.4.tar (http://www.josso.org) 
    MySQL 5.0和MySQL的JDBC驱动mysql-connector-java-3.1.13-bin.jar (http://www.mysql.org) 
    需要设置的环境有:

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->JAVA_HOME = C:\Program Files\Java\jdk1.5.0_09 JBOSS_HOME = D:\JBoss4.0.5GA JOSSO_HOME = D:\josso1.4

    (2)、定义用户模型和安全策略。这里我们采用JAAS的用户模型进行数据模型的设计(如图3)。


图3 SSO的用户模型

    同时,向数据库里添加一些数据。以上操作的SQL脚本另见附件createdb.sql。
    (3)、配置Josso的SSO gateway。在src\resources下可以见到josso-gateway-config.xml,修改其中的设置,原文件中有关于JDBC,DataSource,LDAP等配置的模版,这里我们设置最简单的JDBC连接数据库进行认证,需要修改的有JDBC Credential Store和JDBC Credential Store。详细修改的文件见附件

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->JOSSO_USER : 用户的登陆验证信息 JOSSO_ROLE : 保存所有可定义的用户角色 JOSSO_USER_ROLE : 保存每个用户与角色关联的信息 JOSSO_USER_PROPERTY : 保存用户的个人信息


josso-gateway-config.xml。

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><!-- ========================================================= --> <!-- JDBC Credential Store --> <!-- ========================================================= --> <credential-store> <class>org.josso.gateway.identity.service.store.db.JDBCIdentityStore</class> <credentialsQueryString> SELECT login AS username , password AS password FROM josso_user WHERE login = ? </credentialsQueryString> <connectionName>root</connectionName> <connectionPassword>123456</connectionPassword> <connectionURL>jdbc:mysql://localhost:3306/josso_exam</connectionURL> <driverName>com.mysql.jdbc.Driver</driverName> </credential-store> <!-- ========================================================= --> <!-- JDBC Identity Store --> <!-- ========================================================= --> <sso-identity-store> <class> org.josso.gateway.identity.service.store.db.JDBCIdentityStore </class> <userQueryString> SELECT login FROM josso_user WHERE login = ? </userQueryString> <rolesQueryString> SELECT josso_role.name FROM josso_role , josso_user_role , josso_user WHERE josso_user.login = ? AND josso_user.login = josso_user_role.login AND josso_role.name = josso_user_role.name </rolesQueryString> <userPropertiesQueryString> SELECT 'user.description' AS name , description AS value FROM josso_user WHERE login = ? UNION SELECT name AS name , value AS value FROM josso_user_property WHERE login = ? </userPropertiesQueryString> <connectionName>root</connectionName> <connectionPassword>123456</connectionPassword> <connectionURL>jdbc:mysql://localhost:3306/josso_exam</connectionURL> <driverName>com.mysql.jdbc.Driver</driverName> </sso-identity-store>

    (4)、将MySQL的驱动拷贝到/src/webapp/josso/WEB-INF/lib目录下,供JDBC连接数据库时调用。 
    (5)、配置Josso的登陆点和注销点,在josso-agent-config.xml中修改,这里我们保持Josso系统默认的登陆和注销设置,同时注意应当把<endpoint>选项的localhost改为主机相对应的IP地址,否则SSO将会失效。 
    (6)、进入命令行模式,转到Josso的主目录下,执行build.bat war、build.bat install-jboss4和build.bat deploy-jboss4即可。 
    (7)、修改JBoss server\default\conf目录下的login-config.xml文件,在里面添加Josso的login模型。

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><application-policy name = "josso"> <authentication> <login-module code = "org.josso.jb4.agent.JBossSSOGatewayLoginModule" flag = "required"> <module-option name="debug">true</module-option> </login-module> </authentication> </application-policy>

    (8)、修改JBoss server/default/deploy/jbossweb-tomcat55.sar目录下的server.xml文件,在其中添加<Value>选项和<Realm>选项。

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><Valve className="org.josso.tc55.agent.SSOAgentValve" debug="1"/> <Realm className="org.josso.jb4.agent.JBossCatalinaRealm" appName="josso" userClassNames="org.josso.gateway.identity.service.BaseUserImpl" roleClassNames="org.josso.gateway.identity.service.BaseRoleImpl" debug="1" />

    (9)、启动JBoss。在浏览器中输入http://localhost:8080/partnerapp/protected,如果能转到登陆界面,然后输入用户名(user1)和密码(user1pwd)能够进行登陆,那么Josso和JBoss单点登陆(SSO)的集成就大功告成了。

    4. Josso与Web应用安全策略的管理
    Josso在Web应用安全策略的管理主要通过JBoss容器的进行用户权限的分配和取消。它的整个应用模型主要是基于JAAS的安 全策略模型进行拓展,并对Web页面层和EJB应用组件分别进行安全控制,下面我们通过Josso自带的一个例子来说明。
Web页面层的安全控制是在web.xml中通过<login-config>、<security-constraint>和<security-role>标签定义来实现的。
以下是Josso中partnerapp例子对Web页面层的安全控制实现:

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><security-constraint> <!-- Sample Security Constraint --> <web-resource-collection> <!-- We're going to protect this resource and make it available only to users in "role1". --> <web-resource-name>public-resources</web-resource-name> <url-pattern>/resources/**//*</url-pattern> <http-method>HEAD</http-method> <http-method>GET</http-method> <http-method>POST</http-method> <http-method>PUT</http-method> <http-method>DELETE</http-method> </web-resource-collection> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>protected-resources</web-resource-name> <url-pattern>/josso/*</url-pattern> <url-pattern>/protected/*</url-pattern> <http-method>HEAD</http-method> <http-method>GET</http-method> <http-method>POST</http-method> <http-method>PUT</http-method> <http-method>DELETE</http-method> </web-resource-collection> <auth-constraint> <role-name>role1</role-name> </auth-constraint> <user-data-constraint> <transport-guarantee>NONE</transport-guarantee> </user-data-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/login-redirect.jsp</form-login-page> <form-error-page>/login-redirect.jsp</form-error-page> </form-login-config> </login-config> <security-role > <description>Role 1</description> <role-name>role1</role-name> </security-role>

     对于EJB应用组件只需在ejb-jar.xml的部署描述符中添加<security-role>中定义相应的安全策略,对于JBoss来说同时还需要在jboss.xml中添加<security-domain>,以保证当前域的安全策略生效。在partnerapp中的实现如下:

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'> <ejb-jar> <display-name>Partner Component</display-name> <enterprise-beans> <session> <ejb-name>PartnerComponentEJB</ejb-name> <home>org.josso.samples.ejb.PartnerComponentHome</home> <remote>org.josso.samples.ejb.PartnerComponent</remote> <ejb-class>org.josso.samples.ejb.PartnerComponentEJB</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> <assembly-descriptor> <security-role> <description>Role 1</description> <role-name>role1</role-name> </security-role> <method-permission> <description>Security attributes for 'PartnerComponenttEJB' methods</description> <role-name>role1</role-name> <method> <ejb-name>PartnerComponentEJB</ejb-name> <method-name>*</method-name> </method> </method-permission> <container-transaction> <method> <ejb-name>PartnerComponentEJB</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd"> <jboss> <security-domain>java:/jaas/josso</security-domain> <enterprise-beans> <session> <ejb-name>PartnerComponentEJB</ejb-name> <jndi-name>josso/samples/PartnerComponentEJB</jndi-name> </session> </enterprise-beans> </jboss>

    以上是Josso对Web应用层和EJB组件所关联的安全策略的部署描述,另外在Josso验证的验证过程中,登陆页面、注销页面和通过验证后用户的信息都是通过JBoss服务器支持的单点登陆模式来实现的。JBoss服务器支持的登录验证机制主要有:基于HTTP的基本验证(采用简单的Base64编码),基于HTTPS的客户端验证(采用证书验证),基于表单验证(通过表单提交的信息,自己定制验证方式)等;而通过验证后的用户信息可以通过Servlet的request对象的getUserPrincipal()方法来获得。在这里我们就不多做介绍。相关的信息可以查阅JBoss及Servlet的文档。 

    5. 小结
 
    单点登陆(SSO)是一个很大的议题,在本文中笔者只是简单地通过对单点登陆(SSO)的实现原理和Josso在JBoss环境下的实施的介绍,让读者在一个侧面对单点登陆(SSO)有一定认识。

分享到:
评论

相关推荐

    CAS实现sso单点登录原理

    "CAS实现sso单点登录原理" CAS(Central Authentication Service)是Yale大学发起的一个企业级的、开源的项目,旨在为Web应用系统提供一种可靠的单点登录解决方法(属于Web SSO)。CAS开始于2001年,并在2004年12月...

    基于Java EE的单点登录技术研究与实现.zip

    总的来说,基于Java EE的单点登录技术研究与实现涉及到网络认证协议、安全性设计、应用服务器配置等多个方面,对于提高企业应用系统的易用性和安全性具有重要意义。在实际项目中,开发者需要根据具体需求选择合适的...

    SSO CAS 单点登录实例SSOAuth+SSOWebDemo1+SSOWebDemo2.zip

    单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 较大的企业内部,一般都有很多的...

    JBoss Application Server4.2 Clustering_Guide

    探讨了如何在集群环境下实现单点登录(SSO),简化用户认证流程的同时提高安全性。 **7.4 集群化 Singleton 服务** 这部分内容讨论了如何在集群环境中部署和管理 Singleton 类型的服务,包括 HASingleton Deployer ...

    单点登录分析报告.pdf

    单点登录(Single Sign-On, SSO)是一种网络身份验证技术,允许用户通过一次登录就能访问多个相互关联的应用系统,而无需多次输入凭证。本文主要分析两种常见的SSO实现框架——JOSSO(Java Open Single Sign-On)和...

    集成框架中使用CAS实现单点登录技术方案.pdf

    ### 单点登录(SSO)技术 单点登录是指用户仅需要一次身份验证,就可以访问多个不同的服务。这是通过集中式身份认证服务器来实现的,它为多个应用系统提供认证服务。 ### CAS(Central Authentication Service) ...

    teamcenter8.0版本LDAP集成单点登陆

    Teamcenter的单点登录(Single Sign-On, SSO)架构基于LDAP(轻量级目录访问协议)和可能的其他目录服务,如Active Directory或Novell。这种架构的核心是Teamcenter安全代理,它与安全服务进行通信,确保用户身份的...

    jbossportal-admin

    - **单点登录(SSO)支持:** 如果系统启用了SSO功能,则会通过特定的方式进行登录处理。 #### 七、登录页面处理逻辑 - **JavaScript脚本:** 当用户点击登录链接时,可能会弹出模态框(modal),或者直接跳转到...

    JBoss Portal Server Development

    第6章和第7章可能涉及到单点登录(Single Sign-On, SSO)和安全性设置,确保用户在访问多个系统时只需要一次登录,同时保护门户免受潜在的安全威胁。 第8章可能会讲解Google小部件的集成,如何将Google的服务如日历...

    CAS-Server-Client单点登录demo

    总之,CAS-Server-Client单点登录demo提供了一个实践SSO功能的平台,帮助开发者理解如何在不同应用间实现统一身份验证。通过对CAS服务器和客户端的配置,以及在Apache Tomcat上进行测试,你可以深入掌握SSO的工作...

    CAS SSO

    **CAS SSO(Central Authentication Service 单点登录)** CAS 是一个开源的身份验证框架,它提供了基于 Web 的单点登录(Single Sign-On, SSO)功能。SSO 允许用户在一次登录后访问多个相互信任的应用系统,而无需...

    keycloak-15.1.0 三方权限认证工具,支持sso等

    在本文中,我们将深入探讨Keycloak的功能、如何使用它支持单点登录(SSO)以及它在IT环境中的重要性。 Keycloak的核心功能包括: 1. **身份验证**:Keycloak允许用户通过用户名和密码、社交账户或其他认证方式(如...

    SAML v2 and XACML v2 Integration

    SAML v2版本提供了更强大的功能和改进的安全性,允许服务提供者和服务消费者之间的信任关系建立,从而实现单点登录(Single Sign-On, SSO)和其他高级安全特性。在JBoss平台上,SAML v2被广泛应用于身份管理解决方案...

    lifery6.1+cas初始化环境搭建及门户解决方案

    本方案的目标是将kjdp的工作流待办任务及业务对象查看功能集成到Liferay门户,并实现单点登录(SSO)功能。这不仅可以提高用户体验,还可以简化用户的登录流程,提高工作效率。 **1.2 安装** **1.2.1 版本说明** 本...

    开放源码Portal产品介绍

    3. **Liferay Portal**:Liferay完全支持JSR-168和WSRP,可在多种应用服务器和数据库系统上运行,提供了基于CAS的单点登录功能。它的特点是跨平台、多语言支持以及强大的社区支持。 4. **eXo Platform**:基于JSF...

    IT项目架构与流程

    CAS(Central Authentication Service)是耶鲁大学开发的一个开放源代码单点登录(SSO)系统,它允许用户通过一次登录就能访问多个应用系统。在项目中,CAS可以提高用户体验,减少用户记住多个账户和密码的负担,...

    关于session丢失问题

    6. **使用单点登录(SSO)**:对于大型企业级应用,可以采用单点登录系统,用户只需要登录一次,即可在多个子系统间自由切换,减少Session丢失的问题。 7. **考虑无状态设计**:在微服务架构中,推动服务无状态化,...

    keycloak-server:非 jboss 服务器的 Keycloak 服务器(AS 7、EAP、Wildfly)

    Keycloak 是一个开源的身份管理和访问控制服务,它提供身份验证、单点登录(SSO)以及基于OAuth2、OpenID Connect等标准的安全API。Keycloak的服务器组件可以在多种不同的应用服务器上运行,包括JBoss AS 7、JBoss ...

    谈谈业务中使用分布式的场景1

    当应用服务器集群化时,可以使用SSO(Single Sign-On)单点登录,通过加密cookie实现用户身份的跨服务器验证。此外,Tomcat和JBoss提供了session复制功能,但会导致性能下降和广播风暴。为避免这些问题,可以使用...

Global site tag (gtag.js) - Google Analytics