精华内容
下载资源
问答
  • 公司子系统整合统一登录的架构

    千次阅读 2018-12-27 11:49:13
    在安全管理系统项目中加入一个整合的jar包,其实就是一个拦截器,拦截所有请求,看请求中是否有携带登录标识(此标识是包含统一登录端生成的一个唯一ID),如果没有在,则从定向到统一登录的页面。 然后在子系统的...

    如下图是公司的统一登录界面:

    众多子系统的登录页面不再使用,所有登录走统一登录页面,登录时选择你要登录的系统,这里以我改造的安全管理系统为例。

    在安全管理系统项目中加入一个整合的jar包,其实就是一个拦截器,拦截所有请求,看请求中是否有携带登录标识(此标识是包含统一登录端生成的一个唯一ID),如果没有在,则从定向到统一登录的页面。

    然后在子系统的web.xml中配置这个拦截器生效。

    之后每次从统一登录页面登录的时候,选择一个子系统,输入用户名和密码(用户名和密码在前台加密,同时携带的还有统一登录端生成的唯一UUID,还有一个status字段,也是一个UUID),然后(1)进入子系统的AuthoFilter拦截器,验证请求中是否有携带指定的标识,如果没有提示原因,如果有执行逻辑,拿着统一登录端的几个参数和子系统本地初始化的几个参数去(2-1)请求统一登录服务

    进行授权,在统一登录端会进行一系列验证(用户名,密码,PSID,子系统等),最后再(2-2)跳到子系统

    再次进入子系统的过滤器,进行验证,这次code不为null,所以再去(3-1)统一登录端获取token,

    服务端根据子系统的唯一标识和username,查找token,找不到则生成一个token,然后(3-2)响应给子系统

    然后子系统拿到token,执行下一个过滤器。下一个过滤器会再次去验证用户名和密码

    注意:这次不是去统一登录端去验证,而是去统一登录端上次保存的redis库中去验证。验证成功进行后续的系统操作。

    这种就是要部署一个认证中心。

    认证中心就是一个专门负责处理登录请求的独立的 Web 服务。

    用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 Token 写入 Cookie。(注意这个 Cookie 是认证中心的,应用系统是访问不到的。)

    应用系统检查当前请求有没有 Token,如果没有,说明用户在当前系统中尚未登录,那么就将页面跳转至认证中心。由于这个操作会将认证中心的 Cookie 自动带过去,因此,认证中心能够根据 Cookie 知道用户是否已经登录过了。如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录,如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标 URL ,并在跳转前生成一个 Token,拼接在目标 URL 的后面,回传给目标应用系统。

    应用系统拿到 Token 之后,还需要向认证中心确认下 Token 的合法性,防止用户伪造。确认无误后,应用系统记录用户的登录状态,并将 Token 写入 Cookie,然后给本次访问放行。(注意这个 Cookie 是当前应用系统的,其他应用系统是访问不到的。)当用户再次访问当前应用系统时,就会自动带上这个 Token,应用系统验证 Token 发现用户已登录,于是就不会有认证中心什么事了。

    这里顺便介绍两款认证中心的开源实现:

    • Apereo CAS 是一个企业级单点登录系统,其中 CAS 的意思是”Central Authentication Service“。它最初是耶鲁大学实验室的项目,后来转让给了 JASIG 组织,项目更名为 JASIG CAS,后来该组织并入了Apereo 基金会,项目也随之更名为 Apereo CAS。

    • XXL-SSO 是一个简易的单点登录系统,由大众点评工程师许雪里个人开发,代码比较简单,没有做安全控制,因而不推荐直接应用在项目中,这里列出来仅供参考。

    总结:此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法。

     

    常规的是这种步骤:

    1. 用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数

    2. sso认证中心发现用户未登录,将用户引导至登录页面

    3. 用户输入用户名密码提交登录申请

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

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

    6. 系统1拿到令牌,去sso认证中心校验令牌是否有效

    7. sso认证中心校验令牌,返回有效,注册系统1

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

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

    10. 系统2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数

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

    12. 系统2拿到令牌,去sso认证中心校验令牌是否有效

    13. sso认证中心校验令牌,返回有效,注册系统2

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

     

     

     

     

     

    展开全文
  • OAuth(Open Authorization,... OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。 OpenID是一个去中心化的网上身份认证系统。对于支持OpenID的网站,用户不需要记住像用户名和密码这样...

    OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全、开放及简单的标准,通过这个标准,第三方无需知道用户的账号和密码,就可获取到用户的授权信息。
    OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。
    OpenID是一个去中心化的网上身份认证系统。对于支持OpenID的网站,用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是,他们只需要预先在一个作为OpenID身份提供者(identity provider, IdP)的网站上注册。OpenID是去中心化的,任何网站都可以使用OpenID来作为用户登录的一种方式,任何网站也都可以作为OpenID身份提供者。OpenID既解决了问题而又不需要依赖于中心性的网站来确认数字身份。

    老系统的现状

    每个老系统都起源自新系统,用的久了,就慢慢变老了!
    刚开始设计网站的时候,仅仅是一个用户登录;然后加入了角色,最后加入了鉴权,后来又增加了限次密码失败,后来的后来,再增加白名单,最后,增加了二次验证…,最后的最后,加入了第三方的账号登录。 等等,好像没有最后,还有开发api呢,还有许多功能呢… …
    是时候上统一登录授权了吧,最好符合Oauth2.0… …
    Oauth的授权四模式:

    • 授权码模式(authorization code)
      是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。
    • 简化模式(implicit)
      不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。
    • 密码模式(resource owner password credentials)
      用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。
    • 客户端模式(client credentials)
      指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

    .net core的支持

    ASP.NET Core 标识是支持用户界面(UI)登录功能的成员资格系统。 用户可以创建一个具有存储在标识中的登录信息的帐户,也可以使用外部登录提供程序。 支持的外部登录提供程序包括Facebook、Google、Microsoft 帐户和 Twitter。
    若要保护 web Api 和 Spa,请使用IdentityServer4。 IdentityServer4 是 ASP.NET Core 3.0 的 OpenID Connect 和 OAuth 2.0 framework。 IdentityServer4 支持以下安全功能:

    1. 身份验证即服务 (AaaS)
    2. 跨多个应用程序类型的单一登录/注销 (SSO)
    3. API 的访问控制
    4. Federation Gateway

    再来看看IdentityServer4

    在这里插入图片描述
    OpenID Connect和OAuth 2.0非常相似-实际上,OpenID Connect是OAuth 2.0的扩展。身份验证和API访问这两个基本的安全问题被组合成一个协议-通常只需一次往返于安全令牌服务。

    我们相信OpenID Connect和OAuth 2.0的结合是在可预见的将来保护现代应用程序的最佳方法。IdentityServer4是这两个协议的实现,并且经过高度优化,可以解决当今移动,本机和Web应用程序中的典型安全问题。
    实际上,按照教程,花费2个小时,你就可以手撸一个登录服务了。
    搞定了登录,但是授权怎么办呢?
    相信撸到这一步的你也会有同样的困惑。

    拆分设计

    在这里插入图片描述
    先理解下概念:

    • 授权(authorization):授权,批准;批准(或授权)的证书;
    • 认证(authentication):认证;身份验证;证明,鉴定;密押。
    • 资源(Resource),在系统中定义的第一件事就是要保护的资源。这可能是您的用户的身份信息,例如个人资料数据或电子邮件地址,或对API的访问,id要求资源必须有 openid。
      因此结合途中的5,6,7步骤,所做的下一步授权,应该结合资源服务进行设计。
      当然可以设计用户中心,资源中心等分开设计,主要是综合业务的需求。

    总结

    撸一个登录服务很easy,但想设计一套综合旧项目的统一登录认证鉴权授权平台是比较复杂的过程,不可能是几天搞定。但只要你分析清除每个环节,逐步实现,当可在1人月内完成设计和编码。

    展开全文
  • 一、单点登录(SSO,Single Sign On)整合目前计划接入统一门户的所有业务系统均为基于JavaEE技术的B/S架构系统。由于统一门户的单点登录技术选用的是JA-SIG组织开发的Cas Server,故为了与Cas Server进行无缝整合,...


    一、单点登录(SSO,Single Sign On)整合
    目前计划接入统一门户的所有业务系统均为基于JavaEE技术的B/S架构系统。由于统一门户的单点登录技术选用的是JA-SIG组织开发的Cas Server,故为了与Cas Server进行无缝整合,各业务系统选用的技术依然是由JA-SIG组织开发的Cas Client。
    根据各业务系统服务端技术架构的不同,现提供如下2种整合方式:
    1. 在web.xml中配置4个过滤器
    此方式适用于所有JavaWeb应用。
    1) 所需jar
    cas-client-core-3.3.3.jar
    slf4j-api-1.7.1.jar

    2) 配置4个过滤器(其中两个可选)

    <filter>
        <filter-name>CAS Authentication Filter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <param-value>http://CAS_SERVER/cas-server/login</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://CAS_CLIENT</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CAS Authentication Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    说明:
    <1> casServerLoginUrl - CasServer的地址。其中cas-server为CasServer的应用名,对于所有接入统一门户的系统来说,其值应为ac。例如:http://172.16.49.243:7001/ac/login
    <2> serverName - 本业务系统的IP+端口。例如:http://localhost:8080
    <3> 当在CasServer端验证完毕后,CasServer会重定向到业务系统,重定向的URL是serverName+业务系统的名称。例如:http://localhost:8080/bxloan。业务系统需为此URL映射提供服务端处理逻辑,以便接收由CasServer认证后的用户工号。
    <4> 配置serverName后,由CasServer认证后的重定向URL只能是系统根路径。若需自定义认证后的重定向URL,需要删除serverName的init-param,改用service。在service中指定认证后的重定向URL。例如:http://localhost:8080/bxloan/cas
    <5> 如想要认证过程中放过某些url(如webservices,/services/*),可以使用ignorePattern或ignoreUrlPatternType。

    <!-- 使用CAS 2.0协议校验票据 -->
    <filter>
        <filter-name>CAS Validation Filter</filter-name>
            <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>http://CAS_SERVER/cas-server</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://CAS_CLIENT</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CAS Validation Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    说明:
    <1> casServerUrlPrefix - CasServer的URL前缀。对于统一门户来说,应为:http://172.16.49.243:7001/ac
    <2> serverName -本业务系统的IP+端口。例如:http://localhost:8080。此URL会传给CAS服务端用以票据校验。

    <!-- 包装了HttpServletRequest, 使得可以通过getRemoteUser()和getPrincipal()可以返回CAS相关入口 -->
    <filter>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    说明:
    <1> 可选配置。
    <2> 配置后,可以使用javax.servlet.http.HttpServletRequest.getRemoteUser() 来获取到CasServer服务端发送过来的认证后的用户工号。

    <!-- 在ThreadLocal中放置应用中部分功能需要的访问的断言 -->
    <filter>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    说明:
    <1> 可选配置。
    <2> 配置后,可以从与本地线程绑定的Assertion中获取用户。获取方法:AssertionHolder.getAssertion()
    .getPrincipal().getName()。

    2. 与Spring+Shiro的配置
    此方式适用于项目中已包含Spring+Shiro的项目。

    1) Maven配置
    Shiro 1.2.0之后的版本提供了与Cas Client的整合。

    <!-- SECURITY begin -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>${shiro.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-ehcache</artifactId>
        <version>${shiro.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-quartz</artifactId>
        <version>${shiro.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-cas</artifactId>
        <version>${shiro.version}</version>
    </dependency>
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
        <version>${ehcache.version}</version>
    </dependency>
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>${commons-codec.version}</version>
    </dependency>
    <!-- SECURITY end -->

    2) web.xml
    <1> 让Spring加载shiro配置文件

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath*:applicationContext.xml
            classpath*:applicationContext-shiro.xml
        </param-value>
    </context-param>

    <2> 以Spring的方式配置Shiro过滤器

    <filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <init-param>
            <param-name>targetFilterLifecycle</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    3) applicationContext-shiro.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
        default-lazy-init="true">
     
        <description>Shiro安全配置</description>
     
        <!-- Shiro的Web过滤器 -->
        <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
            <property name="securityManager" ref="securityManager" />
            <property name="loginUrl" value="${shiro.loginUrl}" />
            <property name="successUrl" value="${shiro.successUrl}" />
            <property name="filters">
                <map>
                    <entry key="cas" value-ref="casFilter" />
                </map>
            </property>
            <property name="filterChainDefinitions">
                <value>
                    /static/** = anon
                    /cas = cas
                    /** = user
                </value>
            </property>
        </bean>
     
        <!-- 安全管理器 -->
        <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
            <property name="realm" ref="casRealm" />
            <property name="cacheManager" ref="shiroEhcacheManager" />
            <property name="subjectFactory" ref="casSubjectFactory" />
        </bean>
     
        <bean id="casRealm" class="com.coamctech.portal.web.security.MyCasRealm" depends-on="userDao">
            <property name="userMngService" ref="userMngService" />
            <property name="casServerUrlPrefix" value="${cas.casServerUrlPrefix}" />
            <property name="casService" value="${cas.casService}" />
        </bean>
     
        <!-- 用户授权信息Cache, 采用EhCache -->
        <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
            <property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml" />
        </bean>
     
        <bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory" />
     
        <bean id="casFilter" class="com.coamctech.portal.web.security.MyCasFilter" />
     
        <!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) -->
        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager" />
            <property name="arguments" ref="securityManager" />
        </bean>
     
        <!-- Shiro生命周期处理器 -->
        <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
    </beans>

    4) applicatoin.properties
    #cas settings
    ac.host=http://172.16.49.243:7001
    local.host=http://localhost:8080

    #shiro-cas settings
    shiro.loginUrl=${cas.casServerUrlPrefix}?service=${cas.casService}
    shiro.successUrl=/
    cas.casServerUrlPrefix=${ac.host}/ac
    cas.casService=${local.host}/portal/cas
    此为applicationContext-shiro.xml中占位符的内容。
    在applicatonContext-shiro中,有两个绿色的bean不是来自Shiro或Spring。这两个bean分别对框架提供的默认功能提供了一些扩展。以下内容会涉及Shiro的知识,请先了解Shiro。
    5) 扩展CasRealm

    package com.coamctech.portal.web.security;
     
    import java.util.List;
    import java.util.Map;
     
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.AuthenticationInfo;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authc.SimpleAuthenticationInfo;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.cas.CasRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.apache.shiro.subject.SimplePrincipalCollection;
    import org.apache.shiro.util.CollectionUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.BeanUtils;
     
    import com.coamctech.portal.entity.User;
    import com.coamctech.portal.service.usermng.UserMngService;
     
    public class MyCasRealm extends CasRealm {
     
        private static final Logger logger = LoggerFactory.getLogger(MyCasRealm.class);
     
        private UserMngService userMngService;
     
        public void setUserMngService(UserMngService userMngService) {
            this.userMngService = userMngService;
        }
     
        /**
         * 认证
         */
        @SuppressWarnings("unchecked")
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            SimpleAuthenticationInfo info = (SimpleAuthenticationInfo) super.doGetAuthenticationInfo(token);
            PrincipalCollection principalCollection = info.getPrincipals();
            List<Object> listPrincipals = principalCollection.asList();
            
            String username = (String) listPrincipals.get(0);
            logger.info("cas-username:" + username);
            
            Map<String, String> attributes = (Map<String, String>) listPrincipals.get(1);
            
            ShiroUser shiroUser = getShiroUser(username);
            
            List<Object> shiroPrincipals = CollectionUtils.asList(shiroUser, attributes);
            principalCollection = new SimplePrincipalCollection(shiroPrincipals, getName());
            info.setPrincipals(principalCollection);
            
            return info;
        }
        
        private ShiroUser getShiroUser(String username) {
            User user = userMngService.getByUsername(username);
            ShiroUser shiroUser = new ShiroUser();
            BeanUtils.copyProperties(user, shiroUser);
            return shiroUser;
        }
     
        /**
         * 鉴权
         */
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
            return super.doGetAuthorizationInfo(principals);
        }
     
    }

    Shiro的Realm用来获取用户相关信息。CasRealm的doGetAuthenticationInfo()返回的认证信息(AuthenticationInfo)中只保存了由CasServer传过来的用户工号。那么,我们在业务代码(或许是某个Controller)中通过SecurityUtils.getSubject().getPrincipal() 获取到的就只是这个工号。
    如果想在每次调用 SecurityUtils.getSubject().getPrincipal() 时获取完整的当前用户信息,则需要在获取到用户工号后,根据用户工号查询业务系统中的用户表,加载用户相关信息,然后再保存至认证信息(AuthenticationInfo)中。
    也即MyCasRealm重写doGetAuthenticationInfo() 中完成的过程。

    6) 扩展CasFilter

    package com.coamctech.portal.web.security;
     
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
     
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.cas.CasFilter;
     
    public class MyCasFilter extends CasFilter {
     
        public static final String ERROR_KEY_ATTRIBUTE_NAME = MyCasFilter.class.getName() + ".casShiroLoginFailure";
     
        @Override
        protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException ae,
                ServletRequest request, ServletResponse response) {
            String className = ae.getClass().getName();
            request.setAttribute(ERROR_KEY_ATTRIBUTE_NAME, className);
            return true;
        }
        
    }

    Shiro在认证过程中如果出现异常,则会将异常交给开发人员自己处理。CasFilter在onLoginFailure()中的默认处理是,重定向到failureUrl,而failureUrl则指向某个页面。但遗憾的,是在failureUrl指向的页面中,并不能获取到异常的详细信息(因为Shiro并没把异常信息放进去,所以我们当然获取不到)。从而不能根据异常的类型,显示不同的信息。
    为此,MyCasFilter重写了onLoginFailure() ,将异常信息放在request scope中,最后返回return true表示过滤链会继续执行。即在applicationContext-shiro.xml配置的cas.casService(http://localhost:8080/portal/cas)会继续执行。那么,我们要在业务代码中加入对/cas的映射,从request scope取出异常名,然后根据不同的异常名,做不同的逻辑处理。
    二、单点登出(SSO,Single Sign Out)
    由于所有业务集成接入统一门户后,即只有一个登入入口,那么也需要只有一个登出出口。故在统一门户或各业务系统(如果有需要)中需要提供单点登出功能。
    JA-SIG Cas Client已提供了单点登出功能,实现方式只是在web.xml这配置1个过滤器和1个监听器就可以了。

    <!-- CAS Single Sign Out -->
    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener
        </listener-class>
    </listener>
     
    <filter>
        <filter-name>singleSignOutFilter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>singleSignOutFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    请使SingleSignOutFilter先与其它过滤器执行。
    三、业务系统的进一步改造
    业务系统的进一步改造主要有以下三点:

    1. 提供可靠的安全机制,不可让用户认证绕过统一门户
    在统一门户中,用户登入后,会根据用户的权限列出能够访问的系统。通常,用户不会具有所有系统的访问权限。
    由于各个业务系统都会接入认证中心,那么就可能会出现绕过统一门户的权限限制,直接登入业务系统的情况。一个可能的情境是:业务系统接入认证中心(ac)后,用户先在ac完成认证,然后直接输入业务系统URL,根据CAS SSO的机制,此时依然可直接登录。
    因此,业务系统必须加入判断,判断用户登入时必须是从统一门户登录过来的才可以,否则不予登入。
    2. 屏蔽登录入口,用户和机构维护功能
    统一门户系统启用后,所有接入门户的业务系统登录入口都要统一到门户系统。因此,各业务系统无需也不能再提供系统登录入口。
    另外,由于用户和机构数据也集中在门户统一维护,业务系统还需屏蔽掉用户和机构维护功能。或者保留维护功能,但由统一门户发送过来的字段不可修改。
    3. 提供WebServices接口,用以与统一门户同步用户和机构数据
    统一门户系统启用后,所有的用户和机构数据都在统一门户系统中进行维护。所有业务系统中的用户和机构数据需要与统一门户系统保持统一。
    为此各业务系统必须提供WebServices接口供统一门户系统调用,用以当统一门户系统中对用户和机构数据进行维护后,能够调用各业务系统的WebServices接口完成数据同步。
    各业务系统提供的WebServices接口在接收到统一门户发送过来的用户或机构后,需根据自己系统中的用户表和机构表结构,组织好数据,进行保存。同步接口定义如下:

    1). 同步用户:
    public String syncUser(String jsonUser, String operation)

    jsonUser为门户的用户对象的json形式,各字段为:
    private Integer id;
    private String loginName;// 登录账号(员工工号)
    private String password; // 密码
    private String name; // 用户姓名
    private String mobile; // 手机号
    private String address; // 地址
    private String email; // 邮箱
    private String state; // 用户状态:1-使用,2-禁用
    private String idCard; // 身份证
    private String phone; // 固定电话
    private Integer createPerson; // 创建人
    private Date createDate; // 创建日期
    private Date expireDate; // 失效时间
    private String allowIps; // 允许ips
    private Integer lastModifiedUser; // 最后修改人
    private Date lastModifiedDate; // 最后修改日期
    private Date lastLoginDate; // 最后登录日期
    private String lastLoginIp; // 最后登录IP
    private Integer tenantId; // 租户ID
    private String userLevel; // 用户级别
    private Integer orgId; // 机构ID

    operation: save-保存或新增,delete-删除

    返回值为json串,结构如下
    private Boolean success; // 是否成功:成功-true,失败-false
    private String msg; // 消息:"xx系统用户同步成功","小贷系统用户同步失败"
    private Object data; // 数据
    例如:{success: true,msg: "xx系统用户同步成功!", data: null}

    2.同步机构
    public String syncOrg(String jsonOrg, String operation)

    jsonOrg为统一门户机构对象的json形式:
    private Long id; // 机构ID
    private Long parentId; // 上级机构
    private String name; // 名称
    private String manager; // 负责人
    private String memo; // 备注
    private String code; // 代码
    private String type; // 机构类型:1-总公司,2-子公司,3-分公司,4-部门
    private String state; // 状态:1-使用,2-禁用
    private Long tenantId; // 租户ID
    private Long createPerson; // 创建人
    private Date createDate; // 创建时间
    private Long lastModifiedUser; // 最近修改人
    private Date lastModifiedDate; // 最近修改时间
    private String bank; // 开户行名称
    private String accountNumber; // 开户行账号
    private Date foundingDate; // 成立时间
    private Double registeredCapital; // 注册资本
    private String phone; // 联系电话
    private String formerName; // 曾用名
    private String address; // 地址
    private String zipcode; // 邮编
    private String businessLicense;//营业执照号

    operation: save-保存或新增,delete-删除

    返回值为json串,结构如下
    private Boolean success; // 是否成功:成功-true,失败-false
    private String msg; // 消息:"xx系统机构同步成功!" "小贷系统机构同步失败!"
    private Object data; // 数据
    例如:{success: true, msg: "xx系统机构同步成功!", data: null}
    参考资料
    [1] https://wiki.jasig.org/display/CASC/CAS+Client+for+Java+3.1
    [2] https://wiki.jasig.org/display/CASC/Configuring+the+Jasig+CAS+Client+for+Java+in+the+web.xml
    [3] http://shiro.apache.org/cas.html
    [4] http://jinnianshilongnian.iteye.com/blog/2036730
    [5] https://wiki.jasig.org/display/CASC/Configuring+Single+Sign+Out
    [6] http://jasig.github.io/cas/4.0.0/index.html

    转载于:https://www.cnblogs.com/xyhero/p/9348654.html

    展开全文
  • OA系统整合与单点登录(SSO)的区别

    千次阅读 2019-09-19 16:52:51
    在对OA系统和其他应用系统进行集成时,使用技术手段典型的包括应用系统整合和单点登录。在这里所指的系统整合是将个应用系统整合到一个独立的应用系统中;单点登录(SSO)英文全称Single Sign On,在个应用系统中...

    在对OA系统和其他应用系统进行集成时,使用技术手段典型的包括应用系统整合和单点登录。在这里所指的系统整合是将多个应用系统整合到一个独立的应用系统中;单点登录(SSO)英文全称Single Sign On,在多个应用系统中用户只需要在任何一个应用中登录,就可以访问所有相互信任的应用系统。
    系统整合和单点登录都只需要用户进行一次登录认证就可以访问不同的模块/系统,但二者区别如下:
    1、系统整合是将多个系统整合为一个系统,而单点登录是多个应用系统。
    2、整合为一个系统可以实现统一的资源管理、权限管理、任务提醒等,但开发的工作量比较大,一般采用以某个系统为主,其他系统为辅的做法,如:在OA系统中加入CRM和ERP的部分功能,将OA和网站放在一个系统中等。
    3、单点登录的集成工作量非常小,系统之间的账号需统一同步进行处理,多系统之间相互信任,使用票据进行身份的传递,各系统单独处理自己的权限。
    系统之间的数据交换和信息的传递一般不属于单点登录的范围。
    在这里插入图片描述
    单点登录的优势
    1、一次登录认证,多个应用系统(包括不同开发语言开发的系统)中通行,针对多个系统,方便了用户和管理员。
    2、相对于系统整合,开发工作量非常少,降低了系统之间的耦合度。
    在这里插入图片描述
    OA系统和其他系统典型的单点登录应用
    1、IM(即时通讯软件,如:spark、腾讯的RTX等)和OA单点登录。用户只需要登录IM客户端软件,无需重新登录认证可以从IM可以直接进入OA系统,IM可以从OA系统中获取当前用户相关的任务提醒信息。
    2、OA系统与ERP、CRM等应用系统之间的单点登录
    3、OA系统与网站之间的单点登录。
    在这里插入图片描述

    展开全文
  • 统一登录门户系统

    千次阅读 2020-04-04 21:02:19
    为了推进整合信息共享,破除各系统之间的壁垒,首先要建设的就是统一登录门户系统。 常见的统一登录要求,还是基于一个统一的入口,由统一登录入口完成登录后,可以自由访问其他系统,而其他系统的用户登录应跳转到...
  • 多系统单点登录(CAS整合

    千次阅读 2016-08-31 21:06:59
    声明:本文章仅是本人记录作以后备用,不建议作为学习cas的参考文章,毕竟每人的思路不一样...服务器端作为统一认证的地方,所以各个系统的用户要统一。 认证的方式有3种,本人采用JDBC的认证方式(AbstractJdbcUsernam
  • 前言说明一下需求,最近做的平台,有张用户表,怎么根据不同用户登录去执行自己查询不同数据库并实现认证的业务逻辑呢?博主参与的产品开发进入阶段性完成期,有时间将过程中遇到的相关问题一一总结。总结实现本...
  • Shiro整合SSO单点登录系统

    万次阅读 2018-10-23 19:52:50
    本文的单点登录不是cas的,是公司...salt(盐)等信息,如果能查询到该用户,则说明单点登录成功并且在当前系统成功有权避开用户名密码的填写,完成系统的单点登录。 第一次接触shiro框架代理的登录,让我去改造成...
  • 系统架构改进--多系统用户整合

    千次阅读 2017-12-12 11:16:31
    单WEB应用登录登出实现原理首先,我们来分析下单Web应用系统登录登出的实现机理。 Web系统登录登出功能,通常属于系统安全管理模块的一部分。登录,意味着用户与系统之间的一次会话开始,登出,意味着本次会话的...
  • 最近特别多人问我关于如何用liferay整合多个不相关的系统,其中整合其中一个必须面对的问题就是每个系统都有自己的用户管理,所以必须让系统的用户统一管理起来,我的提议就是用LDAP,但是一般这个方案很公司...
  • 动网论坛多系统整合Api接口程序 PDO通行接口开发人员参考规范1为您的系统开发支持动网论坛系统的整合接口 动网论坛的整合接口基于动易、动网、oblog三方联合制定的统一接口规范开发,任意系统只要提供并开发符合该...
  • boss要我把公司目前用的ecshop discuz论坛和帝国cms系统的用户信息整合到一起,实现在其中一个系统登陆和注销后,在其它几个系统也同步登录和注销。我上网查了查,这就是所谓的sso单点登录啊-。-。  想要自己实现...
  • X2.5论坛和Anwsion问答这三个程序整合在一起,实现用户统一管理,不需要重复注册账号,登录一个账号后就实现同步登录其它两个程序,实现博客、论坛和问答三者有机融合。 为了充分利用论坛、博客、问答等不同程序的...
  • 新老系统迁移及整合方案

    千次阅读 2018-10-17 17:23:58
    另外,新开发的系统还存在与其他一些应用系统,例如,企业信用联网应用系统、企业登记子网站、外资登记子网站等系统进行整合使之成为一个相互连通的系统。本章将针对新老系统迁移和整合提出解决方案。   1.1 新...
  • 一洽客服平台  作为企业来讲,每天面临着繁重的短信、电子邮件,似乎已经是习以为常的事了。导致的结果就是客户已经习惯了...一洽在线客服系统整合多渠道,企业定制化,为企业定制最适合其发展的客服系统
  • 之前简单的写过一篇的用户注册整合ucenter...现在很开源的cms系统,博客系统,论坛系统都自带整合ucenter的插件,但是 如果是自己开发的网站需要和discuz或者ecshop同步登录的话,就需要把自己的完网站整合上ucenter
  • 一个大平台整合多个子平台,子平台不在一个服务器,没有父域全都是IP访问,如何实现大平台登录,访问子平台不需要再次登录,子平台也有自己单独的登录功能,长时间操作session超时如何判断应该返回大平台登录页还是...
  • Confluence与Jira整合统一用户管理

    千次阅读 2012-01-12 23:13:06
    Confluence与Jira整合统一用户管理 博客分类: JAVA 配置管理MySQLHSQLDBWebXML 说到Confluence与Jira的整合,首先就得提到用户的整合,有两种方式: 1、通过统一使用外部数据库 2、通过LDAP服务器...
  • MongoDB log4j 日志整合统一管理

    千次阅读 2015-03-21 20:16:57
    而这个储存日志的数据库目前最适合的还是mongodb,一是因为它轻便、简单,与log4j整合方便,对系统的侵入性低。二是因为它与大型的关系型数据库相比有不少优势,比如查询快速、储存结构(json)利于扩展、免费等
  • 平台统一用户系统设计

    千次阅读 2017-08-12 01:35:24
    现在越来越的产品都实现了在不同平台上的功能支持。比如原来的 App 为了微信上的流量,开发了小程序。原来只做微信公众号的,后来为了更好的体验开发了 App 等等。这里面临用户账号迁移的问题。对于用户来讲,希望...
  • 统一用户登陆系统

    千次阅读 2013-06-07 13:55:24
    SSO的定义是在个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。   技术实现机制:  当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录...
  • 全局异常捕获处理及参数校验 一,为什么要用全局异常处理? 在日常开发中,为了不抛出...为解决该问题,计划将Controller层异常信息统一封装处理,且能区分对待Controller层方法返回给前端的String、Map、JSONObject...
  • 绝对完全跨域统一单点登录登出

    万次阅读 热门讨论 2018-05-06 16:38:17
    应用场景:系统下同属于一个用户,当用户登录了web1系统,那么访问web2,web3. . . . 时候,用户就无需再次登录。如:淘宝与天猫,登出也如此,一个系统登出,其他系统登录也随之失效,这就是统一单点登录登出...
  • 目的:设计开发一个 “访问权限管理中心系统” ,能够管理所有ASP.NET 应用程序的访问权限,统一用户登录界面,用户登录成功后可访问已授权的全部ASP.NET 应用程序 (单点登录), 对现有的 ASP.NE

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 131,640
精华内容 52,656
关键字:

多系统整合统一登录