Skip to content

Portal 实现用户登录功能

Jason Song edited this page Sep 11, 2017 · 37 revisions

Apollo是配置管理系统,会提供权限管理(Authorization),理论上是不负责用户登录认证功能的实现(Authentication)。

所以Apollo定义了一些SPI用来解耦,Apollo接入登录的关键就是实现这些SPI。

实现方式一:使用Apollo提供的Spring Security简单认证

可能很多公司并没有统一的登录认证系统,如果自己实现一套会比较麻烦。Apollo针对这种情况,从0.9.0开始提供了利用Spring Security实现的Http Basic简单认证版本。

使用步骤如下:

1. 更新到Master最新代码(0.9.0-SNAPSHOT,尚未正式release),并导入最新schema

如果之前是0.8.0版本,需要导入apolloportaldb-v080-v090.sql

查看ApolloPortalDB,应该已经存在Users表,并有一条初始记录。初始用户名是apollo,密码是admin。

Id Username Password Email Enabled
1 apollo $2a$10$7r20uS.BQ9uBpf3Baj3uQOZvMVvB1RN3PYoKE94gtz2.WAOuiiwXS [email protected] 1

2. 重启Portal

如果是IDE启动的话,确保-Dapollo_profile=github,auth

3. 添加用户

登录系统后在 http://{portal地址}/user-manage.html 页面添加用户,只有超级管理员才能添加用户, 否则会报403错误。

建议同时修改apollo的密码。

实现方式二: 接入公司的统一登录认证系统

这种实现方式的前提是公司已经有统一的登录认证系统,最常见的比如SSO、LDAP等。接入时,实现以下SPI。其中UserService和UserInfoHolder是必须要实现的。

接口说明如下:

  • UserService(Required):用户服务,用来给Portal提供用户搜索相关功能
  • UserInfoHolder(Required):从ThreadLocal上获取当前登录用户信息,SSO一般都是把当前登录用户信息放在线程ThreadLocal上
  • LogoutHandler(Optional):用来实现登出功能
  • SsoHeartbeatHandler(Optional):Portal页面如果长时间不刷新,登录信息会过期。通过此接口来刷新登录信息

可以参考apollo-portal下的com.ctrip.framework.apollo.portal.spi这个包下面的两个实现:

  1. defaultimpl:默认实现,全局只有apollo一个账号
  2. ctrip:ctrip实现,接入了SSO并实现用户搜索、查询接口
  3. springsecurity: spring security实现,可以新增用户,修改用户密码等

实现了相关接口后,可以通过com.ctrip.framework.apollo.portal.configuration.AuthConfiguration在运行时替换默认的实现。

注:运行时使用不同的实现是通过Profiles实现的,比如你自己的sso实现是在custom profile中的话,在打包脚本中可以指定-Dapollo_profile=github,custom。其中github是Apollo必须的一个profile,用于数据库的配置,custom是你自己实现的profile。同时需要注意在AuthConfiguration中修改默认实现的条件 ,从@ConditionalOnMissingProfile({"ctrip", "auth"})改为@ConditionalOnMissingProfile({"ctrip", "auth", "custom"})

Clone this wiki locally