1

Spring Security を使用して、Web サイト (JSF 2 を使用して作成) にカスタムログインを提供しようとしています。デフォルトのログイン フォームを使用すると、Web サイトは正常に動作します。ただし、独自のカスタム ログイン フォームを使用しようとすると、正しいユーザー名/パスワードを入力しても、常に authentication-failure-url にリダイレクトされます。これがなぜなのか、どうすれば修正できるのか誰か知っていますか? 私のコードは以下です。

security-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
xmlns:sec="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                http://www.springframework.org/schema/security
                http://www.springframework.org/schema/security/spring-security-3.1.xsd">

 <sec:http auto-config="true" use-expressions="true">
    <sec:intercept-url pattern="/login.jsf" access="isAnonymous()" />
    <sec:intercept-url pattern="/pages/secure/**" access="hasRole('ROLE_USER')" />
    <sec:intercept-url pattern="/pages/home/**" access="hasRole('ROLE_USER')" />
    <sec:intercept-url pattern="/pages/unsecure/**" access="permitAll"/>
    <sec:form-login login-page="/login.jsf" default-target-url="/pages/home/home.jsf"
                    authentication-failure-url="/fail.jsf"/>
</sec:http>

<sec:authentication-manager alias="authenticationManager">
    <sec:authentication-provider>
        <sec:user-service>
            <sec:user authorities="ROLE_USER" name="admin" password="admin" />
        </sec:user-service>
    </sec:authentication-provider>
</sec:authentication-manager> 
</beans:beans>

login.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"      
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<title>Login</title>
<h:outputStylesheet name="css/styles.css" />
<h:outputScript name="jquery/jquery-plugins.js" library="primefaces" />
</h:head>
<h:body>
<div class="login">
    <form method="POST" action="j_spring_security_check">
        <h:inputText name="j_username" id="username"></h:inputText>
        <p:watermark for="username" value="Username" />
        <br />  
        <h:inputSecret name="j_password" id="password">
        </h:inputSecret>
        <p:watermark for="password" value="Password" />
        <br />
        <h:commandButton name="submit" type="submit" value="Submit"></h:commandButton>
    </form>
</div>
</h:body>
</html>
4

2 に答える 2

4

生成された HTML 出力を見ましたか? ブラウザーでページを右クリックし、[ソースを表示] を実行して表示します。

name属性

<h:inputText name="j_username" id="username"></h:inputText>
<h:inputSecret name="j_password" id="password"></h:inputSecret>

まったく生成されていません!代わりに、クライアント ID は要素のname.

それに応じて修正します。

<h:inputText id="j_username" />
<p:watermark for="j_username" value="Username" />
<h:inputSecret id="j_password" />
<p:watermark for="j_password" value="Password" />

もちろん、プレーンなバニラ HTML を使用することもできます。

<input type="text" name="j_username" placeholder="Username" />
<input type="password" name="j_password" placeholder="Password" />
于 2013-06-25T12:26:43.260 に答える
0

フォームのアクションとして以下を設定してみてください。

action="#{request.contextPath}/j_spring_security_check"

于 2013-06-25T06:55:07.597 に答える