2

我有一个具有此组件的 JSF 页面:

<p:selectBooleanCheckbox id="_spring_security_remember_me" label="Remember Me"/>

_spring_security_remember_meSpring Security 需要准确的输入字段 ID/名称。但是,PrimeFaces 使用_input后缀生成它,如下所示:

<div id="_spring_security_remember_me" class="ui-chkbox ui-widget">
  <div class="ui-helper-hidden-accessible">
    <input id="_spring_security_remember_me_input" name="_spring_security_remember_me_input" type="checkbox" />
  </div>
  <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon"></span></div>
</div>

因此,“记住我”功能无法找到该参数。我该如何解决?我可以告诉 PrimeFaces 不要使用 后缀_input,还是可以告诉 Spring Security 为“记住我”复选框寻找不同的请求参数名称?

4

3 回答 3

2

我的解决方案:

<security:remember-me key="remember-me-security" services-ref="rememberMeServices"/>

<bean id="rememberMeServices" class="com.triune.services.CustomTokenBasedRememberMeService">
    <property name="key" value="remember-me-security" />
    <property name="cookieName" value="TRIUNE" />
    <property name="tokenValiditySeconds" value="1209600" />
    <property name="useSecureCookie" value="true" />
    <property name="userDetailsService" ref="customUserDetailsService" />
    <property name="alwaysRemember" value="false" />
    <property name="parameter" value="_spring_security_remember_me_input"/>
</bean>

放置一个名为“参数”的属性,其值等于 primefaces 生成的 ID/名称。

于 2012-09-03T08:30:16.220 回答
0

您可以通过在元素中传递名称来解决您遇到的问题”

<p:selectBooleanCheckbox id="_spring_security_remember_me" name="_spring_security_remember_me" label="Remember Me"/>

编辑:

由于您无法为输入设置名称,我想您最好的做法是更改记住我服务的参数。有关更多信息,请参阅此问题答案

于 2012-08-21T10:23:46.947 回答
0

这是primefaces中的常见做法。所有组件都放置在一个 div 块中,指定公共 css 属性等。这个 div 块获取 id,因为它是组件的根元素。所有其他必须可识别的重要子元素(例如,在本例中为输入元素)都获得原始 id +_foo分配。

如果你想在客户端读取组件的值,你可以使用属性widgetVar来指定一个全局 js var 引用组件的支持 jquery 对象。打开你的调试器,看看它有什么属性。这些 js 类大多没有文档记录。


如果您需要服务器端的 id,尽管它会变得有点复杂。首先,您必须使用属性将组件模型注入您的支持 bean binding。现在有了SelectBooleanCheckbox可以调用的模型String clientId = checkbox.getClientId(FacesContext.getCurrentInstance());来检索客户端 ID。获取输入 id 现在是简单的字符串操作:String inputId = clientId + "_input";


如果您不确定组件在客户端的行为方式,您可以随时查看其模型和渲染器。在这种情况下,两者都位于org.primefaces.component.selectbooleancheckbox包装中。

于 2012-08-21T10:57:26.450 回答