春季安全添加验证码的示例代码

  

spring security是一个很大的模块,本文中只涉及到了自定义参数的认证.spring安全默认的验证参数只有用户名和密码,一般来说都是不够用的。由于时间过太久,有些忘,可能有少许遗漏。好了,不废话。
  春天以及spring security配置采用javaConfig,版本依次为4.2.5,4.0.4
  总体思路:自定义入口点,添加自定义参数扩展AuthenticationToken以及AuthenticationProvider进行验证。

  

首先定义入口点:

        进口org.springframework.security.core.AuthenticationException;   进口org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;   进口javax.servlet.ServletException;   进口javax.servlet.http.HttpServletRequest;   进口javax.servlet.http.HttpServletResponse;   进口java.io.IOException;   公开课MyAuthenticationEntryPoint延伸LoginUrlAuthenticationEntryPoint {   公共MyAuthenticationEntryPoint(字符串loginFormUrl) {   超级(loginFormUrl);   }   @Override   公共空间开始(HttpServletRequest请求,HttpServletResponse响应,AuthenticationException authException)抛出IOException, ServletException {   super.commence(请求、响应authException);   }   }      之前      

接下来是令牌,validCode是验证码参数:

        进口org.springframework.security.authentication.UsernamePasswordAuthenticationToken;   公开课MyUsernamePasswordAuthenticationToken延伸UsernamePasswordAuthenticationToken {   私人字符串validCode;   公共MyUsernamePasswordAuthenticationToken(字符串本金,字符串凭据,字符串validCode) {   超级(主体,凭证);   这一点。validCode=validCode;   }   公共字符串getValidCode () {   返回validCode;   }   公共空间setValidCode(字符串validCode) {   这一点。validCode=validCode;   }   }      之前      

继续ProcessingFilter,

        进口com.core.shared.ValidateCodeHandle;   进口org.springframework.security.core.Authentication;   进口org.springframework.security.core.AuthenticationException;   进口org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;   进口org.springframework.security.web.util.matcher.AntPathRequestMatcher;   进口javax.servlet.ServletException;   进口javax.servlet.http.HttpServletRequest;   进口javax.servlet.http.HttpServletResponse;   进口javax.servlet.http.HttpSession;   进口java.io.IOException;   公开课MyValidCodeProcessingFilter延伸AbstractAuthenticationProcessingFilter {   私人字符串usernameParam=坝没?   私人字符串passwordParam=懊苈搿?   私人字符串validCodeParam=皏alidateCode”;   公共MyValidCodeProcessingFilter () {   超级(新AntPathRequestMatcher (“/user/登录”、“后”));   }      @Override   公开身份验证attemptAuthentication (HttpServletRequest请求,HttpServletResponse响应)抛出AuthenticationException, IOException ServletException {   字符串的用户名=request.getParameter (usernameParam);   字符串密码=request.getParameter (passwordParam);   字符串validCode=request.getParameter (validCodeParam);   有效的(validCode request.getSession ());   MyUsernamePasswordAuthenticationToken牌=new MyUsernamePasswordAuthenticationToken(用户名、密码validCode);   返回this.getAuthenticationManager () .authenticate(令牌);   }      公共空间有效(字符串validCode, HttpSession会话){   如果(validCode==null) {   把新ValidCodeErrorException(“验证码为空! ");   }   如果(! ValidateCodeHandle.matchCode (session.getId (), validCode)) {   把新ValidCodeErrorException(“验证码错误!”);   }   }   }   之前      

分别定义三个参数,用于接收登录表单过来的参数,构造方法给出了登录的网址以及需要发布方式
  

  

接下来就是认证了,此处还没到认证用户名和密码的时候,只是认证了验证码
  

  

下面是ValidateCodeHandle一个工具类以及ValidCodeErrorException:

        进口java.util.concurrent.ConcurrentHashMap;   公开课ValidateCodeHandle {   私有静态ConcurrentHashMap validateCode=new ConcurrentHashMap<在();   公共静态ConcurrentHashMap getCode () {   返回validateCode;   }      sessionId公共静态孔隙保存(字符串,字符串代码){   validateCode。把(sessionId、代码);   }      getValidateCode公共静态字符串(字符串sessionId) {   对象obj=validateCode.get (sessionId);   如果(obj !=null) {   返回String.valueOf (obj);   }   返回null;   }      公共静态布尔matchCode (sessionId的字符串,字符串inputCode) {   字符串saveCode=getValidateCode (sessionId);   如果(saveCode.equals (inputCode)) {   返回true;   }   返回错误;   }   }

春季安全添加验证码的示例代码