keycloak-service
公開メンバ関数 | 限定公開変数類 | 静的限定公開変数類 | 非公開メンバ関数 | 非公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.services.resources.WelcomeResource クラス
org.keycloak.services.resources.WelcomeResource 連携図
Collaboration graph

公開メンバ関数

 WelcomeResource (boolean bootstrap)
 
Response getWelcomePage () throws URISyntaxException
 
Response createUser (final MultivaluedMap< String, String > formData)
 
Response getResource (@PathParam("path") String path)
 

限定公開変数類

HttpHeaders headers
 

静的限定公開変数類

static final Logger logger = Logger.getLogger(WelcomeResource.class)
 

非公開メンバ関数

Response createWelcomePage (String successMessage, String errorMessage)
 
Theme getTheme ()
 
void checkBootstrap ()
 
boolean isLocal ()
 
boolean isLocalAddress (InetAddress inetAddress)
 
String setCsrfCookie ()
 
void expireCsrfCookie ()
 
void csrfCheck (final MultivaluedMap< String, String > formData)
 

非公開変数類

boolean bootstrap
 
KeycloakSession session
 

静的非公開変数類

static final String KEYCLOAK_STATE_CHECKER = "WELCOME_STATE_CHECKER"
 

詳解

著者
Stian Thorgersen

構築子と解体子

◆ WelcomeResource()

org.keycloak.services.resources.WelcomeResource.WelcomeResource ( boolean  bootstrap)
inline
79  {
80  this.bootstrap = bootstrap;
81  }
boolean bootstrap
Definition: WelcomeResource.java:71

関数詳解

◆ checkBootstrap()

void org.keycloak.services.resources.WelcomeResource.checkBootstrap ( )
inlineprivate
225  {
226  if (bootstrap) {
227  bootstrap = new ApplianceBootstrap(session).isNoMasterUser();
228  }
229  }
boolean bootstrap
Definition: WelcomeResource.java:71
KeycloakSession session
Definition: WelcomeResource.java:77

◆ createUser()

Response org.keycloak.services.resources.WelcomeResource.createUser ( final MultivaluedMap< String, String >  formData)
inline
105  {
106  checkBootstrap();
107 
108  if (!bootstrap) {
109  return createWelcomePage(null, null);
110  } else {
111  if (!isLocal()) {
112  ServicesLogger.LOGGER.rejectedNonLocalAttemptToCreateInitialUser(session.getContext().getConnection().getRemoteAddr());
113  throw new WebApplicationException(Response.Status.BAD_REQUEST);
114  }
115 
116  csrfCheck(formData);
117 
118  String username = formData.getFirst("username");
119  String password = formData.getFirst("password");
120  String passwordConfirmation = formData.getFirst("passwordConfirmation");
121 
122  if (username == null || username.length() == 0) {
123  return createWelcomePage(null, "Username is missing");
124  }
125 
126  if (password == null || password.length() == 0) {
127  return createWelcomePage(null, "Password is missing");
128  }
129 
130  if (!password.equals(passwordConfirmation)) {
131  return createWelcomePage(null, "Password and confirmation doesn't match");
132  }
133 
135 
136  ApplianceBootstrap applianceBootstrap = new ApplianceBootstrap(session);
137  if (applianceBootstrap.isNoMasterUser()) {
138  bootstrap = false;
139  applianceBootstrap.createMasterRealmUser(username, password);
140 
141  ServicesLogger.LOGGER.createdInitialAdminUser(username);
142  return createWelcomePage("User created", null);
143  } else {
144  ServicesLogger.LOGGER.initialUserAlreadyCreated();
145  return createWelcomePage(null, "Users already exists");
146  }
147  }
148  }
boolean bootstrap
Definition: WelcomeResource.java:71
KeycloakSession session
Definition: WelcomeResource.java:77
boolean isLocal()
Definition: WelcomeResource.java:231
Response createWelcomePage(String successMessage, String errorMessage)
Definition: WelcomeResource.java:174
void expireCsrfCookie()
Definition: WelcomeResource.java:259
void csrfCheck(final MultivaluedMap< String, String > formData)
Definition: WelcomeResource.java:265
void checkBootstrap()
Definition: WelcomeResource.java:225

◆ createWelcomePage()

