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; } 返回错误; } }春季安全添加验证码的示例代码