Apereo CAS Web Application Themes Support - Provides comprehensive theme resolution and management capabilities for the Central Authentication Service
—
Simple theme resolution that extracts theme names from HTTP request headers.
Theme resolver that extracts theme from HTTP request headers using a configured header name.
/**
* Theme resolver that extracts theme from HTTP request headers
*/
public class RequestHeaderThemeResolver extends AbstractThemeResolver {
/**
* Constructor with header name configuration
* @param themeHeaderName Name of HTTP header to check for theme value
*/
public RequestHeaderThemeResolver(String themeHeaderName);
/**
* Resolves theme from request header
* @param request HTTP request containing theme header
* @return Theme name from header, or default theme if header missing/empty
*/
@Nonnull
@Override
public String resolveThemeName(HttpServletRequest request);
/**
* No-op implementation for theme setting
* @param httpServletRequest HTTP request
* @param httpServletResponse HTTP response
* @param theme Theme name
*/
@Override
public void setThemeName(@Nonnull HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, String theme);
}Usage Examples:
import org.apereo.cas.services.web.RequestHeaderThemeResolver;
// Create header-based theme resolver
RequestHeaderThemeResolver headerResolver = new RequestHeaderThemeResolver("X-CAS-Theme");
headerResolver.setDefaultThemeName("default");
// Resolve theme from request
String themeName = headerResolver.resolveThemeName(request);
// Example HTTP request with theme header:
// GET /cas/login HTTP/1.1
// Host: cas.example.com
// X-CAS-Theme: dark
//
// Result: themeName = "dark"Common header names used for theme selection:
// Common theme header patterns
new RequestHeaderThemeResolver("X-Theme"); // Generic
new RequestHeaderThemeResolver("X-CAS-Theme"); // CAS-specific
new RequestHeaderThemeResolver("X-UI-Theme"); // UI-specific
new RequestHeaderThemeResolver("Theme"); // Simple
new RequestHeaderThemeResolver("X-Client-Theme"); // Client-specificAny valid HTTP header name can be used:
// Examples of custom header configurations
new RequestHeaderThemeResolver("X-Brand-Theme");
new RequestHeaderThemeResolver("X-Tenant-Theme");
new RequestHeaderThemeResolver("X-Mobile-Theme");
new RequestHeaderThemeResolver("Preferred-Theme");Ideal for API clients that need to specify themes programmatically:
POST /cas/v1/tickets HTTP/1.1
Host: cas.example.com
Content-Type: application/json
X-CAS-Theme: api-minimal
{
"username": "user@example.com",
"password": "secret"
}Mobile applications can specify appropriate themes:
GET /cas/login?service=https://mobile.example.com HTTP/1.1
Host: cas.example.com
User-Agent: MyMobileApp/1.0
X-CAS-Theme: mobile-darkDifferent tenants can specify their themes:
GET /cas/login?service=https://tenant1.example.com HTTP/1.1
Host: cas.example.com
X-Tenant-Theme: tenant1-corporateLoad balancers can add theme headers based on routing rules:
# Nginx configuration example
location /cas/login {
proxy_pass http://cas-backend;
# Add theme header based on host
if ($host = "admin.example.com") {
proxy_set_header X-CAS-Theme "admin";
}
if ($host = "mobile.example.com") {
proxy_set_header X-CAS-Theme "mobile";
}
}Returns default theme when:
// Example resolution logic
String headerValue = request.getHeader(themeHeaderName);
if (StringUtils.isBlank(headerValue)) {
return getDefaultThemeName(); // "default"
}
return headerValue.trim();The resolver performs minimal validation:
// Example theme validation wrapper
public class ValidatingHeaderThemeResolver extends RequestHeaderThemeResolver {
private final Set<String> validThemes;
@Override
public String resolveThemeName(HttpServletRequest request) {
String theme = super.resolveThemeName(request);
if (validThemes.contains(theme)) {
return theme;
}
return getDefaultThemeName();
}
}When used in ChainingThemeResolver, resolved themes are stored as request attributes:
// Theme stored as request attribute for later use
String attributeName = casProperties.getTheme().getParamName(); // Default: "theme"
request.setAttribute(attributeName, resolvedTheme);Works seamlessly with Spring Web MVC theme resolution:
// Spring controller can access resolved theme
@Controller
public class LoginController {
@RequestMapping("/login")
public String login(HttpServletRequest request, Model model) {
String theme = (String) request.getAttribute("theme");
model.addAttribute("currentTheme", theme);
return "login";
}
}Install with Tessl CLI
npx tessl i tessl/maven-org-apereo-cas--cas-server-support-themes