緊接着上一篇,上一篇中登陸驗證都由 security 幫助咱們完成了,若是咱們想要增長一個驗證碼登陸或者其它的自定義校驗就沒辦法了,所以這一篇講解如何實現這個功能。java
##1、 實現自定義登陸校驗類api
繼承 UsernamePasswordAuthenticationFilter 類來拓展登陸校驗,代碼以下:ide
public class MyUsernamePasswordAuthentication extends UsernamePasswordAuthenticationFilter{
private Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
//咱們能夠在這裏進行額外的驗證,若是驗證失敗拋出繼承AuthenticationException的自定義錯誤。
log.info("在這裏進行驗證碼判斷");
//只要最終的驗證是帳號密碼形式就無需修改後續過程
return super.attemptAuthentication(request, response);
}
@Override
public void setAuthenticationManager(AuthenticationManager authenticationManager) {
// TODO Auto-generated method stub
super.setAuthenticationManager(authenticationManager);
}
}
複製代碼
##2、 將自定義登陸配置到 security 中 編寫自定義登陸過濾器後,configure Bean 修改成以下:this
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf() //跨站
.disable() //關閉跨站檢測
//自定義鑑權過程,無需下面設置
.authorizeRequests()//驗證策略
.antMatchers("/public/**").permitAll()//無需驗證路徑
.antMatchers("/user/**").permitAll()
.antMatchers("/login").permitAll()//放行登陸
.antMatchers(HttpMethod.GET, "/user").hasAuthority("getAllUser")//擁有權限纔可訪問
.antMatchers(HttpMethod.GET, "/user").hasAnyAuthority("1","2")//擁有任一權限便可訪問
//角色相似,hasRole(),hasAnyRole()
.anyRequest().authenticated()
.and()
//自定義異常處理
.exceptionHandling()
.authenticationEntryPoint(myAuthenticationEntryPoint)//未登陸處理
.accessDeniedHandler(myAccessDeniedHandler)//權限不足處理
.and()
//加入自定義登陸校驗
.addFilterBefore(myUsernamePasswordAuthentication(),UsernamePasswordAuthenticationFilter.class)
.rememberMe()//默認放在內存中
.rememberMeServices(rememberMeServices())
.key("INTERNAL_SECRET_KEY")
// 重寫usernamepasswordauthenticationFilter後,下面的formLogin()設置將失效,須要手動設置到個性化過濾器中
// .and()
// .formLogin()
// .loginPage("/public/unlogin") //未登陸跳轉頁面,設置了authenticationentrypoint後無需設置未登陸跳轉頁面
// .loginProcessingUrl("/public/login")//登陸api
// .successForwardUrl("/success")
// .failureForwardUrl("/failed")
// .usernameParameter("id")
// .passwordParameter("password")
// .failureHandler(myAuthFailedHandle) //登陸失敗處理
// .successHandler(myAuthSuccessHandle)//登陸成功處理
// .usernameParameter("id")
.and()
.logout()//自定義登出
.logoutUrl("/public/logout")
.logoutSuccessUrl("public/logoutSuccess")
.logoutSuccessHandler(myLogoutSuccessHandle);
}
複製代碼
而後再編寫 Bean,代碼以下:spa
@Bean
public MyUsernamePasswordAuthentication myUsernamePasswordAuthentication(){
MyUsernamePasswordAuthentication myUsernamePasswordAuthentication = new MyUsernamePasswordAuthentication();
myUsernamePasswordAuthentication.setAuthenticationFailureHandler(myAuthFailedHandle); //設置登陸失敗處理類
myUsernamePasswordAuthentication.setAuthenticationSuccessHandler(myAuthSuccessHandle);//設置登陸成功處理類
myUsernamePasswordAuthentication.setFilterProcessesUrl("/public/login");
myUsernamePasswordAuthentication.setRememberMeServices(rememberMeServices()); //設置記住我
myUsernamePasswordAuthentication.setUsernameParameter("id");
myUsernamePasswordAuthentication.setPasswordParameter("password");
return myUsernamePasswordAuthentication;
}
複製代碼
完成。code
本文原創發佈於:www.tapme.top/blog/detail…orm