2012-01-20 8 views
2

私はjsf2ウェブアプリケーションでSpring Security 3を使用しています。jsfスプリングセキュリティアクセスが認証ログインを拒否しました

認証されていないユーザが保護されたリソースにアクセスしようとすると、Spring Securityはログインページにリダイレクトします。

この場合、リソースにアクセスできないというログインページのメッセージをユーザーに表示するにはどうすればよいですか?

Spring SecurityがExceptionTranslationFilterでAccessDeniedExceptionをスローし、ログインページにリダイレクトすると、「WebAttributes.ACCESS_DENIED_403」をチェックするログインページでpreRenderViewリスナーを使用しようとしましたが、nullです。

答えて

0

は今、私は、ユーザーがまだ含むAuthenticationExceptionがスローされ、ExceptionTranslationFilterがauthenticationEntryPointを起動しますその後、認証されていない、実際にあれば、あなたを得ます。このようにエラーリクエストパラメータを追加するだけです。

<bean id="exceptionTranslationFilter" 
class="org.springframework.security.web.access.ExceptionTranslationFilter"> 
<property name="authenticationEntryPoint" ref="authenticationEntryPoint"/> 
</bean> 

<bean id="authenticationEntryPoint" 
class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
<property name="loginFormUrl" value="/login.xhtml?error=true"/> 
</bean> 

and in your login.xhtml use the param like this 

<h:outputText rendered="#{param['error']}" value="Please authenticate first!" /> 
+0

Spring Securityタグライブラリは、認証されたユーザが特定の/ sロールを持っているかどうか、つまり権限を扱うかどうかによってコンポーネントをレンダリングするためのものです。しかし、私の場合は認証とは関係ありませんが、認証です。さらに、私のアプリでは私はユーザーのための役割を持っていません。認証が必要なページにアクセスしようとしたため、認証されていないユーザーがそのユーザーにリダイレクトされたときに、ログインページにメッセージを表示したいだけです。 – choquero70

+0

答えを更新しました!それがあなたのために働くかどうか見てください! – Ravi

+0

ありがとう@Ravi。最後に、これが適切な解決策であることがわかりました。できます。 ?error = trueをloginFormUrlに追加してから、ユーザーにmeesageを表示するためにログインページのpreRenderViewリスナーでチェックします。 – choquero70

1

ここに記載されている重複した質問のようです。 link

前述のように、インスタンスAccessDeniedHandlerImplを作成し、そのプロパティをカスタムエラーページに設定します。そのページから単純なjavascriptを使用して、実際のログインページ(

<script language="javascript" type="text/javascript"> 
window.setTimeout('window.location="http://localhost:8080/WebApp/login.xhtml"; ',5000); 
</script> 

)のように転送するか、ログインページへのボタンまたはリンクを入力してください。

+0

私のシナリオはそうではありません。私の場合は、ユーザーがまだ認証されていないということです。そのため、彼はログインページに送られます。ユーザーが認証されたときに送信されるアクセス拒否ページではなく、許可された役割を持っていません。 – choquero70

+0

ユーザーがまだ認証されていない場合、バネセキュリティは常にユーザーをログインページに送信し、ユーザーが要求されたリソースにアクセスできない場合は認証後にアクセス拒否ページが表示されます。私はあなたがWebアプリケーションサーバーによって送信されたデフォルトのアクセス拒否ページを望まないと仮定しています。それについては下記を参照してください – Ravi

+0

私は認証されていないユーザーがログインページにリダイレクトされることを知っています。私が望むのは、そのログインページでユーザーにメッセージを表示することです。それは私が質問 – choquero70

0

は、あなたのweb.xmlに

<error-page> 
     <error-code>403</error-code> 
     <location>/pages/errorAccessDenied.xhtml</location> 
    </error-page> 

これを追加し、あなたのメッセージをerrorAccessDenied.xhtmlを作成します。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html"> 

<h:head> 
</h:head> 
<h:body> 
    <h:outputText value="You do not have access to the requested resource" /> 
</h:body> 
</html> 
+0

で尋ねたもので、他のリソースへのヘッダーリンクがあれば、ユーザーは許可されている他のページに簡単にナビゲートできます。 – Ravi

関連する問題