]> git.argeo.org Git - gpl/argeo-slc.git/blob - AbstractSystemExecution.java
27857e4cf291502be01b24833684c43b159df5cc
[gpl/argeo-slc.git] / AbstractSystemExecution.java
1 package org.argeo.slc.spring;
2
3 import javax.security.auth.Subject;
4 import javax.security.auth.login.LoginContext;
5 import javax.security.auth.login.LoginException;
6
7 import org.argeo.api.cms.CmsAuth;
8 import org.argeo.api.cms.CmsLog;
9 import org.argeo.slc.SlcException;
10
11 /** Provides base method for executing code with system authorization. */
12 abstract class AbstractSystemExecution {
13 private final static CmsLog log = CmsLog.getLog(AbstractSystemExecution.class);
14 private final Subject subject = new Subject();
15
16 /** Authenticate the calling thread */
17 protected void authenticateAsSystem() {
18 ClassLoader origClassLoader = Thread.currentThread().getContextClassLoader();
19 Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
20 try {
21 LoginContext lc = new LoginContext(CmsAuth.LOGIN_CONTEXT_DATA_ADMIN, subject);
22 lc.login();
23 } catch (LoginException e) {
24 throw new SlcException("Cannot login as system", e);
25 } finally {
26 Thread.currentThread().setContextClassLoader(origClassLoader);
27 }
28 if (log.isTraceEnabled())
29 log.trace("System authenticated");
30 }
31
32 protected void deauthenticateAsSystem() {
33 ClassLoader origClassLoader = Thread.currentThread().getContextClassLoader();
34 Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
35 try {
36 LoginContext lc = new LoginContext(CmsAuth.LOGIN_CONTEXT_DATA_ADMIN, subject);
37 lc.logout();
38 } catch (LoginException e) {
39 throw new SlcException("Cannot logout as system", e);
40 } finally {
41 Thread.currentThread().setContextClassLoader(origClassLoader);
42 }
43 }
44
45 protected Subject getSubject() {
46 return subject;
47 }
48 }