[Salesforce.com] 時間帯によりログイン制限をしたい。

[要望]
諸事情(内容が内容なので書けませんが・・・)により深夜時間帯(ココでは「3:00~5:00」としておきましょう)にユーザがログインできないように設定したい。

[問題]
標準機能にてログインする時間帯を制御することはできるのですが、以下のような設定しかできません。

  • 曜日を指定して、許可する開始時間と終了時間を指定。
  • 曜日に対して1つのみ

えぇ、曜日に対して1つ。しかも許可する時間帯しか指定できないので「3:00~5:00」となると・・・
なんと!設定できない!!バンザーイ (゚Д゚;)

ほんとねぇ。こんなんばっかでねぇ。やーねー。。


[解決策]
気を取り直して。

社内の有識者にアイディアを2つほど頂き。1つは処理する際にユーザ情報を更新して、ログインできなくしてしまうという案もあるのですが・・・なんか気持ちがわるいのでやりたくないのでもう1つの解決策をば。

その解決策は裏で流通している「サイドバースクリプト」を利用してやってやろうってもの。

※サイドバースクリプトはサポート対象外なので推奨しません!

全ての画面で一様に特定のスクリプトを処理したい場合には、常に表示されるサイドバー上にスクリプトを配置することで実現することができます([設定]-[カスタマイズ]-[ユーザインターフェース]-[すべてのページにカスタムサイドバーコンポーネントを表示]にチェックを入れる必要があります)。

[サイドバースクリプトの例]
例えば、一番手っ取り早いのはホームのお知らせに記述する方法です。

  1. [設定]-[カスタマイズ]-[ホーム]-[ホームページのコンポーネント]-[お知らせ]の「編集」クリック。
  2. 以下のようなスクリプトを書いてみる。

    <script type=”text/javascript”>alert(‘test’);</script>

  3. [設定]-[カスタマイズ]-[ホーム]-[ホームページのページレイアウト]でレイアウトを編集して「お知らせ」を表示するよう設定。

以上の状態でどのタブを表示しても「test」のメッセージが表示されるようになります。

[ログイン制限処理]
やっと本題です。ユーザが「3:00~5:00」の間にログインしようとしたら、ログインさせないようにしなくてはなりません。しかし、ログインさせないようにすることは出来ないので、ログインした後にサイドバースクリプトでログアウトさせる処理を組み込むことで対応します(うーん、苦肉の策!)。とりあえず、以下のようなヘッポコなスクリプトを用意。

<script type="text/javascript">
date = new Date();

var hour = ate.getHours();
if (hour > 2 && hour < 6) {
if(confirm('ログアウトしますか?')){
document.location.href="../secur/logout.jsp";
}
}
</script>

時間指定だけだと設定したが最後、その時間帯にログインできなくなりますから、ここではConfirmをかませてます。つまり、間違ってしまうとずっとログインできなくすることも出来てしまうので基本的にはやらないでください

で、ログアウトの処理は標準で呼んでいた「logout.jsp」に遷移させることで実現しています。まぁ、これもバージョンアップしたら動かなくなる可能性は大いにあります。しかし、顧客の要望を聞き入れたが最後、こういった超えてはいけない壁をいくつも超える羽目になります。。。なので、基本はカスタマイズ出来る範囲で仕様調整するのが大前提です(色々と矛盾してくるんですけどね・・・アハハ)。

尚、設定する際には「改行」を削除してください。何故かはわかりませんが、改行があると動作しなかったので(サポート対象外ですから)。

さて、これで「3:00~5:00」の間にログインしようとしたら、即座にログアウトされるようになります。
(Confirmの記述を取り除けば)

しかし、これには大きな問題があります。
今までそれを考慮しないで書いている時点でおかしいのですが、このままではシステム管理者でも同時間帯にはログイン出来なくなります。さすがにそれは普通にあり得ないので、どうにかしないといけません。どうしたもんか?

[ログイン制限処理(システム管理者除く)]
本来であれば上記のスクリプトでユーザのプロファイル情報を取得して×××ってやってしまえばいいのでしょうけど。どうにもこうにもユーザ情報を取得することができません。「connection.js」をインクルードして、sforceオブジェクト経由で取得を試みたのですがうまくいきませんでした(誰か出来る方法を知っていたら教えてください)。

そこで、次なる手段です。サイドバースクリプトからSコントロールを呼び出すというものです。

まず、種別を「HTML」としてSコントロールを用意します。

function forceLogout() {
if ('{! $Profile.Name }' != 'システム管理者') {
date = new Date();
var hour = date.getHours();
if(hour > 13 && hour < 20){
document.location.href="../secur/logout.jsp";
}
}
}

function addLoadEvent(func) {
var oldonload = window.onload;

if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
addLoadEvent(forceLogout);

続いて、「お知らせ」の中身を書き換えます。

<script type=”text/javascript” src=”/servlet/servlet.Integration?lid=XXXXXXXXXX&enc=UTF-8″></script>

「XXXXXXXXXX」の箇所は作成したSコントロールのIDで書き換えてください。

さて、これでユーザのプロファイルの名称が「システム管理者」以外のユーザで該当する時間にログインしようとすると、強制的にログアウトさせることができるように「何とか」「無理やり」できるように相成りました。

[まとめ]
やってはいけないことをやりまくった結果。完全には問題を回避することはできないことが、残念ながらわかりあmした。何かしらユーザに譲歩していただく部分があります。現状の解決できていない点としては、

  1. JavaScript版だと全てのユーザがログアウトされる。
  2. Sコントロール版だとログアウトされるまでにタイムラグがある。
  3. Sコントロール版だとFirefoxだとタイミングの問題でログアウトの処理が途中で止まる。ログアウトする前にAlertでメッセージを表示するといったワンクッション処理を入れてあげないとダメっぽい。
  4. 画面の再描画のタイミングでログアウトされますが、たまたま時間を跨いだ場合に更新処理等を防ぐことができない。

などなど。

うーん、やっぱりユーザ情報を書き換えないとダメなのかしら。。。やだなぁ。。。
と思っていたら、この方法も微妙であることが発覚・・・ユーザを無効化した場合にはチームオの共有ブジェクトのレコードが全て吹っ飛ぶというすばらしい仕様があるようですから。。

やはり、カスタマイズできる設定で「この時間帯は拒否する」という設定ができるようになることになるのでしょうか。

[追記 2009/2/24]
サイドバースクリプトのみで対応できる方法がありました。
「this.UserContext.userId」にてログインユーザIDを取得することができることがわかったためです。
(ちゃんと調べろよ>ワシ)
例としては以下のような感じになるかと。

<script type="text/javascript">
date = new Date();
var hour = ate.getHours();
if (this.UserContext.userId != '<システム管理者ユーザのユーザID>') {
if (hour > 2 && hour < 6) {
if(confirm('ログアウトしますか?')){
document.location.href="../secur/logout.jsp";
}
}
}
</script>

このスクリプトだとサイドバーが表示されるタイミングでログアウトさせることができます。
赤字の部分を15桁のユーザIDで置き換えてください)
えぇ、あくまで「無理やり」なので無理はしないでください。

[Salesforce.com] 時間帯によりログイン制限をしたい。

コメントを残す