Spring의 서브프로젝트 중 가장 오래됐고 활발한 활동을 하면서 거의 Spring Core Framework(SFW)만큼 인기가 있는 것을 꼽으라면 단연 Acegi Security Framework(ASF)일 것이다.

ASF를 처음 공부한 것은 Spring In Action 1판(SIA)을 통해서였다. Security와 관련된 한 chapter에서 Acegi를 설명하고 있었다. 하지만 나는 그것을 보고 반갑다기 보다는 화가났다. 가뜩이나 정보가 없던 2004년 초기에 처음으로 나온 Spring책이라고 구입했던 SIA은 내 기대와 달리 너무나 얇은 500페이지도 안되는 책이었다. 게다가 내가 가장 절실하게 정보를 많이 필요로 하는 SpringMVC에 대해서는 너무나 간단하게 밖에 설명을 하지 않았다. 그런데 그 적은 분량에 수십페이지를 Spring Core도 아닌 발음도 어떻게 할지 고민되는 이상한 이름의 프레임워크의 낭비를 하다니!

SIA의 Acegi와 관련된 내용을 읽어보았으나 감도 잘 안잡히고 이미 진행하고 있는 SFW기반의 프로젝트에서는 SpringAOP를 이용해서 구현한 자체 Security Framework이 있었기 때문에 그 이상 관심을 가지지 않게 되었다. 그 후에 Pro Spring을 읽을 때도 별로 관심이 없었으니 패스.

한참 후에 Rod Johnson이 쓴 Professional Java Development with Spring Framework를 읽어보니 또 Acegi가 한 챕터를 차지하고 있었다. 그 때부터 맘먹고 Acegi를 공부하기 시작했다. 하지만 그 부분을 여러번 읽고 정리를 해도 이를 당장 어떻게 적용해서 쓸 수 있는지 간단히 그림이 그려지지 않았다. 상당히 방대하고 확장성이 뛰어난 프레임워크인데 역시 한 챕터로 설명하기에는 부족한 것 같다. 대신 기본 인터페이스 구조와 아이디어를 정리할 수 있는 것은 수확이었다. 3가지 대표적인 보안과 DAO를 이용한 인증부분의 연동에 대한 이해는 성공.

그 후에 현재 참여하고 있는 프로젝트에 Acegi를 적용하려고 작정하고 본격적으로 연구를 시작했다. 그 사이 Acegi공부에 애를 쓰고 있는 재성님과 Acegi 별거 아니라며 우습게 보고 있는 영회님의 이야기를 들었다. 

먼저 Acegi를 다운 받아서 그 안에 있는 문서와 샘플을 보면서 공부를 시작했다.

레퍼런스 문서를 여러번 읽었지만 자세하고 깔끔하게 정리된 문서는 아니라서 그런지 완벽한 그림이 그려지지는 않았다. 대신 레퍼런스 문서를 통해서 SecurityContext가 만들어지는 과정과 그 활용에 대한 개념에 대한 정리를 깔끔하게 할 수 있었다. OSAF에서 내가 구현한 Context와 비슷한 개념이고 확장수준도 유사하면서

결국 남은 것은 실전. 문제는 Acegi가 bean한두개 설치한다고 동작하는 것이 아니라는 점이다. Security란 상당히 복잡한 기술이다. 구성요소도 많고 인증방법이나 권한설정 또 다양한 예외상황처리등의 문제들을 다 다룰 수 있고 특정 시스템에 맞게 customizing하는 작업이 필수다.

가장 좋은 출발점은 Acegi에 포함되어있는 두개의 샘플을 분석하는 것이다. Tutorial샘플은 간단한 URL기반의 웹보안 기능을 구현해 놓은 것이다. 복잡함을 피하기 위해서 유저정보는 memory dao를 이용해서 xml안에 설정해놓은 것을 사용한다.

이 샘플을 통해서 Acegi의 동작의 상세한 순서와 방법, 내부 구조등을 이해할 수 있었다.

먼저 할 일은 이 샘플에 나온 bean들간의 상관관계를 의존성 중심으로 풀어보는 것이다. 특히 간단하게 만들려고 inner bean으로 설정된 것은 다 밖으로 빼내서 보는 것이 좋다. 하지만 이 초간단 acegi설정에만 24개의 bean이 나온다는 사실.

