nighty
折騰的年華
posts - 37, comments - 143, trackbacks - 0, articles - 0
導(dǎo)航
BlogJava
首頁(yè)
新隨筆
聯(lián)系
聚合
管理
<
2009年10月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(7)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類
Eclipse(7)
Flex(2)
Java(6)
Struts2(2)
SWT/JFace(1)
信息安全(1)
心得(5)
操作系統(tǒng)(3)
數(shù)據(jù)庫(kù)(3)
服務(wù)器部署(5)
測(cè)試(2)
系統(tǒng)集成(2)
軟件架構(gòu)(2)
隨筆檔案
2013年4月 (2)
2013年3月 (1)
2012年4月 (1)
2011年10月 (1)
2011年8月 (1)
2011年5月 (3)
2011年4月 (1)
2011年3月 (2)
2011年2月 (1)
2011年1月 (1)
2010年11月 (1)
2009年11月 (1)
2009年10月 (1)
2009年8月 (1)
2009年7月 (1)
2008年8月 (2)
2008年7月 (2)
2008年6月 (2)
2008年5月 (4)
2008年4月 (1)
2008年1月 (1)
2007年11月 (1)
2007年10月 (2)
2007年8月 (2)
文章分類
測(cè)試
搜索
最新評(píng)論
1.?re: 關(guān)于commons dbutils組件的一個(gè)小缺陷分析
dbutils中連傳入到的參數(shù)都不區(qū)分大小寫??
--starhe
2.?re: B/S,C/S架構(gòu)混合使用[未登錄](méi)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--eagle
3.?re: B/S,C/S架構(gòu)混合使用[未登錄](méi)
補(bǔ)充一下:用的語(yǔ)言是java,開(kāi)發(fā)環(huán)境是eclipse
--eagle
4.?re: B/S,C/S架構(gòu)混合使用
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--Unbotrusive
5.?re: struts2中重定向中文參數(shù)亂碼梳理[未登錄](méi)
有用啊
--tony
閱讀排行榜
1.?ubuntu安裝Java開(kāi)發(fā)環(huán)境(38192)
2.?Eclipse3.3安裝中文語(yǔ)言包(13944)
3.?Http狀態(tài)碼思維導(dǎo)圖(13765)
4.?B/S,C/S架構(gòu)混合使用(13764)
5.?添加完整的Eclipse RCP幫助系統(tǒng)(8937)
評(píng)論排行榜
1.?B/S,C/S架構(gòu)混合使用(25)
2.?無(wú)奈只能放棄iBatis(24)
3.?Eclipse3.3安裝中文語(yǔ)言包(13)
4.?httpclient3.1使用小結(jié)(8)
5.?JDBC連接DB2的一些總結(jié)(8)
JForum集成--用戶重名的一種解決方案
Posted on 2009-10-14 17:41
寒武紀(jì)
閱讀(2174)
評(píng)論(1)
編輯
收藏
所屬分類:
系統(tǒng)集成
JForum做為一個(gè)成熟的開(kāi)源BBS論壇解決方案,提供了非常方便的SSO集成接口。它的主頁(yè)上和網(wǎng)上都有許多介紹如何用SSO方式進(jìn)行集成的辦法。這里不羅列,google可以找到許多資料,主要描述一下如何解決用戶名重名的一種方式。目前使用的JForum版本是2.1.8
簡(jiǎn)單地介紹一下采用的SSO方式。由于應(yīng)用上需要一個(gè)BBS,找了JForum做為一個(gè)子系統(tǒng),集成到現(xiàn)成的一個(gè)管理系統(tǒng)當(dāng)中,管理系統(tǒng)本身有一套完全的身份權(quán)限認(rèn)證方案,由于系統(tǒng)的安全要求不是特別嚴(yán)格,所以采了最直接和最省事的方式:Cookie寫入。即在管理系統(tǒng)登錄時(shí),把用戶信息寫入Cookie,JForum從Cookie中讀取用戶信息進(jìn)行登錄。
為JForum項(xiàng)目添加一個(gè)SSO接口的擴(kuò)展類CookieSSO,主要實(shí)現(xiàn)authenticateUser(RequestContext request)方法。方法大體如下:
public
String authenticateUser(RequestContext request)
{
String userId
=
null
;
Cookie c
=
ControllerUtils.getCookie(
"
ehrbbsuserid
"
);
if
(c
!=
null
)
{
userId
=
c.getValue();
}
logger.info(
"
單點(diǎn)登錄BBS用戶ID為:
"
+
userId);
return
userId;
}
就是從Cookie中讀取在管理系統(tǒng)中放入的username。但是這里寫的是:ehrbbsuserid,主要是這個(gè)變量名來(lái)區(qū)分傳過(guò)來(lái)的內(nèi)容的不同。
按照正常的方式就是從管理系統(tǒng)把一個(gè)用戶的username傳過(guò)來(lái)。然后在這里取出,return給調(diào)用方法進(jìn)行驗(yàn)證。在實(shí)際項(xiàng)目中,
問(wèn)題就出在這里了
!
舉例說(shuō)有二個(gè)用戶名字都叫:李四,那么當(dāng)二個(gè)李四都同時(shí)登錄時(shí),JForum的驗(yàn)證方式就會(huì)出問(wèn)題!它認(rèn)不清到底是哪個(gè)李四,數(shù)據(jù)庫(kù)查詢時(shí)只按第一個(gè)來(lái)!
仔細(xì)看一下jforum的數(shù)據(jù)庫(kù)表設(shè)計(jì),jforum_user這個(gè)表沒(méi)有display_user_name類似的字段,它就是把username做為顯示在頁(yè)面上的用戶名,如果不做集成,把它單獨(dú)做為一個(gè)BBS時(shí),username既是登錄的用戶名,也是顯示在頁(yè)面上的用戶名。主要原因我想大概就是老外的思維方式跟中國(guó)人的不太一樣。中國(guó)人登錄的時(shí)候用英文,顯示的時(shí)候還有一個(gè)昵稱或是中文名等。
所以把它集成的時(shí)候,用Cookie傳送一個(gè)username給JForum時(shí)就得用中文(而且重名的概率很大)。我們?cè)俑M(jìn)一個(gè)它的代碼,看是誰(shuí)調(diào)用了SSO接口的這個(gè)方法:
結(jié)果發(fā)現(xiàn)是類:net.jforum.ControllerUtils的checkSSO(UserSession userSession)方法
/** */
/**
* Checks for user authentication using some SSO implementation
*
@param
userSession UserSession
*/
protected
void
checkSSO(UserSession userSession)
{
try
{
SSO sso
=
(SSO) Class.forName(SystemGlobals.getValue(ConfigKeys.SSO_IMPLEMENTATION)).newInstance();
String username
=
sso.authenticateUser(JForumExecutionContext.getRequest());
if
(username
==
null
||
username.trim().equals(
""
))
{
userSession.makeAnonymous();
}
else
{
SSOUtils utils
=
new
SSOUtils();
if
(
!
utils.userExists(username))
{
SessionContext session
=
JForumExecutionContext.getRequest().getSessionContext();
String email
=
(String) session.getAttribute(SystemGlobals.getValue(ConfigKeys.SSO_EMAIL_ATTRIBUTE));
String password
=
(String) session.getAttribute(SystemGlobals.getValue(ConfigKeys.SSO_PASSWORD_ATTRIBUTE));
if
(email
==
null
)
{
email
=
SystemGlobals.getValue(ConfigKeys.SSO_DEFAULT_EMAIL);
}
if
(password
==
null
)
{
password
=
SystemGlobals.getValue(ConfigKeys.SSO_DEFAULT_PASSWORD);
}
utils.register(password, email);
}
this
.configureUserSession(userSession, utils.getUser());
}
}
catch
(Exception e)
{
e.printStackTrace();
throw
new
ForumException(
"
Error while executing SSO actions:
"
+
e);
}
}
在這里明顯的,它是通過(guò)username去確定這個(gè)人是否存在?再繼續(xù)跟進(jìn)代碼就會(huì)發(fā)現(xiàn)最后調(diào)用了Dao的selectUserByName方法。
解決的思路:修改JForum的數(shù)據(jù)庫(kù)表,并更改代碼和頁(yè)面文件是不科學(xué)的,工作量大,而且風(fēng)險(xiǎn)比較高!那么就繼續(xù)把username用來(lái)保存中文名稱,它的user_id是一個(gè)自增的數(shù)字序列。在管理系統(tǒng)的用戶表中,擴(kuò)展一個(gè)字段bbs_user_id,用來(lái)保存在JForum中的用戶id,這個(gè)字段就肯定是唯一的,在管理系統(tǒng)登錄時(shí),把這個(gè)bbs_user_id查詢出來(lái),放到Cookie中。在JForum驗(yàn)證時(shí),不再使用它推薦的返回username方式,而是返回它的user_id值。
那么回到最上面的CookieSSO類的代碼,這里返回的String其實(shí)是jforum_user表中user_id字段。為了匹配,那么net.jforum.ControllerUtils的checkSSO(UserSession userSession)方法也要改!改為下面的方式:
protected
void
checkSSO(UserSession userSession)
{
try
{
SSO sso
=
(SSO) Class.forName(SystemGlobals.getValue(ConfigKeys.SSO_IMPLEMENTATION)).newInstance();
String username
=
sso.authenticateUser(JForumExecutionContext.getRequest());
if
(username
==
null
||
username.trim().equals(
""
))
{
userSession.makeAnonymous();
}
else
{
//
SSOUtils utils = new SSOUtils();
/**/
/*
重構(gòu)為按userId驗(yàn)證身份
*/
//
if (!utils.userExists(username)) {
//
SessionContext session = JForumExecutionContext.getRequest().getSessionContext();
//
//
String email = (String) session.getAttribute(SystemGlobals.getValue(ConfigKeys.SSO_EMAIL_ATTRIBUTE));
//
String password = (String) session.getAttribute(SystemGlobals.getValue(ConfigKeys.SSO_PASSWORD_ATTRIBUTE));
//
//
if (email == null) {
//
email = SystemGlobals.getValue(ConfigKeys.SSO_DEFAULT_EMAIL);
//
}
//
//
if (password == null) {
//
password = SystemGlobals.getValue(ConfigKeys.SSO_DEFAULT_PASSWORD);
//
}
//
//
utils.register(password, email);
//
}
/**/
/*
新添加的代碼
*/
UserDAO dao
=
DataAccessDriver.getInstance().newUserDAO();
User user
=
dao.selectById(Integer.parseInt(username));
//
this.configureUserSession(userSession, utils.getUser());
this
.configureUserSession(userSession, user);
}
}
catch
(Exception e)
{
e.printStackTrace();
throw
new
ForumException(
"
Error while executing SSO actions:
"
+
e);
}
}
這樣就可以解決認(rèn)證的問(wèn)題!同時(shí)又保證username可以是中文的,而且重名也無(wú)所謂。
附加:查看它的SQL配置文件,發(fā)現(xiàn)有selectUserByName這樣的方法,通過(guò)用戶名來(lái)查找用戶,起初怕是它在某些模塊中使用了。后來(lái)詳細(xì)查看,發(fā)現(xiàn)它只使用在后臺(tái)管理(即admin模塊)中的用戶管理。這個(gè)頁(yè)面提供了一個(gè)按用戶名來(lái)查找用戶的功能,所以也是非常合理的!
剛進(jìn)場(chǎng)的時(shí)候戲就落幕
Feedback
#
re: JForum集成--用戶重名的一種解決方案
回復(fù)
更多評(píng)論
2009-10-21 21:50 by
liuxin
請(qǐng)問(wèn):
JFORUM 1.2.8已經(jīng)將SyntaxHighlighter納入支援 ,為什么我下載JFORUM.WAR ,測(cè)試就沒(méi)有出現(xiàn)類似JAVAEEYE這樣的
程式碼語(yǔ)法高亮呢?
我注意了一下:點(diǎn)擊javaeye的頁(yè)面源碼,可以看到頁(yè)面有類似<pre name="code" class="java"> 的代碼,
我用JFORUM.WAR 測(cè)試的頁(yè)面沒(méi)有生成類似的代碼 ,倒是在HEADER.HTML 頁(yè)有這樣的定義: <#assign hasCodeBlock = hasCodeBlock?default(false)/>,在bottom.HTML <#if hasCodeBlock><#include "highlighter_js.htm"/>
但是在JAVA 中只有net.jforum.view.forum.common.PostCommon private static void processText(Post post)
boolean hasCodeBlock = false; ... if (hasCodeBlock) {JForumExecutionContext.getTemplateContext().put("hasCodeBlock", hasCodeBlock);}
請(qǐng)問(wèn)我在JAVA 代碼中怎么改動(dòng)才能夠?qū)崿F(xiàn)頁(yè)面程式碼語(yǔ)法高亮呢?
期待你的幫助
我的EMAIL:liuxinsudi@163.com
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
相關(guān)文章:
Http狀態(tài)碼思維導(dǎo)圖
JForum集成--用戶重名的一種解決方案
Powered by:
BlogJava
Copyright © 寒武紀(jì)
主站蜘蛛池模板:
国产成人免费高清在线观看
|
国精产品一区一区三区免费视频
|
巨波霸乳在线永久免费视频
|
国产性生大片免费观看性
|
亚欧乱色国产精品免费视频
|
人妻仑乱A级毛片免费看
|
亚洲免费无码在线
|
三级黄色片免费看
|
国产精品免费看久久久
|
国产成人精品无码免费看
|
日韩精品内射视频免费观看
|
91禁漫免费进入
|
真人做人试看60分钟免费视频
|
97碰公开在线观看免费视频
|
成人免费一级毛片在线播放视频
|
最近中文字幕mv免费高清电影
|
色播精品免费小视频
|
国产又大又粗又长免费视频
|
免费精品国产日韩热久久
|
欧洲黑大粗无码免费
|
国产一区二区三区在线免费观看
|
国产亚洲人成网站在线观看不卡
|
日本亚洲视频在线
|
亚洲综合一区二区
|
性xxxx黑人与亚洲
|
国产亚洲情侣久久精品
|
GOGOGO高清免费看韩国
|
少妇无码一区二区三区免费
|
亚洲一级毛片免费看
|
全免费a级毛片免费**视频
|
免费一级毛片在线播放不收费
|
伊人久久综在合线亚洲91
|
亚洲Aⅴ无码专区在线观看q
|
亚洲av无码久久忘忧草
|
在线观看亚洲视频
|
a级在线观看免费
|
男女超爽刺激视频免费播放
|
免费人成在线观看视频播放
|
久久精品国产精品亚洲精品
|
婷婷久久久亚洲欧洲日产国码AV
|
亚洲中文字幕精品久久
|