Response org.keycloak.services.resources.WelcomeResource.createWelcomePage ( String  successMessage,
String  errorMessage 
)
inlineprivate
174  {
175  try {
176  Theme theme = getTheme();
177 
178  Map<String, Object> map = new HashMap<>();
179 
180  map.put("productName", Version.NAME);
181 
182  map.put("properties", theme.getProperties());
183 
184  URI uri = Urls.themeRoot(session.getContext().getUri().getBaseUri());
185  String resourcesPath = uri.getPath() + "/" + theme.getType().toString().toLowerCase() +"/" + theme.getName();
186  map.put("resourcesPath", resourcesPath);
187 
188  map.put("bootstrap", bootstrap);
189  if (bootstrap) {
190  boolean isLocal = isLocal();
191  map.put("localUser", isLocal);
192 
193  if (isLocal) {
194  String stateChecker = setCsrfCookie();
195  map.put("stateChecker", stateChecker);
196  }
197  }
198  if (successMessage != null) {
199  map.put("successMessage", successMessage);
200  }
201  if (errorMessage != null) {
202  map.put("errorMessage", errorMessage);
203  }
204  FreeMarkerUtil freeMarkerUtil = new FreeMarkerUtil();
205  String result = freeMarkerUtil.processTemplate(map, "index.ftl", theme);
206 
207  ResponseBuilder rb = Response.status(errorMessage == null ? Status.OK : Status.BAD_REQUEST)
208  .entity(result)
209  .cacheControl(CacheControlUtil.noCache());
210  BrowserSecurityHeaderSetup.headers(rb, BrowserSecurityHeaders.defaultHeaders);
211  return rb.build();
212  } catch (Exception e) {
213  throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
214  }
215  }
boolean bootstrap
Definition: WelcomeResource.java:71
KeycloakSession session
Definition: WelcomeResource.java:77
boolean isLocal()
Definition: WelcomeResource.java:231
Theme getTheme()
Definition: WelcomeResource.java:217
String setCsrfCookie()
Definition: WelcomeResource.java:251

◆ csrfCheck()

void org.keycloak.services.resources.WelcomeResource.csrfCheck ( final MultivaluedMap< String, String >  formData)
inlineprivate
265  {
266  String formStateChecker = formData.getFirst("stateChecker");
267  Cookie cookie = headers.getCookies().get(KEYCLOAK_STATE_CHECKER);
268  if (cookie == null) {
269  throw new ForbiddenException();
270  }
271 
272  String cookieStateChecker = cookie.getValue();
273 
274  if (cookieStateChecker == null || !cookieStateChecker.equals(formStateChecker)) {
275  throw new ForbiddenException();
276  }
277  }
HttpHeaders headers
Definition: WelcomeResource.java:74
static final String KEYCLOAK_STATE_CHECKER
Definition: WelcomeResource.java:69

◆ expireCsrfCookie()

void org.keycloak.services.resources.WelcomeResource.expireCsrfCookie ( )
inlineprivate
259  {
260  String cookiePath = session.getContext().getUri().getPath();
261  boolean secureOnly = session.getContext().getUri().getRequestUri().getScheme().equalsIgnoreCase("https");
262  CookieHelper.addCookie(KEYCLOAK_STATE_CHECKER, "", cookiePath, null, null, 0, secureOnly, true);
263  }
static final String KEYCLOAK_STATE_CHECKER
Definition: WelcomeResource.java:69
KeycloakSession session
Definition: WelcomeResource.java:77

◆ getResource()

Response org.keycloak.services.resources.WelcomeResource.getResource ( @PathParam("path") String  path)
inline

Resources for welcome page

引数
path
戻り値
159  {
160  try {
161  InputStream resource = getTheme().getResourceAsStream(path);
162  if (resource != null) {
163  String contentType = MimeTypeUtil.getContentType(path);
164  Response.ResponseBuilder builder = Response.ok(resource).type(contentType).cacheControl(CacheControlUtil.getDefaultCacheControl());
165  return builder.build();
166  } else {
167  return Response.status(Response.Status.NOT_FOUND).build();
168  }
169  } catch (IOException e) {
170  throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
171  }
172  }
Theme getTheme()
Definition: WelcomeResource.java:217

◆ getTheme()

