2019独角兽企业重金招聘Python工程师标准>>>
confluence 是一套运用广泛的wiki系统。不过是商业软件,需要付费购买license。
购买了licence ,发现他是独立的登录用户系统,公司这么多系统一个个登录是不是太费劲了。对,和公司的单点登录系统对接吧。最近不幸给自己挖了这么一个坑。好不容易填好了。记录下。
1.开发环境准备
confluence 是java开发,看了哈用了Spring,。java环境,你懂得,配置不在赘述,要注意的是你的开发环境和生产环境一致。
2.配置你的开发项目
confluence是支持单点登录的(JIRA也一样,同一个公司出品),他用了一个他们自己开源的单点登录框架Seraph。文档地址:https://docs.atlassian.com/atlassian-seraph/2.6.1-m1/index.html。
所以你需要下载seraph的jar包https://maven.atlassian.com/content/repositories/atlassian-public/com/atlassian/seraph/atlassian-seraph/4.0.0/
然后新建一个Java 项目把seraph的jar包和confluence的jar包都导入进去。
3.开发
要实现一个单点登录,Confluence 2.2 以前是继承一个 Seraph 的 DefaultAuthenticator 类。2.2及其以后要继承com.atlassian.confluence.user.ConfluenceAuthenticator 类,并实现
public Principal getUser(HttpServletRequest request, HttpServletResponse response) 方法
在这个方法里面你可以获取cookie 或者通过token来验证用户是否登录了。然后写入session。
如果验证不通过返回null。验证通过返回一个
Principal user
我这是通过token来验证的,获取了用户的email然后就算登录了。
代码例子:
public Principal getUser(HttpServletRequest request, HttpServletResponse response)
{
Principal user = null;
try
{
if(request.getSession() != null && request.getSession().getAttribute(ConfluenceAuthenticator.LOGGED_IN_KEY) != null)
{
log.info("Session found; user already logged in");
user = (Principal) request.getSession().getAttribute(ConfluenceAuthenticator.LOGGED_IN_KEY);
}
else
{
//获取
String authToken = request.getParameter("auth");
log.info("Got auth token "+authToken);
if (authToken != null && authToken != "")
{
SSOUserInfo ssoUser = SSOApi.getUserInfoByToken(authToken);
if (ssoUser == null) {
return null;
}
SearchResult userResult = this.getUserAccessor().getUsersByEmail(ssoUser.email);
log.info("Logged in via SSO, with User "+user);
if (userResult == null ) {
return null;
}
Pager userPager = userResult.pager();
if (userPager.isEmpty()) {
return null;
}
List userList = userPager.getCurrentPage();
user = userList.get(0);
request.getSession().setAttribute(ConfluenceAuthenticator.LOGGED_IN_KEY, user);
request.getSession().setAttribute(ConfluenceAuthenticator.LOGGED_OUT_KEY, null);
}
else
{
log.info("SSOCookie is null; redirecting");
//user was not found, or not currently valid
return null;
}
}
}
catch (Exception e) // catch class cast exceptions
{
log.warn("Exception: " + e, e);
}
return user;
}
你可以根据自己情况改动。
开发完毕打包成jar包。
4.配置调试
jar包放到confluence的WEB-INF/lib 下面。
然后配置WEB-INF/seraph-config.xml
login.url
http://youcompany.com/login?calback=${originalurl}
logout.url
authentication.type
os_authType
invalidate.session.on.login
true
invalidate.session.exclude.list
config.file
seraph-paths.xml
如果你需要调试则要开启日志,日志配置是:
confluence/WEB-INF/classes/log4j.properties文件
讲义打开
### # Atlassian User ### log4j.logger.com.atlassian.user=DEBUG log4j.logger.com.atlassian.confluence.user=DEBUG log4j.logger.bucket.user=DEBUG log4j.logger.com.atlassian.seraph=DEBUG log4j.logger.com.opensymphony.user=DEBUG
然后有添加一个你自己的包名的配置即可有日志了
log4j.logger.com.yourcompany=ALL
完