6

成功登录后,它不会重定向到“index.php”。它重定向同一页面,即“login.php”。我的 spring-security.xml 页面有问题吗?

顺便说一句,当我运行应用程序时,它会将我重定向到“login.php”,这很好。但它不显示 primefaces 组件,而是 html 组件。成功登录后,它会重定向同一页面,但这次它显示 Primefaces 组件而不是 html 组件。

<beans:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:beans="http://www.springframework.org/schema/beans" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/pages/login.xhtml*" access="permitAll"/>
    <intercept-url pattern="/**" access="hasRole('admin')" />
    <form-login login-page='/pages/login.xhtml' default-target-url="/pages/index.xhtml"                    
                authentication-failure-url="/pages/login.xhtml"/>
    <logout logout-success-url="/pages/logout.xhtml" />

</http>
<!--Authentication Manager Details -->    
<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="customUserDetailsService">
<!--            <password-encoder hash="md5"/>-->
    </authentication-provider>
</authentication-manager>

我的 web.xml

<welcome-file-list>
    <welcome-file>pages/index.xhtml</welcome-file>
</welcome-file-list>

我的登录页面

<p:outputPanel id="loginOutputPanelId" style="border: navy">
                        <p:panelGrid id="loginInformationPanel" columns="2">
                            <h:outputText value="Username: "/>
                            <p:inputText value="#{loginController.userName}"/>
                            <h:outputText value="Password: "/>
                            <p:inputText value="#{loginController.password}"/>
                        </p:panelGrid>
                        <p:commandButton value="Login" actionListener="#{loginController.login()}"/>
                    </p:outputPanel>

我的 loginController.login() 方法返回“index”字符串和我的 faces.config;

<navigation-rule>
        <from-view-id>/pages/login.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>index</from-outcome>
            <to-view-id>/pages/index.xhtml</to-view-id>
            <redirect />
        </navigation-case>
    </navigation-rule>

编辑: 没有组件它运行没有任何问题。当我添加表单登录时,它显示“该网页http://localhost:8080/myApplication/pages/login.xhtml导致了太多重定向”。

<http auto-config='true' use-expressions="true">
<intercept-url pattern="/**" access="hasRole('admin')" />
<logout logout-success-url="/pages/logout.xhtml" />
<form-login login-page="/pages/login.xhtml"
                login-processing-url="/j_spring_security_check"                                                       
                default-target-url="/pages/index.xhtml"                                                        
                authentication-failure-url="/pages/login.xhtml"/>
</http>

我的登录页面

<p:outputPanel id="loginOutputPanelId" style="border: navy">
                        <p:panelGrid id="loginInformationPanel" columns="2">
                            <h:outputText value="Kullanıcı Adı: "/>
                            <p:inputText id="j_username" required="true" value="#{loginController.userName}"/>
                            <h:outputText value="Şifre: "/>
                            <p:inputText id="j_password" required="true" value="#{loginController.password}"/>
                        </p:panelGrid>
                        <p:commandButton id="login" type="submit" ajax="false" value="Login" actionListener="#{loginController.login()}"/>
                    </p:outputPanel>

我的新 loginController.login() 方法;

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();

        RequestDispatcher dispatcher = ((ServletRequest) context.getRequest())
         .getRequestDispatcher("/j_spring_security_check");

        dispatcher.forward((ServletRequest) context.getRequest(),
         (ServletResponse) context.getResponse());

        FacesContext.getCurrentInstance().responseComplete();
4

2 回答 2

16

要强制 spring-security 转到/pages/index.xhtml,您可以使用always-use-default-target以下属性:

<form-login login-page='/pages/login.xhtml' 
            default-target-url="/pages/index.xhtml"
            always-use-default-target="true"                    
            authentication-failure-url="/pages/login.xhtml"/>

否则,当用户调用安全资源时,spring security 应自动显示登录页面,一旦登录完成,继续访问最初要求的安全资源。

在您的情况下,一些混淆似乎来自您希望 Spring Security 处理登录,并且您尝试使用 jsf actionListener 和导航规则自己处理它。

将“ <form-login [...]”放在配置中实质上是告诉 spring 激活一个过滤器 ( UsernamePasswordAuthenticationFilter),该过滤器将监听对请求的请求/j_spring_security_check。如果你想让 spring 处理登录,默认情况下你的表单登录必须请求这个 url,传递两个参数 :j_usernamej_password.

这样,springUsernamePasswordAuthenticationFilter将启动并尝试使用您在 AuthenticationProvider 中配置的 UserDetailsS​​ervice 对提供的凭据进行身份验证。

我认为您必须删除 jsf 控制器才能登录并使用 spring-security 来处理身份验证。

希望这可以帮助。

PS:确保您的 web.xml 在所有其他 servlet 过滤器之前定义 DelegatingFilterProxy:

<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>
</filter-mapping>
于 2013-06-10T18:41:00.200 回答
0

请检查您的Faces Servlet URL 模式web.xml

如果它包含.jsf类似:

<servlet-mapping>
   <servlet-name>Faces Servlet</servlet-name>
   <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

那么您必须在 spring-security.xml 中更新您的代码,例如:

<form-login login-page="/pages/login.jsf"
            login-processing-url="/j_spring_security_check"                                                       
            default-target-url="/pages/index.jsf"                                                        
            authentication-failure-url="/pages/login.jsf"/>
于 2013-11-05T09:44:49.680 回答