Java接入指南

平台中的单点登录和注销功能由统一认证服务提供,其中登录认证协议遵循OAuth2.0和Open ID Connect标准。

您可以使用支持OAuth2.0和Open ID Connect第三方库来实现单点登录,也可以使用平台提供的SDK进行接入。

下面详细介绍使用平台提供的SDK来实现登录注销。

Java版的SDK可以访问Github地址

登录

这里假设SSO服务器的地址是:http://sso.example.com

client_id:demo

client_secret:RxUgcKy

一、在pom.xml中添加SDK依赖:

<dependency>
    <groupId>net.bingosoft.oss</groupId>
    <artifactId>sso-client</artifactId>
    <version>[3.0.1,]</version>
</dependency>

二、实现抽象类AbstractLoginServlet

public class LoginServlet extends AbstractLoginServlet {
    @Override
    protected SSOClient getClient(ServletConfig servletConfig) throws ServletException {
        SSOConfig config = new SSOConfig();
        config.setClientId("demo");
        config.setClientSecret("RxUgcKy");

        // 这个地址需要在应用注册的时候填写
        String redirectUri = servletConfig.getServletContext().getContextPath()+"/ssoclient/login";
        config.setRedirectUri(redirectUri);

        config.autoConfigureUrls("http://sso.example.com");
        SSOClient client = new SSOClient(config);
        return client;
    }

    @Override
    protected void localLogin(HttpServletRequest request, 
                              HttpServletResponse response,
                              Authentication authentication,
                              AccessToken accessToken) throws ServletException, IOException {
        // 完成本地登录
        request.getSession().setAttribute("loginUser",authentication);
        // 保存用户访问令牌
        request.getSession().setAttribute("accessToken",accessToken);
    }
}

这个抽象类负责完成和SSO服务端对接的功能。

接下来只需要在web.xml中配置:

<servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>net.bingosoft.demo.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/ssoclient/login</url-pattern>
</servlet-mapping>

完成上面的配置之后,如果需要用户登录,则将用户请求重定向到/ssoclient/login这个uri上即可。

如果希望指定用户登录完成后自动跳转到原来的目录,可以通过增加return_url参数来指定,这个参数需要url编码,如:

GET /ssoclient/login?return_url=http%3A%2F%2Flocalhost%3A8080%2Fdemo

注销

在注册应用的时候,我们填写了应用的注销地址。

当我们进行单点注销时,只需要跳转到SSO的单点注销地址即可:

GET http://sso.example.com/oauth2/logout

此时SSO会发一个HTTP请求到我们的WEB应用请求注销这个应用,我们使用一个简单的servlet来处理注销请求:

public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 移除用户登录信息
        req.getSession().removeAttribute("loginUser");
        // 移除用户访问令牌
        req.getSession().removeAttribute("accessToken");
        // 设置session失效
        req.getSession().invalidate();
    }
}

web.xml中配置如下:

<servlet>
    <servlet-name>logout</servlet-name>
    <servlet-class>net.bingosoft.demo.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>logout</servlet-name>
    <url-pattern>/logout</url-pattern>
</servlet-mapping>

注意:这里的注销地址必须是在注册应用时填写的应用注销地址,否则会导致WEB应用无法单点注销。

登录注销的完整demo示例地址可以查看Github仓库地址

上一篇:Web应用 下一篇:桌面应用