이것을 풀어나가면서 이해하기 위해서 내가 새로운 기술을 학습할 때 애용하는 방법을 적용했다. 그것은 동작하는 가장 심플한 샘플로 만들기. 이 샘플의 xml설정을 내가 기능 테스트용으로 사용하는 심플한 Spring프로젝트에 적용을 했다.

먼저 목표는 에러가 나지 않는 가장 간단한 Acegi설정 만들기. Spring의 bean을 servlet filter로 만들어주는 FilterToBeanProxy를 web.xml에 설정해주고 이를 FilterChainProxy에 연동시켰다.

FilterChainProxy는 그 이름이 말해주듯이 여러개의 security용 filter bean들을 순처적으로 적용시켜주는 역할을 한다.

초간단 왕초보용 샘플에 있는 필터의 갯수는

  • httpSessionContextIntegrationFilter
  • logoutFilter
  • authenticationProcessingFilter
  • securityContextHolderAwareRequestFilter
  • rememberMeProcessingFilter
  • anonymousProcessingFilter
  • exceptionTranslationFilter
  • filterInvocationInterceptor

총 8개. 이것을 하나씩 각개격파하면서 진행을 해야한다.

이해하기 가장 쉬운 방법은 일단 최소한의 필터만 남겨보는 것. logout은 나중에 해도 되니까 logoutFilter빼고, rememberMe도 없어도 되니까 빼고. exceptionTranslation은 이름이 왠지 예외에만 적용되는 것 같아 빼고 httpSessionContextIntegration도 이름이 기니까 빼고. 등등의 작업을 통해서 정리해보면 1-2개의 필터만 남겨 놓아도 동작을 한다.(그게 뭐였는지는 지금 기억이 나지 않는다. -_-  하나도 안남기고 제외하면 에러가 난다. 그 상태에서 의존 jar파일들을 하나씩 체크해서 추가한다. 일단 인증동작은 하지 않더라도 deploy되는 것을 성공시킨다.

그리고 하나씩 필터의 역할을 추적해가면서 다음 작업 목표를 선택한다.

두번째는 login창 띄우기. 이부분을 추적하는 것이 좀 시간이 걸렸는데 그 이유는 exceptionTranslationFilter을 무시했던 탓이다. exceptionTranslationFilter는 filterInvocationInterceptor을 통해서 인증,권한에서 익셉션이 발생하면 그것을 캐치해서 적절한 동작을 하도록 해주는 역할을 한다. Throw – Catch구조가 filter chain사이에서 발생하는 구조라고 생각하면 쉽다. 인증정보가 전혀 없다면 authenticationEntryPoint로 처리해주는데 여기서 다양한 인증프로세스를 적용할 수 있다. 가장 쉬운 것은 html form을 이용하는 것. 그 외에 인증은 됐으나 권한이 없을 경우 적용할 수 있는 accessDeniedHandler도 등록을 해주면 된다.

처음에 테스트 해볼 때는 exceptionTranslationFilter빼고 exception이 밖으로 던져지게 하는 것이 좋다. 그러면 어떤 exception이 발생하는지를 직접 확인할 수 있기 때문이다. 그리고 나서 간단한 인증form을 만들어 적용해보고 그리로 redirect되는지 확인한다.

여기까지하면 가장 기초가 되는 부분에 대한 이해 성공.

이제 좀 디테일한 부분으로 들어가서 URL기반의 웹보안을 담당하는 FilterSecurityInterceptor을 세밀히 들여다본다. 여기서 ROLE과 URL Path의 설정구조를 확인할 수 있다. 재밌는 것은 그 설정부분이 그냥 단순 텍스트로 되어있다는 것.

<property name=”objectDefinitionSource”>
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/secure/extreme/**=ROLE_SUPERVISOR
/secure/**=IS_AUTHENTICATED_REMEMBERED
/**=IS_AUTHENTICATED_ANONYMOUSLY
</value>
</property>

바로 체크해볼 것은 저런 텍스트로 표현된 것을 받아들이는 PropertyEditor를 찾는 것이다. FilterInvocationDefinitionSourceEditor이 해당 PropertyEditor이다. 이를 확인해보는 것은 샘플과 같이 xml에 Path-Role을 설정하면 상관없지만 DB등에 그 정보를 넣거나 외부 파일에서 가져오는 등의 필요가 있다면 이를 확장해서 써야 하기 때문이다. 나는 고객의 요구에 따라 ROLE등록부터 설정까지를 모두 다이나믹하게 해야 한다. PathBasedFilterInvocationDefinitionMap를 확장해서 DAO를 통해서 Path-URL정보를 생성해서 넘겨주면 OK. 포럼에 가서 유사한 질문이 있었나 확인한다. 역시 비슷한 질문이 여럿있다. 내가 찾은 방법이 맞는 것을 확인한다. Acegi를 만든 Ben Alex의 답변까지 확인했으니 이대로 가면 되는 것을 확인 끝.

보통 Acegi자료나 문서에는 UserDetail이나 인증쪽을 확장하는 것은 많이 있지만 이 secure url정보를 확장하는 것에 대한 언급은 없다. 하지만 샘플을 잘 분석하면 Acegi의 수많은 확장 포인트가 보인다. 쉽게 적용가능한 것은 역시 의존성을 맘대로 설정할 수 있는 Spring IoC덕분이다.

다음은 인증부분. 인증쪽은 쉽다. authenticationManager bean을 설정한 후 AuthenticationProvider를 등록해주면 된다. Acegi의 장점은 여러가지 인증기능을 조합해서 사용할 수 있다는 것이다. 기본 샘플만해도 daoAuthenticationProvider, AnonymousAuthenticationProvider, RememberMeAuthenticationProvider세가지의 인증을 모두 적용해놨다. 먼저 DAO를 통해서 인증을 체크하고 실패하면 Anonymous와 RememberMe를 적용한다.

DAOAuthentication은 기본 틀만 유지한채로 간단히 확장할 수도 있고 이미 Acegi에 구현되어있는 DAOAuthenticationProvider를 간단히 확장해서 사용해도 된다. 샘플은 AppFuse에 잘 되어있다. :)

마지막으로 httpSessionContextIntegrationFilter. 이것은 인증정보를 session에 담아서 저장하는 것을 처리한다. 단일서버에 유저가 많지 않을 경우 적용하면 적당한 방법이다. Clustering을 위한 non-session기반의 기능도 포함되어있다. 좀 더 다른 방식의 인증정보보존 방법을 사용하려 한다면 ContextIntegrationFilter를 확장해서 만들면 되겠지라고 생각했으나 소스를 보니 확장구조가 없다. 참조해서 직접 만들어야 할 것 같다. 아니면 관련 기능을 만들어 놓은 사례를 찾아보거나.

그 외에도 Channel(HTTP, HTTPS)보안이나 다양한 인증연동방법(LDAP, JAAS, WAS…) 등의 다양한 기능도 한번씩 살펴보면 좋겠다. Acegi의 유연한 확장성을 활용하면 새로운 보안기능을 추가하는 것은 아주 간단하다.

이제 남은 것은 이렇게 인증과정과 웹보안 과정을 거쳐서 생성된 SecurityContext정보를 활용하는 것이다. SecurityContext는 ThreadLocal로 저장된다. 필요하면 애플리케이션에서 직접 User정보를 얻어서 활용해도 된다. 나의 다음 작업은 OSAF의 Context.User정보와 Acegi의 SecurityContext의 Principal정보를 연동하게 하는 것. User인터페이스를 확장해서 SecurityContext에서 정보를 끌어오게 만드는 것으로 끝. OSAF의 확장성도 쓸만하다.

Service layer의 메소드 권한체크나 Acl을 통한 DomainObject보안은 그런 응용사례의 하나이다.

이제 contacts-fiulter샘플을 볼 차례이다. 여기서는 method 권한체크와 Acl을 통한 Domain object권한기능을 적용한 좀 더 복잡한 샘플을 볼 수 있다.

이 정도 과정을 거치면 Acegi에 대한 기본적인 이해를 할 수 있을 것이다.

그 후에 할 일은 각각 시스템에 어떤 보안정책을 적용할 것인지에 대한 결정과 그에 따른 Acegi의 확장부분을 개발하는 일이다.

최근에 Spring2.0을 통해서 AspectJ의 활용도가 높아졌다. 이로 인해서 AspectJ를 이용한 각종 보안기법들이 사용되기 시작했는데 앞으로 AspectJ를 본격적으로 활용한 각종 보안부분과 Acegi가 어떻게 결합되어서 사용되어질지가 흥미롭다.

Acegi는 ‘애씨지’ 또는 ‘아씨지’라고 발음한다. Acegi Technology라는 회사를 통해 IT컨설팅일을 하던 호주(앗싸 또 호주다)의 Ben Alex가 만들었고 Acegi라는 이름은 고대 신화에 나오는 신의 이름의 하나이기도 하고 알파벳 a부터 하나씩 건너뛰어서 만든 이름이라고도 한다. 별 뜻은 없다. :)

소스코드를 통해서 본 Acegi의 코드품질은 Spring만큼 완벽에 가까운 것은 아니다. 하지만 복잡한 보안쪽을 매우 유연하게 설계한 점에서 인정!

어제 물개가 Acegi를 가르쳐 달라고 해서… 그 대신으로 공부방법을 가르쳐 주기로 하고 정리한 글 끝.

Related posts:

  1. Spring Framework 2.5 Released
  2. Spring Framework 3.0.3 릴리스 & 의존 라이브러리
  3. Spring Framework 1.1.3 released
  4. Java Web Framework 비교(Struts, Spring, WebWork, Tapestry, JSF)
  5. Spring Framework 1.1.2 released
  6. Application Framework 개발의 원칙
  7. A Framework is… / Kent Beck
  8. 스프링과 하이버네이트를 이용한 RAD프레임워크 – OSAF(OpenSprout App. Framework) 공개
  9. The Spring Experience 둘째날
  10. Spring 3.0 (35) Spring 3.0 Reference Document 공개
  11. Spring 3.0 (4) – Maven에서 Spring 3.0 최신버전 사용하기
  12. Spring 3.0 (38) Spring Reference 업데이트
  13. Spring 3.0 (44) Spring 3.0과 JEE6
  14. Spring 3.0 (26) Spring Expression Language와 @Value
  15. Spring 공부 다시 시작

Facebook comments:

to “나의 Spring Acegi Security Framework 학습기”

  1. Thanks a lot for the helpful content. It is also my belief that mesothelioma cancer has an very long latency period of time, which means that indication of the disease might not exactly emerge till 30 to 50 years after the preliminary exposure to asbestos fiber. Pleural mesothelioma, which is the most common kind and is affecting the area within the lungs, might result in shortness of breath, chest muscles pains, and a persistent coughing, which may lead to coughing up blood vessels.

  2. I simply desired to appreciate you once more. I do not know what I would have used without the type of recommendations shown by you relating to such subject. It actually was a frustrating circumstance in my position, however , finding out your well-written style you resolved the issue made me to leap over gladness. I’m just happy for your service and thus believe you recognize what a great job you happen to be putting in training some other people using a blog. Probably you have never met any of us.

  3. I like what you guys are up also. Such smart work and reporting! Keep up the excellent works guys I’ve incorporated you guys to my blogroll. I think it will improve the value of my site :) .

  4. kamagra australia
    When thinking about buying life insurance, do not allow any time be wasted. Postponing the choice is never a very good thing. Life coverage is really important for yourself, but most essentially your family members, that purchasing an insurance coverage without delay is encouraged. Also always keep a current will or trust.
    kamagra jelly
    When your upcoming lease residence or flat complex allows you to hold a lawn selling or garage area purchase, inquire further if you’re allowed to article your symptoms inside the intricate for example light poles or plant stumps. Some home managements do not allow the screen of any sort of ads openly.
    dapoxetin kaufen
    A fantastic fishing suggestion would be to understand the enhanced clinch knot for tying your fishing lures or bait in your series. This knot is simply and is the best way to guarantee that the lure is definitely not misplaced into a snag or when battling a fish. Like most knots, make sure you process, process, process.
    viagra hinta

  5. cialis prix
    Use your web site reputation for all e-mail you send out. Getting your domain name for your e mail label factors individuals to recall your small business, that can help them discover your internet site again. Additionally, it may get your name out there if the client would decide to forward your e mail to other folks.
    acheter levitra
    When you have made the decision of filing for private personal bankruptcy, don’t run off and strive to obtain a lot of stuff, like garments and precious jewelry, with your charge card well before filing. You can’t cheat the machine. You will often nevertheless be asked to repay the debt that you may have obtained.
    levitra suisse
    An effective multi-objective instrument has to be a part of your camping gear. There are two types to bring. Initial is definitely the noticed/hammer/axe 3-in-1 tool for firewood as well as other duties. Another will be the normal multi-objective device with a number of equipment upon it just like a can opener, tweezers, scissors, plus a knife.
    Vardenafil Ă–sterreich

  6. Nice read, I just passed this onto a friend who was doing a little research on that. And he just bought me lunch since I found it for him smile Thus let me rephrase that: Thank you for lunch!

  7. I loved as much as you will receive carried out right here. The sketch is tasteful, your authored material stylish. nonetheless, you command get bought an shakiness over that you wish be delivering the following. unwell unquestionably come more formerly again since exactly the same nearly a lot often inside case you shield this hike.

  8. I consider something genuinely special in this internet site.

  9. Levitra bayer
    People that have curly hair should avoid style with heating frequently. Golf irons that reach over a number of hundred degrees can in fact forever change the helices of your curls. This results in curls which are not consistent, and persists a reliance on the hair steel or blow clothes dryer. Figure out how to really like your curls and they can compensate you with certainty!
    levitra generico
    Use only posted requirements to authenticate your markup or site appearance. You need to make every effort to use every header label whenever possible and framework your website information that it is presented evidently and in a reasonable, hierarchical get. This will make it easier for a number of search engine services to examine and position your site.
    priligy österreich
    Listed here is a memory suggestion! Keep in mind anything by categorizing it in your mind. As a result recall much simpler! For instance, if you are intending to look meals shopping bear in mind beef and will point out to you you need poultry, meat and pork.
    viagra 100 mg

  10. This really answered my downside, thank you!

  11. I’ve been browsing on-line more than 3 hours as of late, but I never found any interesting article like yours. It¡¦s beautiful worth sufficient for me. In my view, if all site owners and bloggers made just right content material as you probably did, the net will be much more helpful than ever before.

  12. Only wanna say that this is very useful , Thanks for taking your time to write this.

  13. It is indeed my belief that mesothelioma is actually the most lethal cancer. It has unusual traits. The more I look at it the more I am convinced it does not act like a real solid cells cancer. If perhaps mesothelioma is actually a rogue viral infection, in that case there is the chance of developing a vaccine and offering vaccination for asbestos uncovered people who are really at high risk of developing potential asbestos connected malignancies. Thanks for discussing your ideas for this important health issue.

  14. I have been exploring for a little bit for any high quality articles or blog posts on this kind of area . Exploring in Yahoo I at last stumbled upon this site. Reading this information So i am happy to convey that I have an incredibly good uncanny feeling I discovered just what I needed. I most certainly will make certain to do not forget this web site and give it a look regularly.

  15. I’m not sure exactly why but this website is loading very
    slow for me. Is anyone else having this problem or is it a issue on my end?
    I’ll check back later and see if the problem still exists.

  16. I have learn some just right stuff here. Certainly worth bookmarking for revisiting. I wonder how so much attempt you place to make this sort of excellent informative site.

  17. hi!,I love your writing very a lot! share we communicate more approximately your post on AOL? I require an expert in this area to resolve my problem. May be that is you! Looking ahead to look you.

  18. Simply desire to say your article is as amazing. The clarity in your post is just great and i can assume you’re an expert on this subject. Well with your permission let me to grab your feed to keep up to date with forthcoming post. Thanks a million and please keep up the enjoyable work.

  19. Thank you for sharing all these wonderful posts. In addition, the right travel and also medical insurance system can often ease those issues that come with visiting abroad. A new medical emergency can quickly become extremely expensive and that’s bound to quickly set a financial burden on the family’s finances. Putting in place the excellent travel insurance deal prior to leaving is worth the time and effort. Thank you

  20. It is really a nice and helpful piece of information. I am glad that you shared this useful info with us. Please keep us up to date like this. Thank you for sharing.

  21. Thank you, I’ve recently been searching for info about this topic for ages and yours is the greatest I’ve discovered so far. But, what about the bottom line? Are you sure about the source?

  22. I do agree with all the ideas you have introduced for your post.
    They’re really convincing and will definitely work.
    Still, the posts are too brief for novices. May just you please lengthen them a
    bit from next time? Thanks for the post.

  23. Hi, Neat post. There’s a problem with your web site in internet explorer, would test this… IE still is the market leader and a big portion of people will miss your magnificent writing because of this problem.

  24. You could definitely see your skills in the work you write. The world hopes for more passionate writers such as you who are not afraid to mention how they believe. Always follow your heart.

  25. Thanks for giving your ideas. I’d also like to say that video games have been ever evolving. Today’s technology and improvements have made it easier to create practical and interactive games. These types of entertainment games were not really sensible when the real concept was first of all being tried out. Just like other areas of technological innovation, video games too have had to advance through many generations. This is testimony for the fast progression of video games.

  26. priligy kopen
    Have a close up eye in your situation to make sure each of the facts are correct when using an attorney’s services to prevent issues. When an attorney will help you with forms, since they have multiple clientele, it is possible for the lawyer to transmit inappropriate information and facts to the courts. Verify everything necessary to avoid delays and reduce the chance of dropping your situation.
    kamagra 100
    In case you are serious about dental care health, it is imperative that you stop smoking. Cigarette smoking is horrible for your pearly whites often. It discolors them, and problems your gums as well. As soon as your gums don’t get sufficient blood flow supply, you happen to be vulnerable to numerous health conditions including gum illness.
    cialis zonder voorschrift
    The info in the following paragraphs is just a beginning point, so placed these guidelines to use and then understand up to it is possible to as you build your committing technique. When income will keep growing to suit your needs, keeping yourself along with the latest knowledge and technique for investing will assist you to do well.Swift Strategies For Those Purchasing Professional Real Estate Property
    viagra kokemuksia

  27. Mobile valeting Swindon, mobile valet, Mobile valeting, mobile valet, Mobile valeting, mobile valet

  28. Thanks for your write-up. I also feel that laptop computers have grown to be more and more popular today, and now will often be the only type of computer used in a household. This is due to the fact that at the same time that they’re becoming more and more very affordable, their processing power keeps growing to the point where there’re as highly effective as desktop computers from just a few years ago.

  29. You could certainly see your expertise within the paintings you write. The world hopes for even more passionate writers such as you who are not afraid to mention how they believe. All the time go after your heart.

  30. porno begenisi cialis viagra porn porno begenisi cialis viagra porn

  31. porno begenisi cialis viagra porn porno begenisi cialis viagra porn

  32. porno begenisi cialis viagra porn porno begenisi cialis viagra porn

  33. porno begenisi cialis viagra porn porno begenisi cialis viagra porn

  34. porno begenisi cialis viagra porn porno begenisi cialis viagra porn

  35. It’s appropriate time to make a few plans for the future and
    it’s time to be happy. I’ve learn this post and if I could I want to suggest you few interesting issues or suggestions.
    Maybe you could write next articles referring to this article.
    I wish to read even more issues about it!

  36. Wow, amazing blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your web site is fantastic, as well as the content!

  37. Hello my friend! I want to say that this post is amazing, nice written and include approximately all vital infos. I would like to look extra posts like this.

  38. Thanks for another informative website. Where else could I get that kind of information written in such a perfect way? I have a project that I am just now working on, and I have been on the look out for such info.

  39. You completed certain good points there. I did a search on the subject matter and found nearly all folks will agree with your blog.

  40. Nice read, I just passed this onto a friend who was doing a little research on that. And he just bought me lunch as I found it for him smile So let me rephrase that: Thank you for lunch!

  41. I needed to thank you for this good read!! I definitely enjoyed
    every little bit of it. I’ve got you book-marked to look at
    new stuff you post…

  42. There’s certainly a lot to learn about this topic. I really like all of the points you have made.

  43. With havin so much content do you ever run into any issues of plagorism or copyright violation? My site has a lot of exclusive content I’ve either written myself or outsourced but it appears a lot of it is popping it up all over the internet without my authorization. Do you know any techniques to help protect against content from being ripped off? I’d truly appreciate it.

  44. Fantastic web site. A lot of useful information here. I’m sending it to a few friends ans additionally sharing in delicious. And of course, thank you to your effort!

  45. Simply desire to say your article is as astounding. The clearness in your post is just great and i can assume you’re an expert on this subject. Well with your permission allow me to grab your feed to keep updated with forthcoming post. Thanks a million and please continue the gratifying work.

  46. Do you have a spam issue on this website; I also am a blogger, and I was wanting to know your situation; we have developed some nice methods and we are looking to exchange methods with other folks, please shoot me an e-mail if interested.

  47. I do accept as true with all the concepts you have offered in your post.
    They are very convincing and can definitely work.
    Nonetheless, the posts are too quick for novices. May just you please prolong them a little from next
    time? Thank you for the post.

  48. You made some decent points there. I looked on the internet for the issue and found most individuals will agree with your blog.

  49. Just wanna remark that you have a very decent internet site , I like the layout it really stands out.

  50. Hello.This article was extremely remarkable, especially since I was browsing for thoughts on this matter last week.

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha