grails acegi 登录验证码的实现

闲话不多说,直接上代码吧:
第一:如何更改acegi的源码:在STS 中工程视图改为project explorer ,在工程上点击右击,有个grails tools,里面刷新下依赖,在工程下就应该出现所有插件的源码了,这样就可以改了。
找到了下类:

改为如何下代码:我也记不清怎么改的了:

/*  Copyright 2006-2009 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      
http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 
*/
package  org.codehaus.groovy.grails.plugins.springsecurity;

import  java.io.IOException;

import  javax.servlet.FilterChain;
import  javax.servlet.ServletException;
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;
import  javax.servlet.http.HttpSession;

import  org.springframework.security.Authentication;
import  org.springframework.security.AuthenticationException;
import  org.springframework.security.providers.UsernamePasswordAuthenticationToken;
import  org.springframework.security.ui.webapp.AuthenticationProcessingFilter;
import  org.springframework.security.util.TextUtils;
import  org.springframework.util.StringUtils;

/**
 * Extends the default {
@link  AuthenticationProcessingFilter} to override the
 * <code>sendRedirect()</code> logic and always send absolute redirects.
 * 
 * 
@author  Tsuyoshi Yamamoto
 
*/
public   class  GrailsAuthenticationProcessingFilter  extends
        AuthenticationProcessingFilter {

    
private  String _ajaxAuthenticationFailureUrl;

    
/**
     * {
@inheritDoc }
     * 
     * 
@see  org.springframework.security.ui.AbstractProcessingFilter#doFilterHttp(javax.servlet.http.HttpServletRequest,
     *      javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain)
     
*/
    @Override
    
public   void  doFilterHttp( final  HttpServletRequest request,
            
final  HttpServletResponse response,  final  FilterChain chain)
            
throws  IOException, ServletException {
        SecurityRequestHolder.set(request, response);
        
try  {
            
super .doFilterHttp(request, response, chain);
        } 
finally  {
            SecurityRequestHolder.reset();
        }
    }

    
/**
     * {
@inheritDoc }
     * 
     * 
@see  org.springframework.security.ui.AbstractProcessingFilter#sendRedirect(javax.servlet.http.HttpServletRequest,
     *      javax.servlet.http.HttpServletResponse, java.lang.String)
     
*/
    @Override
    
protected   void  sendRedirect( final  HttpServletRequest request,
            
final  HttpServletResponse response,  final  String url)
            
throws  IOException {
        RedirectUtils.sendRedirect(request, response, url);
    }

    
/**
     * {
@inheritDoc }
     * 
     * 
@see  org.springframework.security.ui.AbstractProcessingFilter#determineFailureUrl(javax.servlet.http.HttpServletRequest,
     *      org.springframework.security.AuthenticationException)
     
*/
    @Override
    
protected  String determineFailureUrl( final  HttpServletRequest request,
            
final  AuthenticationException failed) {
        String url 
=   super .determineFailureUrl(request, failed);
        
if  (getAuthenticationFailureUrl().equals(url)
                
&&  AuthorizeTools.isAjax(request)) {
            url 
=  StringUtils.hasLength(_ajaxAuthenticationFailureUrl)  ?  _ajaxAuthenticationFailureUrl
                    : getAuthenticationFailureUrl();
        }
        
return  url;
    }

    
/**
     * Dependency injection for the Ajax auth fail url.
     * 
     * 
@param  url
     *            the url
     
*/
    
public   void  setAjaxAuthenticationFailureUrl( final  String url) {
        _ajaxAuthenticationFailureUrl 
=  url;
    }

    
public  Authentication attemptAuthentication(HttpServletRequest request)
            
throws  AuthenticationException {
        String inputValidationCode 
=  request.getParameter(  " captcha "  );
        
// 从Session中取出验证码
        String ssnValidationCode  =  (String)request.getSession().getAttribute(  " captcha "  );

        
if ( ssnValidationCode  !=   null   &&   ! ssnValidationCode.equals( inputValidationCode.toUpperCase() ) ){
            
// 用户输入的值与看到的不一致,抛出异常
             throw   new  ValidationCodeException(  " 验证码输入错误! " );
        } 
        String username 
=  obtainUsername(request);
        String password 
=  obtainPassword(request);
        System.out.println(
" testestesetsetestest: " + inputValidationCode);
        
if  (username  ==   null ) {
            username 
=   "" ;
        }

        
if  (password  ==   null ) {
            password 
=   "" ;
        }

        username 
=  username.trim();

        UsernamePasswordAuthenticationToken authRequest 
=   new  UsernamePasswordAuthenticationToken(
                username, password);

        
//  Place the last username attempted into HttpSession for views
        HttpSession session  =  request.getSession( false );

        
if  (session  !=   null   ||  getAllowSessionCreation()) {
            request.getSession().setAttribute(
                    SPRING_SECURITY_LAST_USERNAME_KEY,
                    TextUtils.escapeEntities(username));
        }

        
//  Allow subclasses to set the "details" property
        setDetails(request, authRequest);

        
return   this .getAuthenticationManager().authenticate(authRequest);
    }
}

然后再在这外包下面加一个类,其实就是抛出的一个异常类
package  org.codehaus.groovy.grails.plugins.springsecurity;
import  org.springframework.security.AuthenticationException;
/**
*
*/
public   class  ValidationCodeException  extends  AuthenticationException {
    
public  ValidationCodeException(String s) {
        
super (s);
    }
}
这样就可以了,前台加上代码就行了。
不过,这样还不算玩,如果重做系统之类的,还得改,因为改的代码保存是在C盘。这也让我郁闷啊。这几天换机子,机子坏,改了好几遍了。
记得FCKeditor有上传图片显示不能显示的问题,今天重先发布工程时,网上下载的fckeditor,没改源码也能正常使用了,有点因祸得福的感觉。

天苍苍,野茫茫,风吹草底见牛羊

你可能感兴趣的:(grails acegi 登录验证码的实现)