2011-08-11 5 views
3

私は、Spring Securityによって処理される前に、ログインフォームで追加検証を行う方法を知りました。私はいくつかのLoginController、LoginForm beanについて考えていますが、それをどのように組み合わせるか、それをどのように動作させるかはわかりません。私の「ビジョン」。私はSpring Securityでこれを行う方法をいくつか検索しましたが、見つけることはできません。誰でも助けてくれますか?Spring Securityログインフォームで追加検証を行うには?

LoginFormビーン:

public class LoginForm { 
    private String j_username; 
    private String j_password; 
    @NotEmpty 
    private Boolean acceptTerms; 

    public String getJ_password() { 
     return j_password; 
    } 

    public String getJ_username() { 
     return j_username; 
    } 

    public void setJ_password(String j_password) { 
     this.j_password = j_password; 
    } 

    public void setJ_username(String j_username) { 
     this.j_username = j_username; 
    } 

    public Boolean getAcceptTerms() { 
     return acceptTerms; 
    } 

    public void setAcceptTerms(Boolean accept) { 
     this.acceptTerms = acceptTerms; 
    } 
} 

フォーム:

<c:url value="/login" var="secureUrl"/> 
<form:form id="jf" commandName="loginForm" action="${secureUrl}" method="post"> 
    <form:input path="j_username"/> 
    <form:input path="j_password"/> 
    <form:checkbox path="acceptTerms"/> 
</form> 

LoginController:

@Controller 
class LoginController { 
    @RequestMapping(value = "/login", method = RequestMethod.POST) 
    public String logging(@ModelAttribute @Valid LoginForm loginForm) { 
       ... 
    } 
} 

答えて

2

あなたはサブクラス化できUsernamePasswordAuthenticationFilter:

http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter.html

tryAuthentication()メソッドをオーバーライドしてsuper.attemptAuthentication()を呼び出させ、null以外のAuthenticationオブジェクトを返す場合は、追加の作業を実行します(ユーザーがチェックボックスをオンにしているかどうかを確認してください)。あなたの顧客のフィルタを指定する方法については

http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter.html#attemptAuthentication(javax.servlet.http.HttpServletRequest、javax.servlet.http.HttpServletResponseの)

ドキュメントはここにある:

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#ns-custom-filters

1

ただ@sdouglassコメントの上に多くの情報を追加します。

フィルタでは、バインディングの目的でフォームにアクセスできません。

私は、以下を実行することでデフォルトの検証でそれを得ることができました。今

https://gist.github.com/3137040

3
@RequestMapping(value = "/login", method = RequestMethod.GET) 
public ModelAndView signInPage(
        @RequestParam(value = "error", required = false) String error, 
        @RequestParam(value = "logout", required = false) String logout) 
{ 
    ModelAndView mav = new ModelAndView(); 
    //Initially when you hit on login url then error and logout both null 
    if (error != null) { 
     mav.addObject("error", "Invalid username and password!"); 
    } 

    if (logout != null) { 
     mav.addObject("msg", "You've been logged out successfully."); 
    } 
    mav.setViewName("login/login.jsp"); 
} 

場合ログインにuncessfulになった場合、それは再びあなたが失敗URLを設定し、スプリングセキュリティファイルのように、そのURLに付加するエラーで、このURLをヒットします。春のセキュリティファイル:

<security:form-login 
    authentication-failure-url="/login?error=1" 
/> 

あなたのURLはurl/login?error=1になります。自動的にsignInPageメソッドが呼び出され、エラー値が返されます。エラーはnullではなく、urlに対応する任意の文字列を設定でき、次のタグを使用してjspに表示できます。

<c:if test="${not empty error}"> 
    <div class="error">${error}</div> 
</c:if> 
関連する問題