Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSF-Spring安全集成问题_Java_Jsf_Spring Security - Fatal编程技术网

Java JSF-Spring安全集成问题

Java JSF-Spring安全集成问题,java,jsf,spring-security,Java,Jsf,Spring Security,Servlet 2.4+API允许我们使用标记中的标记,其值类似于FORWARD,以拦截内部转发到其他资源的请求。对于一个servlet到另一个servlet的转发,spring安全约束可以正常工作 <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> <disp

Servlet 2.4+API允许我们使用
标记中的
标记,其值类似于
FORWARD
,以拦截内部转发到其他资源的请求。对于一个servlet到另一个servlet的转发,spring安全约束可以正常工作

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>    

springSecurityFilterChain
/*
向前地
要求
问题: 安全过滤器似乎不使用JSF操作拦截内部转发

在使用JSF操作(导航用例)时,JSF似乎将请求“转发”到目标视图(页面)。这会导致URL比页面的实际URL落后一步

这样做的一个副作用是,spring安全约束(绑定到URL)在下一个操作之前不会生效

示例: 当前页面URL: (page1.xhtml有一个操作,可导航到受保护的page2)

提交时,请求被提交到呈现page2.xhtml的服务器,但URL仍然保持不变。Spring Security不拦截和保护page2.xhtml

可以通过指定以下内容来克服这一问题:

<navigation-case>
    <from-outcome>page2</from-outcome>
    <to-view-id>/page2.xhtml</to-view-id>
    <redirect/> <!--REDIRECT, INSTEAD OF FORWARD-->
</navigation-case>

第2页
/page2.xhtml
重定向不是我们想要实现这一目标的方式。有没有更好的方法让Spring Security与JSF协同工作?

编辑:(spring配置xml的相关片段)


来自(oracle文档)

如果导航案例不使用重定向元素,新页面将作为对当前请求的响应呈现,,这意味着浏览器地址字段中的URL不会更改,并且它将包含上一页的地址

这似乎意味着,在JSF生命周期中,下一页不会发生“转发”。。。因此,Spring Security将永远无法处理此问题。

来自(oracle文档)

如果导航案例不使用重定向元素,新页面将作为对当前请求的响应呈现,,这意味着浏览器地址字段中的URL不会更改,并且它将包含上一页的地址


这似乎意味着,在JSF生命周期中,下一页不会发生“转发”。。。因此,Spring安全性将永远无法处理此问题。

默认情况下,FilterSecurityInterceptor只会在每个请求中执行一次,并且不会执行安全性重新检查,除非url发生更改,但使用JSP/JSF转发,页面将作为对当前请求的响应呈现,并且浏览器中的url包含请求的地址上一页。为此,只需在applicationContext中的http元素中将“每个请求一次”属性设置为false,从而强制重新检查安全性

<http auto-config="true" use-expressions="true" once-per-request="false">

并在web.xml中的springSecurityFilterChain过滤器映射中添加转发调度程序

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
向前地
要求
更多

或者,您也可以通过在结果后面附加参数faces redirect=true来启用页面重定向,如下所示:

<h:form>
    <h:commandButton action="page1?faces-redirect=true" value="Page1" />
</h:form>

但正如所说的,使用POST进行页面间导航并不是一个好的做法。一定要经常使用

<h:link> or <h:button>
另见:


默认情况下,FilterSecurityInterceptor在每个请求中只执行一次,并且不执行安全性重新检查,除非url中有更改,但使用JSP/JSF转发时,页面将作为对当前请求的响应呈现,并且浏览器中的url包含上一页的地址。为此,只需在applicationContext中的http元素中将“每个请求一次”属性设置为false,从而强制重新检查安全性

<http auto-config="true" use-expressions="true" once-per-request="false">

并在web.xml中的springSecurityFilterChain过滤器映射中添加转发调度程序

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
向前地
要求
更多

或者,您也可以通过在结果后面附加参数faces redirect=true来启用页面重定向,如下所示:

<h:form>
    <h:commandButton action="page1?faces-redirect=true" value="Page1" />
</h:form>

但正如所说的,使用POST进行页面间导航并不是一个好的做法。一定要经常使用

<h:link> or <h:button>
另见:


您也可以发布您的应用程序上下文。xml@Ravi用appcontext.xml中的内容编辑了问题。有什么想法吗?您也可以发布您的应用程序上下文。xml@Ravi用appcontext.xml中的内容编辑了这个问题有什么想法吗?