メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2009年7月13日月曜日

[Apache Shindig][お勉強][OpenSocial] メモ47 opensocial.hasPermissionを実装してみた

opensocial.hasPermissionがコールされた際、shindigデフォルトだと、
空実装なため、必ずfalseが返ってくる。
面白くないので、実装してみた。

opensocial.hasPermissionのJavaScriptの実装は、
とりあえず、


features/opensocial-jsonrpc/jsonrpccontainer.js

を拡張する。


追加コードは、

JsonRpcContainer.prototype.hasPermissionUrl_ = 'container/hasPermission.json';
JsonRpcContainer.prototype.hasPermission = function(permission) {
var ret = {};
ret.result = null;
var parm = {};
parm.permission = permission;
parm.st = shindig.auth.getSecurityToken();
$.ajax({
type: "GET",
url: this.hasPermissionUrl_ ,
cache: false,
async: false,
data: parm,
dataType: 'json',
success: function(json) {
ret.result = json;
}
});
return ret.result.hasPermission;
};


な感じ。(JavaScriptわからん。。)


/gms/container/hasPermission.xml

にクエストを投げるようにしてみた。


で、サーバ側の実装。Java+Spring+Shindigな環境。

コントローラは、

public class HasPermissionController extends AbstractController {

protected final Log logger = LogFactory.getLog(HasPermissionController.class);
protected String viewName = "";

protected Logic logic;
private HttpUserSessionService session;

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.info("パーミッション判定コントローラ開始");
String permission = RequestUtils.getRequiredStringParameter(request, "permission");

if (logger.isDebugEnabled()) {
logger.info("permission:[" + permission + "]");
}
SecurityToken token = logic.getSecurityToken(request);
String ownerId = token.getOwnerId();
long moduleId = token.getModuleId();
GmsPerson owner = logic.getPersonFromLoginId(ownerId);
if (logger.isDebugEnabled()) {
logger.debug("ownerId:[" + ownerId + "]:"
+ "moduleId:[" + moduleId + "]:"
);
}

String sessionId = null;
try {
sessionId = session.getId(request);
}
catch (UserSessionTimeOutException utoe) {
}

boolean result = logic.hasPermission(sessionId, owner, moduleId, permission);
ModelAndView mav = new ModelAndView(viewName);
mav.addObject("hasPermission", result);

logger.info("パーミッション判定コントローラ終了");

return mav;
}
public void setLogic(Logic logic) {
this.logic = logic;
}
public void setViewName(String viewName) {
this.viewName = viewName;
}
public void setSession(HttpUserSessionService session) {
this.session = session;
}
}

な感じ。logicとかviewNameとかsessionはいい感じにDIでセットすると。

で、肝心のlogic.hasPermissionは、、

public boolean hasPermission(String sessionId, GmsPerson owner, long id, String permission) {
assert owner != null;
assert "VIEWER".equals(permission);

GmsPerson viewer = getUser();

if (viewer == null) {
if (logger.isDebugEnabled()) {
logger.debug("ViewerがGuest:"
+ "パーミッションなし"
);
}
return false;
}

String viewerId = viewer.getId();
String ownerId = owner.getId();

/*=======================================================================*/
/* すでにrequestPermissionされているか. */
/*=======================================================================*/
try {
GmsSessionPermit permit = gmsSessionPermitDao.selectBySessionIdAndModuleIdAndPermission(sessionId, id, permission);
if (logger.isDebugEnabled()) {
logger.debug("すでにrequestPermitされて、権限が付与されている(セッション内だけど)");
}
return true;
}
catch (ObjectRetrievalFailureException ex) {
if (logger.isDebugEnabled()) {
logger.debug("requestPermitされていない");
}
}

/*=======================================================================*/
/* Owner == Viewerの場合 */
/*=======================================================================*/
if (viewerId.equals(ownerId)) {
if (logger.isDebugEnabled()) {
logger.debug("同一人物判定:"
+ "同一人物:"
+ "ownerId:[" + ownerId + "]:"
+ "viewerId:[" + viewerId + "]:"
);
}
return true;
}
if (logger.isDebugEnabled()) {
logger.debug("同一人物判定:"
+ "非同一人物:"
+ "ownerId:[" + ownerId + "]:"
+ "viewerId:[" + viewerId + "]:"
);
}
/*=======================================================================*/
/* viewerも該当ガジェットをインストール済みであればtrue */
/*=======================================================================*/
if (isInstalledGadget(viewer, id)) {
if (logger.isDebugEnabled()) {
logger.debug("ガジェットインストール済み判定:"
+ "Yes:"
+ "ownerId:[" + ownerId + "]:"
+ "viewerId:[" + viewerId + "]:"
+ "ガジェットID:[" + id + "]"
);
}
return true;
}
/*=====================================================================*/
/* インストール済みでなければfalse */
/*=====================================================================*/
if (logger.isDebugEnabled()) {
logger.debug("ガジェットインストール済み判定:"
+ "No:"
+ "ownerId:[" + owner.getId() + "]:"
+ "viewerId:[" + viewer.getId() + "]:"
+ "ガジェットID:[" + id + "]"
);
}
return false;
}


な感じ。
GmsPerson、GmsSessionPermitはValue Object。GmsPersonの方は、実態はほぼopensocial.Personそのまま。
gmsPersonDaoはgms_personというopensocial.PersonそのままなテーブルにアクセスするDAO。
gmsSessionPermitDaoはgms_session_permitという、以下なセッション情報を持っているテーブルへアクセスするDAO。

CREATE TABLE gms_session_permit (
id VARCHAR(64) not null,
session_id VARCHAR(64) not null,
module_id bigint not null,
permission VARCHAR(64),
created_at TIMESTAMP not null,
PRIMARY KEY(id)
)

項目の型やサイズはopensocialをまだ理解できていないので、適当。
auto_incrementすると多少テストが面倒なので、プライマリキーはVARCHAR(64)でUuidがセットされる感じ。テストが面倒な理由は力不足のため。
ログアウトされたりすると、gms_session_permitテーブルのレコードは削除される。

getUser()がコールされると、現在ログイン中のGmsPersonが返される。
ログインしていない(Guest)と、nullが返る。

logic.hasPermissionのパラメータpermissionは今のところ"VIEWER"だけ。
他のopensocial.Permissionな値知らないんで。

ちなみにテーブルはDerby。

で、動かしてみた。

いい感じ。

そんだけ。
--
Javaを本気で勉強した方がいい気がしてきた。。

.

0 コメント: