本文与crowd单点登录1 略有重复之处,读者自己甄别。
本文依然是从服务器的安装开始讲起,至于破解方式,参见拙文:crowd单点登录1。
第一章 安装crowd服务器
第一步 填写title
Deployment Title:指的是部署名称,是服务标识名称,可以自己定义。
Base URL 是服务器访问域名称,最好采用域名形式的,为以后配置应用做准备。
第二步: 填写邮件地址和邮件服务器,为了防止密码丢失或者其他的一些功能,邮件必须填写,可以填写假的邮箱。
第三步: 内部目录结构名称,可以默认
第四步: 默认管理员信息,包括用来登录该服务器的用户名密码,请牢记
第五步: 选择是否集成自带几个应用,选择默认即可
第六步 完成服务器的配置
第二章 登录和使用crowd服务器
1、 登录
访问http://zhangxl.software.com:8095/crowd/console/login.action进入登陆页面:
输入第一章、第四步创建的用户名密码,点击login,进入系统首页:
可以看到,页面非常简单,下面逐一介绍各个标签的功能。
2、 服务器主界面
Applications
可以看到该页面有四个已有的应用:
Crowd 可以但Description 这个正是当前登录的服务器控制台,也就是说我们登录的这个crowd服务器同时也是个客户端,只是具备配置各应用的功能而已。
下面三个应用也都是服务器自带的应用而已,尤其是demo,供开发者参考,而且提供demo的源码,以下讲解时也会使用demo作为案例来讲解。
Users
用户管理功能,提供统一用户管理功能,这是集成多个应用的单点登录必不可少的一个功能,也是非常重要的,crowd提供用户的添加、修改、删除、批量导入,并且可以统一授权、统一认证,通过目录、组、角色来分类和授权。
但如果我们仅仅用来测试,仅需要建立几个临时的用户就可以了,Users部分其他的功能可以暂时不考虑。同样,之后三个|Groups|Roles|Directories都是为Users服务的,暂时不去理了。以下说说
Administration
这里是管理操作的较复杂的部分,是服务器本身的一些属性,也是用来配置客户端认证的参数。
General 一般操作,这里很重要一个属性是SSODomain,用来配置当前SSO系统的域名,比如本系统这个参数值就为:software.com。请注意,如果当前浏览器里面的url不是software.com这个域名,则该参数无法这么配置。也就是说,这么一配置就就决定了该系统的服务器和客户端的顶级和二级域名,如果当前登录的不是这个域名,岂不就是自相矛盾了?如果要更改域名,比如更改成test.com,那么要先使用software.com登陆进去,把这个值清空了,然后换成test.com登录进来,把test.com填进去。
Licensing 授权信息这个可以从厂商哪儿获取
Session Config 配置session的超时时间
Current Sessions 查看当前登录的应用和用户
其他的信息自己感兴趣可以看看,下面我们去体验一下单点登录:
我们知道,服务器本身已经集成了几个应用,包括之前提过的demo应用,现在我们已经登录了crowd,demo应用是否可以直接登录呢?那么我们不要关闭浏览器,再打开一个标签:
输入url:http://zhangxl.software.com:8095/demo,可以看到如下界面:
从图中可以看到,demo应用已经是登录状态了。也就是说我们已经实现了单点登录。那么如果我们去集成一个新的应用该如何来做呢?
第三章 项目应用
第一步: 添加jar包与配置文件
随便在myeclipse 建立一个小项目,ssoDemo:一个jsp,两个servlet,实现登录和退出功能即可:
如图所示:
很简单的一个登录框,输入相同的用户名密码,点击登录:
进入到登录状态!那么接下来我们把crowd的jar包和配置文件集成进来,打开crowd服务器的目录结构:
红圈client里面已经为我们提供了需要的jar包和配置文件信息,只需将以下四个jar包导入到lib中即可:
将crowd.properties和crowd-ehcache.xml放在src根目录下:
注意:此处配置文件crowd-ehcache.xml不需改动,crowd.properties必须修改,内容根据之后的配置决定。
第二步: 配置服务器
然后配置crowd服务器,进入服务器Applications选项:
Add Applicatiuon:
ApplicationType 是应用类型,这里我们现在一般应用
这里Description不重要,但Name和Password却需要我们记下来,这个需要在crowd.properties配置文件中用到。点击next>
在url中输入应用的url,比如本例ssoDemo的url为:http://zhangxl.software.com:8080/ssoDemo/,
点击后面的按钮,可以自动解析出Remote IP Address,如果不能解析出来,可以手动填写。注意:这个ip是“应用服务器”所在的Ip。点击next>
选择一个目录,这个目录可以是我们配置服务器时创建的那个,也可以自己重新建立,next>
配置用户权限,对于测试用户来说,可以选择全部,也可以选择图中所示用户组。Next>
确认信息,点击Add Application
到此为止配置完毕,但有几个问题需要注意:
1, 看一看Users里面有没有你想要测试登录的用户:
2, 检查Remote Address里是不是应用所在主机IP:
3, Authentication Test中,测试你的用户是否可以成功:
至此,我们的在Crowd服务器配置应用的步骤完全结束!
第三步: 更改配置文件
前四项是比较重要的。
application.name是刚刚配置应用时的应用名称 因配置不同而不同
application.password 是密码 因配置不同而不同
application.login.url这个应用所在的url 因应用不同而变化
crowd.server.url 这个是认证服务器所在的地址,一般不变
其他的配置采用默认即可。
第四步: 添加程序入口,实现登录和退出
接下来我们就需要对我们的应用ssoDemo进行改造:
1, 增加一个servlet,作为单点登录的入口。
2, 在该servlet中,对当前是否存在可识别的、已登录的cookie信息进行获取和校验。
3, 如果校验通过,则转入应用本身自己的登录,这个登录一般是仅需要用户即可登录。与应用本身的(需要用户名密码)不是同一个入口。
4, 登录完成,跳转到目标窗口,完成单点登录。
第一步:增加的servlet
-
package com.sso;
-
-
import java.io.IOException;
-
import java.rmi.RemoteException;
-
-
import javax.servlet.ServletContext;
-
import javax.servlet.ServletException;
-
import javax.servlet.http.HttpServlet;
-
import javax.servlet.http.HttpServletRequest;
-
import javax.servlet.http.HttpServletResponse;
-
import javax.servlet.http.HttpSession;
-
-
import org.springframework.web.context.WebApplicationContext;
-
import org.springframework.web.context.support.WebApplicationContextUtils;
-
-
import com.atlassian.crowd.integration.exception.ApplicationAccessDeniedException;
-
import com.atlassian.crowd.integration.exception.InvalidAuthorizationTokenException;
-
import com.atlassian.crowd.integration.http.HttpAuthenticator;
-
/**
-
*
-
* @author zhangxl
-
*
-
*/
-
public
class SSOLoginServlet extends HttpServlet {
-
/**
-
*
-
*/
-
private
static
final
long serialVersionUID =
1L;
-
-
/**
-
* 初始化方法
-
*/
-
@Override
-
public void init() throws ServletException {
-
-
super.init();
-
ServletContext servletContext =
this.getServletContext();
-
-
WebApplicationContext ctx = WebApplicationContextUtils
-
.getWebApplicationContext(servletContext);
-
//认证对象,从spring配置文件中获取
-
httpAuthenticator = (HttpAuthenticator) ctx.getBean(
"httpAuthenticator");
-
-
}
-
-
private HttpAuthenticator httpAuthenticator;
-
private Boolean authenticated =
null;
-
-
public void doGet(HttpServletRequest request, HttpServletResponse response)
-
throws ServletException, IOException {
-
boolean hasLoggedUser =
this.validateLoggedUser(request, response);
-
-
-
HttpSession session = request.getSession();
-
String userName =
null;
-
if(hasLoggedUser){
-
try {
-
/**
-
* 获取当前已登录的cookie用户名
-
*/
-
userName = httpAuthenticator.getPrincipal(request).getName();
-
}
catch (Exception e) {
-
e.printStackTrace();
-
}
-
session.setAttribute(
"user", userName);
-
}
else{
-
-
}
-
request.getRequestDispatcher(
"/index.jsp").forward(request, response);
-
}
-
-
public void doPost(HttpServletRequest request, HttpServletResponse response)
-
throws ServletException, IOException {
-
doGet(request, response);
-
}
-
-
private boolean validateLoggedUser(HttpServletRequest request,HttpServletResponse response){
-
try {
-
/**
-
* 验证是否存在合法的登录信息,源码不可见
-
*/
-
this.authenticated =
this.httpAuthenticator.isAuthenticated(request, response);
-
}
catch (RemoteException e) {
-
e.printStackTrace();
-
}
catch (InvalidAuthorizationTokenException e) {
-
e.printStackTrace();
-
}
catch (ApplicationAccessDeniedException e) {
-
-
e.printStackTrace();
-
}
-
-
return
this.authenticated;
-
}
-
}
第二步:web.xml进行spring注册
-
-
<context-param>
-
<param-name>contextConfigLocation
</param-name>
-
<param-value>classpath:applicationContext-CrowdClient.xml
</param-value>
-
</context-param>
-
<listener>
-
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
-
</listener>
说明:applicationContext-CrowdClient.xml是jar包里的,这样引入即可,在servlet中获取该bean,如果系统采用其他的框架,应区别对待,获取bean方式可以不同。
第三步:把demo中jar包全部引入到ssoDemo中,这个是为了图省事,不是每个都需要的,暂时不去辨别了。
第四步:验证
已登录的crowd服务器界面:
然后访问http://zhangxl.software.com:8080/ssoDemo/servlet/SSOLoginServlet单点登录入口
可以看到无需输入用户名、密码,即是登录状态。
注销:对于退出功能,应该是:单点登录的所有应用中,其中一个退出了,所有的session都被注销掉。
在子应用中的注销功能之前,加上一行代码:
httpAuthenticator.logoff(request, response);
这样crowd保存在本地的cookie信息被清除掉,crowd的登录也被注销了。
但是,如果先注销crowd再去刷新一下ssoDemo(子应用),这样是否能注销掉呢?
答案是否定的,因为我们尽管清除了cookie信息,但子应用已经登录了,如果不动态检测和执行退出,是不能随着cookie注销的。
就比如,一个人进门的时需要检验门票,门票通过才能进入,但当人已经进来了,门票即使失效了,人依然在里面。补救的做法就是,一旦这个人有任何活动,都要检测门票是否有效,如果门票失效了,把这人请出去。
回到程序里来,我们需要加一个过滤器:
-
package com.sso;
-
-
import java.io.IOException;
-
-
import javax.servlet.Filter;
-
import javax.servlet.FilterChain;
-
import javax.servlet.FilterConfig;
-
import javax.servlet.ServletContext;
-
import javax.servlet.ServletException;
-
import javax.servlet.ServletRequest;
-
import javax.servlet.ServletResponse;
-
import javax.servlet.http.HttpServletRequest;
-
import javax.servlet.http.HttpServletResponse;
-
-
import org.springframework.web.context.WebApplicationContext;
-
-
import com.atlassian.crowd.integration.http.HttpAuthenticator;
-
-
public
class SSOCookieFilter implements Filter {
-
private
HttpAuthenticator httpAuthenticator;
-
-
public void destroy() {
-
-
}
-
-
public void doFilter(
ServletRequest request,
ServletResponse response,
-
FilterChain chain)
throws
IOException,
ServletException {
-
HttpServletResponse res = (
HttpServletResponse)response;
-
try {
-
//认证通过,继续,不通过注销
-
if(httpAuthenticator.isAuthenticated((
HttpServletRequest)request, res)){
-
chain.doFilter(request, response);
-
}
else{
-
request.getRequestDispatcher(
"/servlet/logoutServlet").forward(request, response);
-
}
-
}
catch (
Exception e) {
-
e.printStackTrace();
-
request.getRequestDispatcher(
"/servlet/logoutServlet").forward(request, response);
-
}
-
}
-
-
public void
init(
FilterConfig filterConfig)
throws
ServletException {
-
ServletContext servletContext = filterConfig.getServletContext();
-
WebApplicationContext ctx = (
WebApplicationContext) servletContext.getAttribute(
WebApplicationContext.
ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
-
//认证对象,从spring配置文件中获取
-
httpAuthenticator = (
HttpAuthenticator) ctx.getBean(
"httpAuthenticator");
-
}
-
-
}
关于crowd服务器的下载地址: crowd_server
破解包的下载地址:iNViSiBLE
本文的word版本:word
本文提到的demo:ssoDemo
最后衷心希望各位读者给予批评指正,不吝赐教,共同学习,共同进步。
欢迎使用Markdown编辑器
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
新的改变
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。2
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