文档中心

Java应用接入

SSO针对J2EE环境,提供接入的客户端Jar包,该客户端完全实现了BingoSSO协议,并对客户端调用接口进行了封装,以便提供更简便的接入接口。

引入Jar包

  • 通过Maven引用

如果你是Maven管理依赖,在Pom.xml文件中添加以下依赖即可;

<dependency>
    <groupId>bingo.sso</groupId>
    <artifactId>bingo-sso-client-web</artifactId>
    <version>2.3.3</version>
</dependency>
<dependency>
    <groupId>bingo.oauth</groupId>
    <artifactId>bingo-oauth-resource-server</artifactId>
    <version>1.2.1</version>
</dependency>
<dependency>
    <groupId>bingo.oauth</groupId>
    <artifactId>bingo-oauth-client-core</artifactId>
    <version>1.2.1</version>
</dependency>
  • 手工添加引用

系统依赖的包主要有三个:

  • bingo-sso-client-web-2.3.3.jar
  • bingo-oauth-resource-server-1.2.1.jar
  • bingo-oauth-client-core-1.2.1.jar

其它引用的包有jackson-mapper-asl-1.9.2等,引用关系如下:
包引用关系

所有的包已放在demo工程的lib目录,按以下方式依次将相关的包引用工程:
进入工程的属性的Java build path->选择外部JARS(add exteernal JARs)
选择外部JARS

选择bingo-sso-client-web-2.3.3.jar
选择bingo-sso-client-web

Servlet配置

在web.xml添加一个servlet用于处理与SSO操作相关的请求,主要的配置项有(其中:http://10.201.76.93:8088/sso 为sso服务器地址):

<servlet>
      <servlet-name>ssoclient</servlet-name>
      <servlet-class>bingo.sso.client.integration.SingleSignOnServlet</servlet-class>
    <init-param>
        <param-name>ssoBaseEndpoint</param-name>
        <param-value>http://10.201.76.93:8088/sso</param-value>
    </init-param>    
    <init-param>
        <param-name>oauthResourceId</param-name>
        <param-value>http://10.201.76.93:8088/sso</param-value>
    </init-param>
    <init-param>
        <param-name>oauthAccessTokenUri</param-name>
        <param-value>http://10.201.76.93:8088/sso/oauth/2/token</param-value>
    </init-param>
    <init-param>
        <param-name>oauthUserAuthorizationUri</param-name>
        <param-value>http://10.201.76.93:8088/sso/oauth/2/authorize</param-value>
    </init-param>
    <init-param>
        <param-name>oauthScope</param-name>
        <param-value>read</param-value>
    </init-param>
	<init-param>
        <param-name>clientId</param-name>
        <param-value>clientId</param-value>
    </init-param>
    <init-param>
        <param-name>clientSecret</param-name>
        <param-value>clientSecret</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>ssoclient</servlet-name>
    <url-pattern>/ssoclient/*</url-pattern>
</servlet-mapping>

Filter配置

通过上面的Servlet配置,已经使工程具有SSO登录的功能了,但系统中尚未定义哪些页面需要经过登录验证,哪些页面是不需要经过登录验证的(如:JS、静态页面等),如果系统中已有这样的过滤器,可以在过滤器中设置需要登录验证的页面跳转到/ssoclient/login页面,如果没有,Demo工程中提供了一个filter样例,该filter的配置如下:

  • ignore-pattern:表示不需SSO验证的Url,一般是一些静态图片、脚本等。
  • login-url:上一步Servlet配置的SSO登录的地址。
<filter>
        <filter-name>ssoFilter</filter-name>
        <filter-class>
            bingo.sso.client.integration.DefaultSecurityFilter
        </filter-class>
        <!-- 可忽略验证的请求 -->
        <init-param>
            <param-name>ignore-pattern</param-name>
            <param-value>|/ssoclient*|/openid*|/images/*|/themes/*|*.css|*.js|*.png|*.jpg|*.gif|*.bmp|/common/*
            </param-value>
        </init-param>
        <!-- 本地SSO中转登录页面 -->
        <init-param>
            <param-name>login-url</param-name>
            <param-value>/ssoclient/login</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>ssoFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

另外需要特别注意,要允许ssoclient/*匿名访问

获取当前用户Id

如果登录的Servlet的是Demo工程中的bingo.sso.client.integration.SingleSignOnServlet,可以使用SsoContext. getCurrentUserId(),获取已登录用户Id。

自定义登录逻辑

如果应用在登录过程中需要增加一些自己的业务处理逻辑(如:创建自己的Session),可以按以下步骤添加:

  1. 参照Demo工程,继承AbstractOAuthSingleSignOnServle这个类,重写storeAuthenticationState,在该方法中调用应用的业务方法。如:
  2. @Override
    protected void storeAuthenticationState(HttpServletRequest req, HttpServletResponse response, Authentication auth)
    {
       //TODO 编写自己的登录逻辑,如:
       SsoContext.signIn(req,auth.getIdentity());
    }
    
  3. 修改web.xml文件中的SSO的Servlet配置类为上一步新建的类

<servlet>
      <servlet-name>ssoclient</servlet-name>
      <servlet-class>bingo.sso.client.integration.SingleSignOnServlet</servlet-class>
</servlet>

支持终端接口调用

手机端通过OAuth协议2.0,调用服务端提供的接口。手机端在SSO登录成功后,由SSO颁发一个用于接口调用的ACCESS_TOKEN,接口调用时,需始终带着该Token,AbstractOAuthAuthenticationProcessingFilter,该Filter为抽象类,提供了一个successfulAuthentication方法,方便第三方应用在Token认证成功后,增加自己的业务处理逻辑,如:实现用户登录,获取用户角色等。Demo工程提供了一个实现样例(bingo.sso.client.integration.OAuth2AuthenticationProcessingFilter),配置如下:

<!-- OAuth资源服务器的配置 -->
<filter>
    <filter-name>oAuth2AuthenticationProcessingFilter</filter-name>
    <filter-class>bingo.sso.client.integration.OAuth2AuthenticationProcessingFilter</filter-class>
    <init-param>
        <param-name>oauth1TokenCheckEndpoint</param-name>
        <param-value>http://10.201.76.93:8088/sso/oauth/1/checktoken</param-value>
    </init-param>
    <init-param>
        <param-name>oauth2TokenCheckEndpoint</param-name>
        <param-value>http://10.201.76.93:8088/sso/oauth/2/checktoken</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>oAuth2AuthenticationProcessingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>oAuth2ClientContextFilter</filter-name>
    <filter-class>bingo.oauth.client.filter.OAuth2ClientContextFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>oAuth2ClientContextFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

注销

所有接入SSO的应用,都能完成注销,应用通过调用SSO提供的客户端注销接口,则可完成SSO及各接入应用的注销。

<a ref="./ssoclient/logout?return_url=/index.jsp">Logout From SSO Server</a>

SSO提供的客户端组件中,提供了注销的接口地址:/ssoclient/logout,客户端应用向这个接口发起注销则可

示例工程

Java演示工程