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)
給我留言
查看公開留言
查看私人留言
隨筆分類
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)混合使用[未登錄]
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--eagle
3.?re: B/S,C/S架構(gòu)混合使用[未登錄]
補(bǔ)充一下:用的語(yǔ)言是java,開發(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ù)亂碼梳理[未登錄]
有用啊
--tony
閱讀排行榜
1.?ubuntu安裝Java開發(fā)環(huán)境(38192)
2.?Eclipse3.3安裝中文語(yǔ)言包(13945)
3.?B/S,C/S架構(gòu)混合使用(13767)
4.?Http狀態(tài)碼思維導(dǎo)圖(13766)
5.?添加完整的Eclipse RCP幫助系統(tǒng)(8938)
評(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ì)
閱讀(2175)
評(píng)論(1)
編輯
收藏
所屬分類:
系統(tǒng)集成
JForum做為一個(gè)成熟的開源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)目中,
問題就出在這里了
!
舉例說(shuō)有二個(gè)用戶名字都叫:李四,那么當(dāng)二個(gè)李四都同時(shí)登錄時(shí),JForum的驗(yàn)證方式就會(huì)出問題!它認(rèn)不清到底是哪個(gè)李四,數(shù)據(jù)庫(kù)查詢時(shí)只按第一個(gè)來(lái)!
仔細(xì)看一下jforum的數(shù)據(jù)庫(kù)表設(shè)計(jì),jforum_user這個(gè)表沒有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)證的問題!同時(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)問:
JFORUM 1.2.8已經(jīng)將SyntaxHighlighter納入支援 ,為什么我下載JFORUM.WAR ,測(cè)試就沒有出現(xiàn)類似JAVAEEYE這樣的
程式碼語(yǔ)法高亮呢?
我注意了一下:點(diǎn)擊javaeye的頁(yè)面源碼,可以看到頁(yè)面有類似<pre name="code" class="java"> 的代碼,
我用JFORUM.WAR 測(cè)試的頁(yè)面沒有生成類似的代碼 ,倒是在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)問我在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++博客
博問
管理
相關(guān)文章:
Http狀態(tài)碼思維導(dǎo)圖
JForum集成--用戶重名的一種解決方案
Powered by:
BlogJava
Copyright © 寒武紀(jì)
主站蜘蛛池模板:
a高清免费毛片久久
|
久久精品国产69国产精品亚洲
|
亚洲一区二区三区免费在线观看
|
99久久免费国产精品热
|
久久成人永久免费播放
|
eeuss影院免费直达入口
|
深夜福利在线免费观看
|
污污视频免费观看网站
|
美国毛片亚洲社区在线观看
|
怡红院亚洲红怡院在线观看
|
日日摸日日碰夜夜爽亚洲
|
国产亚洲蜜芽精品久久
|
国产亚洲精品免费
|
免费VA在线观看无码
|
一级午夜免费视频
|
www免费黄色网
|
成人毛片100免费观看
|
免费久久人人爽人人爽av
|
国内少妇偷人精品视频免费
|
黄网站免费在线观看
|
99re免费在线视频
|
免费观看无遮挡www的视频
|
一二三四在线观看免费高清中文在线观看
|
青青青国产免费一夜七次郎
|
国产精品国产自线拍免费软件
|
日本视频免费在线
|
亚洲国产精品碰碰
|
亚洲人成色7777在线观看
|
亚洲高清在线播放
|
亚洲大片免费观看
|
亚洲精品9999久久久久无码
|
精品特级一级毛片免费观看
|
国产vA免费精品高清在线观看
|
久久精品国产影库免费看
|
**真实毛片免费观看
|
久久精品免费全国观看国产
|
在线观看免费精品国产
|
亚洲一区视频在线播放
|
亚洲精品免费视频
|
亚洲依依成人亚洲社区
|
一边摸一边桶一边脱免费视频
|