我正在尝试在Shibboleth IdP 3.0中自定义登录过程。它基本上是一个Spring Web应用程序,其中包括使用Spring流程。
我收到以下异常(null context):
org.springframework.expression.spel.SpelEvaluationException: EL1011E:(pos 23): Method call: Attempted to call method verify(java.lang.String) on null context object
at org.springframework.expression.spel.ast.MethodReference.throwIfNotNullSafe(MethodReference.java:144)
它发生在下面的评估表达式中,在这个Spring Web流程中:
<action-state id="VerifyOtp">
<set name="flowScope.enteredOtp" value="requestParameters.j_otp"
type="java.lang.String" />
<set name="flowScope.otpSecretKey"
value="keyManager.findSecretKey(flowScope.otpUsername)"
type="ch.eifr.oshi.jaas.totp.SecretKey" />
<evaluate expression="flowScope.otpSecretKey.verify(flowScope.enteredOtp)"
result="flowScope.otpIsValid" />
<transition on="#{ flowScope.otpIsValid }" to="proceed" />
<transition on="#{ !flowScope.otpIsValid }" to="DisplayOtpPage" />
</action-state>
流程导入以下bean:
(keyManager
按预期实例化)
<bean class="ch.eifr.oshi.jaas.totp.SecretKeysManagerImpl" id="keyManager" scope="singleton" />
<bean class="ch.eifr.oshi.jaas.totp.SecretKey" scope="prototype" />
我尝试使用和不使用最后一行,它没有任何区别。我想也许我必须告诉Spring它需要加载的类。情况似乎并非如此。
我认为我的问题与范围或依赖关系有关,因为我尝试在视图中调用keyManager.toString()
并返回了一些内容。
但是如果我调用keyManager.findSecretKey('john.doe').getId()
,我会得到一个空的上下文异常。请注意,findSecretKey(String)
方法始终返回一个新密钥,它永远不会返回null
。
答案 0 :(得分:0)
我希望以更好的方式做到这一点,但只有这样才有效:
<action-state id="ExtractOtpFromFormRequestAndValidate">
<set name="flashScope.enteredOtp" value="requestParameters.j_otp" type="java.lang.String"/>
<transition on="#{ keyManager.findSecretKey(flowScope.otpUsername).verify(flashScope.enteredOtp) }" to="proceed" />
<transition to="DisplayOtpPage" />
</action-state>