Empêcher les utilisateurs privilégiés de se connecter en externe
Le fichier wc-server.xml inclut un en-tête de serveur Web personnalisable. Vous pouvez modifier cet en-tête pour contrôler si les utilisateurs privilégiés peuvent se connecter au magasin à partir de réseaux externes. Cette infrastructure réduit la possibilité d'une attaque externe si un compte avec un accès de niveau administratif, comme un représentant du service à la clientèle ou un administrateur du site, est compromis.
EXTERNAL_WEBSERVER : <RestrictAdminLogonToStore display="false" enabled="false" webServerHeader="EXTERNAL_WEBSERVER">
<RolesAllowedWithoutHeader>
<Role name="Registered Customer"/>
<Role name="Buyer Administrator"/>
<Role name="Buyer Approver"/>
</RolesAllowedWithoutHeader>
</RestrictAdminLogonToStore>Par défaut, cette fonction est désactivée, mais vous pouvez l'activer (enabled="true"). Une fois que cette structure est activée, vous pouvez définir un en-tête personnalisé (EXTERNAL_WEBSERVER), et énumérer les rôles utilisateur spécifiques autorisés à accéder au site à partir de réseaux externes. Les rôles sont définis dans l'en-tête <RolesAllowedWithoutHeader>. Avec ces propriétés définies, vous pouvez spécifier l'en-tête identifié sur les serveurs web qui desservent le trafic externe ; les serveurs Web qui desservent le trafic interne élimineraient cet en-tête. De cette façon, si l'en-tête personnalisé est présent dans une requête Web (trafic externe), seuls les utilisateurs ayant des rôles définis dans <RolesAllowedWithoutHeader> (ou les utilisateurs non authentifiés) sont autorisés à accéder au site (un représentant de service clientèle (RSC), un administrateur de site, ou un autre rôle côté vente serait bloqué). Si l'en-tête est absent de la demande (trafic interne), un utilisateur avec un rôle peut accéder au site.
EXTERNAL_WEBSERVER de <code>true</code> à l'objet HttpServletRequest : RequestHeader set EXTERNAL_WEBSERVER true- Client enregistré
- Administrateur acheteur
- Valideur acheteur
Point d'extension pour la personnalisation
Cette structure contient une instruction de tâche CheckLogonAllowedCmd qui peut être utilisée comme point d'extension pour la personnalisation. Le comportement par défaut utilise CheckLogonAllowedCmdImpl qui met en œuvre la méthode publique isAllowed(). Cette méthode renvoie true si la requête de connexion est reçue du réseau interne, sinon elle vérifie les rôles de l'utilisateur par rapport aux rôles définis dans la section <RolesAllowedWithoutHeader> du fichier wc-server.xml .
Avec l'en-tête du client EXTERNAL_WEBSERVER défini dans l'en-tête de requête REST ou Web, la méthode CheckLogonAllowedCmdImpl getExternalWebServerFlag() détecte le réglage et renvoie true pour indiquer que la requête provient d'un réseau externe.
isAllowed() renvoie false, le nouveau code d'erreur suivant est généré : ERR_LOGON_NOT_ALLOWED_FROM_EXTERNAL_WEBSITE = "2340";

- Contrôlez l'accès interne et externe par le biais de serveurs Web distincts. Définissez l'en-tête personnalisé spécifié dans chaque demande du serveur Web externe pour empêcher les utilisateurs privilégiés de se connecter sur le site en externe.
- Utilisez un filtre personnalisé, décrit ci-dessous, pour valider les informations de demande afin de différencier les demandes réseau interne des demandes réseau externes.
Exemple de code pour la personnalisation
public class MyRuntimeServletFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)req;
// limit filter to only logon request
if (httpServletRequest.getPathInfo()!= null && httpServletRequest.getPathInfo().contains("AjaxLogon")) {
String customHeaderName = WcsApp.configProperties.getValue(ECSecurityConstants.WCSAPP_CUSTOM_HEADER_URL);
// check RestrictAdminLogonToServer is enabled and custom header is set in wc-server.xml
if (SecurityHelper.isRestrictAdminLogonToStore() && customHeaderName != null) {
String remoteIP = null;
if (httpServletRequest.getHeader("x-forwarded-for") == null) {
remoteIP = httpServletRequest.getRemoteAddr();
} else {
remoteIP = httpServletRequest.getHeader("x-forwarded-for");
}
if (remoteIP != null && remoteIP.startsWith("9.186")) {
// set external network request flag
SecurityHelper.setExternalWebServerFlag(customHeaderName, Boolean.TRUE);
}
}
}
chain.doFilter(req, res);
}SecurityHelper.setExternalWebServerFlag() est un utilitaire dans la classe SecurityHelper qui aide à définir l'indicateur personnalisé dans le cache de transaction. Veillez à ajouter le filtre personnalisé comme filtre final dans le fichier web.xml parce que le cache de transaction peut être effacé par une opération de transition dans d'autres filtres.