2017년 2월 6일 월요일

사이트코어 - 비활동중인 유저의 잠김 아이템을 풀림으로 설정하기 - Sitecore

일반 웹사이트들처럼 사이트코어 CMS는 Logout을 통하여 현재 로그인한 유저의 정보를 Session에서 삭제할수가 있다. 보통 유저들은 (나 역시,) CMS 작업 후, Logout 대신 브라우저의 X버튼을 누르면, 마치 로그아웃이 된 듯 CMS를 클로즈 한다. 여기에서 하나의 문제점이 있다.

사이트코어는 SessionID에 해당 유저가 여전히 존해하는것으로 알고, Idle 유저 또는 Inactive 유저로 인식한다. 고로, 해당 유저가 CMS 작업을 마친 후, 아이템 풀림을 설정하지 않고, 브라우저를 클로즈해버리면, 다른 유저들은 해당 아이템이 Unlock 될때가지 작업을 할수가 없다.

사이트코어의 기본적인 세팅으로, 아이템을 수정하기 위해서는 유저가 받드시 아이템 잠김상태를 하여, 다른 유저가 중복적으로 수정하지 못하도록 하여야 한다. 만일, 다른 유저가 잠김 상태의 아이템 수정을 필요로 하면, 잠금을 한 유저에게 풀림을 요청하던지, 아니면 관리자 (슈퍼 어드민) 에게 요청을 해야한다.

이런 불편함을 덜 하기위하여, 이번에 강제추방(?)의 클래스를 추가하였다.

아래의 코드는 사이트코어의 Session 정보를 받아들여 Session 정보에 들어있는 유저들의 마지막 활정 시간을 가져온다. DomainAccessGuard 클래스는 유저세션 정보를 가져오는 클래스로써, 만약 특정 유저의 마지막 활동이 현재 시간보다 55분 (config 파일 설정)이 초과하였을 경우, 해당의 유저가 잠금을 한 모든 아이템을 풀림으로 설정을 한다.


 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
32
33
34
35
36
37
38
39
40
namespace YourNamespace.Unlock
{
    public class UnlockItemWhenIdle
    {
        private TimeSpan maximumIdleTime;

        public UnlockItemWhenIdle(string maximumIdleTime)
        {
            this.maximumIdleTime = TimeSpan.Parse(maximumIdleTime);
        }

        public void Run()
        {
            List<DomainAccessGuard.Session> userSessionList = DomainAccessGuard.Sessions;

            if (userSessionList != null && userSessionList.Count > 0)
            {
                foreach (DomainAccessGuard.Session userSession in userSessionList.ToArray())
                {
                    TimeSpan span = (TimeSpan)(DateTime.Now - userSession.LastRequest);

                    if (span > this.maximumIdleTime)
                    {
                        string currentUserName = userSession.UserName;

                        var database = Sitecore.Configuration.Factory.GetDatabase("master");
                        Item[] items = database.SelectItems("fast:/sitecore/content//*[@__lock='%" + currentUserName + "%']");
                        
                        foreach (var item in items)
                        {
                            item.Editing.BeginEdit();
                            item.Locking.Unlock();
                            item.Editing.EndEdit();
                        }
                    }
                }
            }
        }
    }
}

아래의 코드는 Maximum inactive 시간을 설정하는 config 파일이다. 새로운 .config 파일을 만들어도 되며, 또는 Sitecore.config 혹은 web.config 파일의 스케쥴 노드에 추가하면 된다. 필자는 `/Website/App_Config/Include/` 폴더에 `YourNamespace.Unlock.config` 파일을 만들었다. 스케쥴은 5분만다 한번씩 유저 정보를 체크하는것으로 되어있으며, 마지막 활동이 55분을 초과하면 강제추방이 작동하도록 설정을 하였다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
    <sitecore>
        <scheduling>
            <!-- kick users who are idle for 55 minutes -->
            <agent type="YourNamespace.Unlock.UnlockItemWhenIdle, YourNamespace.Unlock" method="Run" interval="00:05:00">
                <param desc="maximumIdleTime">00:55:00</param>
            </agent>
        </scheduling>
    </sitecore>
</configuration>