Theme org.keycloak.services.resources.WelcomeResource.getTheme ( )
inlineprivate
217  {
218  try {
219  return session.theme().getTheme(Theme.Type.WELCOME);
220  } catch (IOException e) {
221  throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
222  }
223  }
KeycloakSession session
Definition: WelcomeResource.java:77

◆ getWelcomePage()

Response org.keycloak.services.resources.WelcomeResource.getWelcomePage ( ) throws URISyntaxException
inline

Welcome page of Keycloak

戻り値
例外
URISyntaxException
91  {
93 
94  String requestUri = session.getContext().getUri().getRequestUri().toString();
95  if (!requestUri.endsWith("/")) {
96  return Response.seeOther(new URI(requestUri + "/")).build();
97  } else {
98  return createWelcomePage(null, null);
99  }
100  }
KeycloakSession session
Definition: WelcomeResource.java:77
Response createWelcomePage(String successMessage, String errorMessage)
Definition: WelcomeResource.java:174
void checkBootstrap()
Definition: WelcomeResource.java:225

◆ isLocal()

boolean org.keycloak.services.resources.WelcomeResource.isLocal ( )
inlineprivate
231  {
232  try {
233  ClientConnection clientConnection = session.getContext().getConnection();
234  InetAddress remoteInetAddress = InetAddress.getByName(clientConnection.getRemoteAddr());
235  InetAddress localInetAddress = InetAddress.getByName(clientConnection.getLocalAddr());
236  String xForwardedFor = headers.getHeaderString("X-Forwarded-For");
237  logger.debugf("Checking WelcomePage. Remote address: %s, Local address: %s, X-Forwarded-For header: %s", remoteInetAddress.toString(), localInetAddress.toString(), xForwardedFor);
238 
239  // Access through AJP protocol (loadbalancer) may cause that remoteAddress is "127.0.0.1".
240  // So consider that welcome page accessed locally just if it was accessed really through "localhost" URL and without loadbalancer (x-forwarded-for header is empty).
241  return isLocalAddress(remoteInetAddress) && isLocalAddress(localInetAddress) && xForwardedFor == null;
242  } catch (UnknownHostException e) {
243  throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
244  }
245  }
HttpHeaders headers
Definition: WelcomeResource.java:74
boolean isLocalAddress(InetAddress inetAddress)
Definition: WelcomeResource.java:247
KeycloakSession session
Definition: WelcomeResource.java:77
static final Logger logger
Definition: WelcomeResource.java:67

◆ isLocalAddress()

boolean org.keycloak.services.resources.WelcomeResource.isLocalAddress ( InetAddress  inetAddress)
inlineprivate
247  {
248  return inetAddress.isAnyLocalAddress() || inetAddress.isLoopbackAddress();
249  }

◆ setCsrfCookie()

String org.keycloak.services.resources.WelcomeResource.setCsrfCookie ( )
inlineprivate
251  {
252  String stateChecker = Base64Url.encode(KeycloakModelUtils.generateSecret());
253  String cookiePath = session.getContext().getUri().getPath();
254  boolean secureOnly = session.getContext().getUri().getRequestUri().getScheme().equalsIgnoreCase("https");
255  CookieHelper.addCookie(KEYCLOAK_STATE_CHECKER, stateChecker, cookiePath, null, null, 300, secureOnly, true);
256  return stateChecker;
257  }
static final String KEYCLOAK_STATE_CHECKER
Definition: WelcomeResource.java:69
KeycloakSession session
Definition: WelcomeResource.java:77

メンバ詳解

◆ bootstrap

boolean org.keycloak.services.resources.WelcomeResource.bootstrap
private

◆ headers

HttpHeaders org.keycloak.services.resources.WelcomeResource.headers
protected

◆ KEYCLOAK_STATE_CHECKER

final String org.keycloak.services.resources.WelcomeResource.KEYCLOAK_STATE_CHECKER = "WELCOME_STATE_CHECKER"
staticprivate

◆ logger

final Logger org.keycloak.services.resources.WelcomeResource.logger = Logger.getLogger(WelcomeResource.class)
staticprotected

◆ session

KeycloakSession org.keycloak.services.resources.WelcomeResource.session
private

このクラス詳解は次のファイルから抽出されました: