如何在 SAMLEntryPoint 中设置 RelayState
Posted
技术标签:
【中文标题】如何在 SAMLEntryPoint 中设置 RelayState【英文标题】:How to Set RelayState in SAMLEntryPoint 【发布时间】:2017-08-04 08:38:25 【问题描述】:我的 EntryPoint 类如下,但是在中继状态中设置的确切值是什么,任何示例。我想在验证之前获取请求的 URL 参数值。
import org.opensaml.saml2.metadata.provider.MetadataProviderException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.saml.SAMLEntryPoint;
import org.springframework.security.saml.context.SAMLMessageContext;
import org.springframework.security.saml.websso.WebSSOProfileOptions;
public class SamlLoginEntryPoint extends SAMLEntryPoint
protected WebSSOProfileOptions getProfileOptions(SAMLMessageContext context, AuthenticationException exception) throws MetadataProviderException
System.out.println("inside entrypoint");
WebSSOProfileOptions ssoProfileOptions;
if (defaultOptions != null)
System.out.println("in if");
ssoProfileOptions = defaultOptions.clone();
ssoProfileOptions.setRelayState("");
System.out.println("relaystate:"+ssoProfileOptions.getRelayState());
else
System.out.println("in else");
ssoProfileOptions = new WebSSOProfileOptions();
ssoProfileOptions.setRelayState("");
return ssoProfileOptions;
【问题讨论】:
【参考方案1】:@Dalu:我不确定这在竞争条件下是否安全。 SAMLEntryPoint
通常是一个单例 bean。
考虑User A
想用URL X
登录,但同时User B
用URL Y
登录的场景(在A调用commence()
之后,但在他调用getProfileOptions
之前。
解决方案是不将private String relayState;
定义为全局变量,而是使用基于会话的存储。
【讨论】:
【参考方案2】:重写 SAMLEntryPoint 类的 begin() 方法,从请求对象中获取请求参数。
所以我的实现看起来像这样:
public class CustomMFASamlEntryPoint extends SAMLEntryPoint
private String relayState;
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authenticationException) throws IOException, ServletException
//read your request parameter
setRelayState(request.getParameter("request-param-for-relaystate"));
super.commence(request, response, authenticationException);
@Override
protected WebSSOProfileOptions getProfileOptions(SAMLMessageContext samlMessageContext, AuthenticationException authenticationException) throws MetadataProviderException
//set the relayState to your SAML message context
samlMessageContext.setRelayState(getRelayState());
return super.getProfileOptions(samlMessageContext, authenticationException);
private void setRelayState(String relayState)
this.relayState = relayState;
private String getRelayState()
return relayState;
【讨论】:
以上是关于如何在 SAMLEntryPoint 中设置 RelayState的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Sonata/Symfony 3.3 中设置内容配置?
使用 indy 10.5.8 在 Delphi 2010 中设置 KeepAlive 超时
如何在 sklearn:: LGBMClassifier() 中为 LightGBM 分类器的 feature_importances_ 中设置“增益”作为特征重要性度量