掌柜大作战(4):京东统一登录服务,外网和内网

来源:互联网 发布:php怎么安装 编辑:程序博客网 时间:2024/04/28 17:24
分布式系统中,系统比较多的公司,都会统一登录和安全等公共服务,统一登录服务。
京东有2套统一登录服务:
1、JdPassport
公网环境下,使用商城账号登录,比如我的商城账号是 fans123这种。

公司统一的登录拦截器配置
<bean id="springPassportInterceptor" class="com.jd.passport.SpringMvcInterceptor">
<property name="cookieName" value="cookieName" />
<property name="authenticationKey" value="123456" />
<property name="loginUrl" value="login.jd.com"></property>
<property name="charsetName" value="utf-8"></property>
<property name="appName" value="京东商城"></property>
</bean>
2、JdSSO
内网环境下,使用公司统一的Erp账号登录,比如我的内网账号是leiwen123这种。
<bean id="springSSOInterceptor" class="com.jd.SpringSSOInterceptor">
<property name="appDomainName" value="app.jd.com"/>
<property name="appHomeUrl" value="http://app.jd.com/"/>
<property name="loginUrl" value="${login.address}"/>
<property name="ssoDomainName" value="${sso.auth.cookie.domain}"/>
<property name="excludePath" value="${sso.exclude.path}"/>
<property name="ssoService" ref="ssoService"/>
</bean>
3、组合使用
有个项目,业务方要求同时支持公网和内网(后来改为只支持公网),这个时候就需要手动配置2个Integerceptor的bean到自定义的拦截器中。

自定义的拦截器
<bean id="loginInterceptor" class="com.jd.web.interceptor.LoginInteceptor">
<property name="springPassportInterceptor" ref="springPassportInterceptor" />
<property name="springSSOInterceptor" value="springSSOInterceptor" />
</bean>
在自定义LoginInteceptor中,手动调用公网和内网2个拦截器的方法,获得结果。
是否登录了,用户ID、用户名称、用户昵称等信息。

在实际情况中,遇到1个问题。先使用外网账号登录,这个时候想使用内网登录,就会遇到问题。
比如,外网和内网同时登录了,这个时候以哪个结果优先呢?


4、SpringMVC中拦截器
<!-- 单点登录拦截器配置 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<ref bean="loginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>


5、一个实际例子
使用京东的外网统一登录服务,登录之后,拿到用户标志pin。
咱们自己的系统中,配置了用户白名单pin和其它权限配置。
这样,就可以让少数指定的用户,登录公司的面向特定用户群体的项目网站。
比如,业务方行政部门让咱开发了一个“健身房签到签退系统”,用户预约使用的是内网健身房预约系统,但是负责健身房签到签退系统的人,虽然在咱京东大厦工作,但不是

public class LoginInteceptor implements HandlerInterceptor {
//公网登录拦截器
private SpringMvcInterceptor springPassportInterceptor;
//用户服务
@Resource
private UserService userService;

private String excludePath;

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
// 判断是否是需要排除的路径
String requestURI = request.getRequestURI();

if (isExclude(requestURI)) {
return true;
}
UserContext userContext = new UserContext();
//根据公网登录拦截器服务,判断用户是否使用主站登录了
boolean passportLogin = springPassportInterceptor.parseSessionAndCheck(request, response);
//已经登录
if (passportLogin) {
//登录的用户有1个用户标识
String pin = LoginUtils.getPin(request);
//根据用户标志,去自己的系统查询这个pin绑定的用户
User user = userService.findByPin(pin);
if (user == null) {
logger.info("The user not in our user table,pin="+pin);
goToLoginPage(request, response);
return false;
}
userContext.setPin(pin);
userContext.setType(LoginTypeEnum.PASSPORT.getCode());
UserContext.setUserContext(userContext);
return true;
} else {
goToLoginPage(request, response);
}
return false;
}

以上主要是PC端使用。
移动端,京东有京东Me这个APP,里面嵌入了各种HTML5 APP。
登录依然是统一的,用手机号、ERP等方式登录。


阅读全文
0 0
原创粉丝点击