实施白色标签
有時(根據我的經驗,很多時候)您需要為應用程序添加白色標簽。 您通常可以以SaaS方式運行它,但是一些重要的或高知名度的客戶端可能想要專用的部署或本地部署,或者只是在云部署中“自己的一角”。
白色標簽通常包括不同CSS,不同的徽標和其他圖像以及不同的頁眉和頁腳文本。 其余產品保持不變。 那么,我們如何以最小的侵入性方式支持白標? (我將在示例中使用Spring MVC,但是將邏輯移植到其他框架非常簡單)
首先,讓我們概述支持白標的三種不同方式。 您可以(可能應該)實現所有這些功能,因為它們在不同的場景中很有用,并且有很多重疊之處。
- 標有白色的安裝–更改整個部署的樣式。 對于本地安裝或托管安裝很有用。
- 白標子域–允許通過特定子域訪問不同樣式的服務
- 標有白色的客戶–登錄后允許特定客戶查看自定義樣式
要實現全白標安裝 ,我們必須在文件系統上配置放置定制css文件和圖像以及定制文本的路徑。 這是啟動時傳遞給應用程序的.properties文件的示例:
styling.dir=/var/config/whitelabel styling.footer=?2018 Your Company styling.logo=/images/logsentinel-logo.png styling.css=/css/custom.css styling.title=Your Company在Spring/Spring啟動中,如果某個URL模式匹配,則可以從文件系統中服務器文件。 例如:
@Component @Configuration public class WebMvcCustomization implements WebMvcConfigurer {@Value("${styling.dir}")private String whiteLabelDir;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/whitelabel/**").addResourceLocations(whiteLabelDir);} }最后,您需要自定義HTML模板,但是當所有其他選項也都實現時,我們將在最后討論。
接下來是白標子域 。 對我來說,這是最好的選擇,因為它允許您一次安裝多個具有特定樣式的客戶。 樣式僅取決于訪問服務所通過的域/子域。
為此,我們需要引入一個實體WhitelabelStyling和一個相應的數據庫表。 我們可以創建一些管理界面來進行配置,或者直接在數據庫中進行配置。 該實體可能看起來像這樣:
@Table("whitelabel_styling") public class WhitelabelStyling {@PrimaryKeyprivate String key;@Columnprivate String title;@Columnprivate String css;@Column@CassandraType(type = DataType.Name.BLOB)private byte[] logo;@Columnprivate String footer;@Columnprivate String domain;// getters and setters }密鑰是您選擇的任意字符串。 它可能與(sub)域或其他一些有意義的字符串相同。 其余大部分是顯而易見的。 有了這些之后,我們需要能夠提供資源。 為此,我們需要一個控制器,您可以在這里看到 。 控制器選擇一個白色標簽的密鑰,并嘗試從數據庫中加載相應的條目,然后提供結果。 在這種情況下,控制器端點為/whitelabel-resources/logo.png和/whitelabel-resources/style.css 。
為了為特定的子域設置適當的密鑰,您需要每個請求的模型屬性(即,在要呈現的所有頁面的模型中設置的值)。 這樣的事情(每天刷新一次白標簽緩存;如果您不想在每個請求中都訪問數據庫,則必須使用緩存):
@ModelAttribute("domainWhitelabel") public WhitelabelStyling perDomainStyling(HttpServletRequest request) {String serverName = request.getServerName();if (perDomainStylings.containsKey(serverName)) {return perDomainStylings.get(serverName);}return null; }@Scheduled(fixedRate = DateTimeConstants.MILLIS_PER_DAY) public void refreshAllowedWhitelabelDomains() {perDomainStylings = whitelabelService.getWhitelabelStyles().stream().collect(Collectors.toMap(WhitelabelStyling::getDomain, Function.identity())); }最后,使用相同的控制器,以與上述相同的方式為每個客戶添加白標簽 ,不是基于request.getServerName()而是基于當前已認證用戶的屬性來獲取當前密鑰。 管理員(通過UI或直接在數據庫中)可以為每個用戶分配一個whitelabel密鑰,然后在登錄后,該用戶將看到自定義樣式。
我們已經看到了解決方案的Java部分的外觀,但是我們需要修改HTML模板以選擇自定義項。 一種簡單的方法如下所示(使用卵石模板):
{% if domainWhitelabel != null %}<link href="/whitelabel-resources/style.css?key={{ domainWhitelabel.key }}" rel="stylesheet"> {% elseif user.whitelabelStyling != null and user.whitelabelStyling.css != '' %}<link href="/whitelabel-resources/style.css" rel="stylesheet"> {% elseif beans.environment.getProperty('styling.dir') != '' and beans.environment.getProperty('styling.css.enabled') == true %}<link href="{{'/whitelabel/'+ beans.environment.getProperty('styling.css')}}" rel="stylesheet"> {% else %}<link href="{{ beans.environment.getProperty('styling.css')}}" rel="stylesheet"> {% endif %}這非常簡單–如果配置了域級別的白色標簽,則使用該標簽; 如果不是,請檢查當前用戶是否分配了特定的白標簽; 如果沒有,請檢查是否配置了全局安裝白色標簽; 如果不是,請使用默認值。 此代碼段利用了上面的WhitelabelController (在前兩種情況下)和倒數WhitelabelController情況下使用了自定義資源處理程序。
總體而言,這是一個靈活,簡單的解決方案,即使在現有系統上也不需要花費幾天的時間即可實施和測試。 我將再次表達我對基于域的樣式的偏愛,因為它們允許使用多個不同樣式和徽標使用相同的多租戶安裝。 當然,應該正確配置Web服務器/負載均衡器/域,以允許子域并讓您輕松管理它們,但這是不合時宜的。
我認為白色標簽是許多產品的好方法。 顯然,除非業務需要它,否則不要實施它,但要記住,它可能會落伍,并且相對容易實施。
翻譯自: https://www.javacodegeeks.com/2018/07/implementing-white-labelling.html
總結
- 上一篇: linux查看dns配置(linux查看
- 下一篇: ddos攻击原理图示(ddos原理动画图