<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
雖然Spring Security給我們提供了登入頁面,但是對於實際專案中,大多喜歡使用自己的登入頁面。所以Spring Security中不僅僅提供了登入頁面,還支援使用者自定義登入頁面。實現過程也比較簡單,只需要修改設定類即可。
別寫登入頁面,登入頁面中
的action不編寫對應控制器也可以。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>內容</title> </head> <body> <form action="/login" method="post"> <input type="text" name="username"/> <input type="password" name="password"/> <input type="submit" value="提交"/> </form> </body> </html>
修改設定類中主要是設定哪個頁面是登入頁面。設定類需要繼承WebSecurityConfigurerAdapter,並重寫configure方法。
successForwardUrl()登入成功後跳轉地址
loginPage() 登入頁面
loginProcessingUrl 登入頁面表單提交地址,此地址可以不真實存在。
antMatchers():匹配內容
permitAll():允許
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 表單認證 http.formLogin() .loginProcessingUrl("/login") //當發現/login時認為是登入,需要執行 UserDetailsServiceImpl .successForwardUrl("/toMain") //此處是post請求 .loginPage("/login.html"); // url 攔截 http.authorizeRequests() .antMatchers("/login.html").permitAll() //login.html不需要被認證 .anyRequest().authenticated();//所有的請求都必須被認證。必須登入後才能存取。 //關閉csrf防護 http.csrf().disable(); } @Bean public PasswordEncoder getPe(){ return new BCryptPasswordEncoder(); } }
編寫控制器,當用戶登入成功後跳轉toMain控制器。編寫完成控制器後編寫main.html。頁面中隨意寫上一句話表示main.html頁面內容即可。而之前的/login控制器方法是不執行的,所以可以刪除了。
@Controller public class LoginController { // 該方法不會被執行 // @RequestMapping("/login") // public String login(){ // System.out.println("執行了login方法"); // return "redirect:main.html"; // } @PostMapping("/toMain") public String toMain(){ return "redirect:/main.html"; } }
表單處理中成功會跳轉到一個地址,失敗也可以跳轉到一個地址中。
在src/main/resources/static下新建fail.html並編寫如下內容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 操作失敗,請重新登入. <a href="/login.html" rel="external nofollow" >跳轉</a> </body> </html>
在設定方法中表單認證部分新增failureForwardUrl()方法,表示登入失敗跳轉的url。此處依然是POST請求,所以跳轉到可以接收POST請求的控制器/fail中。
// 表單認證 http.formLogin() .loginProcessingUrl("/login") //當發現/login時認為是登入,需要執行UserDetailsServiceImpl .successForwardUrl("/toMain") //此處是post請求 .failureForwardUrl("/fail") //登入失敗跳轉地址 .loginPage("/login.html");
在控制器類中新增控制器方法,方法對映路徑/fail。此處要注意:由於是POST請求存取/fail。所以如果返回值直接轉發到fail.html中,及時有效果,控制檯也會報警告,提示fail.html不支援POST存取方式。
@PostMapping("/fail") public String fail(){ return "redirect:/fail.html"; }
認證失敗跳轉到fail.html頁面中,所以必須設定fail.html不需要被認證。需要修改設定類中內容
// url 攔截 http.authorizeRequests() .antMatchers("/login.html").permitAll() //login.html不需要被認證 .antMatchers("/fail.html").permitAll() //fail.html不需要被認證 .anyRequest().authenticated();//所有的請求都必須被認證。必須登入後才能存取。
當進行登入時會執行UsernamePasswordAuthenticationFilter過濾器。
usernamePasrameter:賬戶引數名
passwordParameter:密碼引數名
postOnly=true:預設情況下只允許POST請求。
// 表單認證 http.formLogin() .loginProcessingUrl("/login") //當發現/login時認為是登入,需要執行UserDetailsServiceImpl .successForwardUrl("/toMain") //此處是post請求 .failureForwardUrl("/fail") //登入失敗跳轉地址 .loginPage("/login.html") .usernameParameter("myusername") .passwordParameter("mypassword");
修改login.html
<form action = "/login" method="post"> 使用者名稱:<input type="text" name="myusername"/><br/> 密碼:<input type="password" name="mypassword"/><br/> <input type="submit" value="登入"/> </form>
使用successForwardUrl()時表示成功後轉發請求到地址。內部是通過successHandler()方法進行控制成功後交給哪個類進行處理
ForwardAuthenticationSuccessHandler內部就是最簡單的請求轉發。由於是請求轉發,當遇到需要跳轉到站外或在前後端分離的專案中就無法使用了。
當需要控制登入成功後去做一些事情時,可以進行自定義認證成功控制器。
新建類com.msb.handler.MyAuthenticationSuccessHandler編寫如下:
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException { //Principal 主體,存放了登入使用者的資訊 User user = (User)authentication.getPrincipal(); System.out.println(user.getUsername()); System.out.println(user.getPassword());//密碼輸出為null System.out.println(user.getAuthorities()); //重定向到百度。這只是一個範例,具體需要看專案業務需求 httpServletResponse.sendRedirect("http://www.baidu.com"); } }
使用successHandler()方法設定成功後交給哪個物件進行處理
// 表單認證 http.formLogin() .loginProcessingUrl("/login") //當發現/login時認為是登入,需要執行UserDetailsServiceImpl .successHandler(new MyAuthenticationSuccessHandler()) //.successForwardUrl("/toMain") //此處是post請求 .failureForwardUrl("/fail") //登入失敗跳轉地址 .loginPage("/login.html");
ForwardAuthenticationFailureHandler中也是一個請求轉發,並在request作用域中設定 SPRING_SECURITY_LAST_EXCEPTION的key,內容為異常物件。
新建com.msb.handler.MyForwardAuthenticationFailureHandler實現AuthenticationFailureHandler。
在方法中新增重定向語句
public class MyForwardAuthenticationFailureHandler implements AuthenticationFailureHandler { @Override public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException { httpServletResponse.sendRedirect("/fail.html"); } }
修改設定類中表單登入部分。設定失敗時交給失敗處理器進行操作。failureForwardUrl和failureHandler不可共存。
// 表單認證 http.formLogin() .loginProcessingUrl("/login") //當發現/login時認為是登入,需要執行UserDetailsServiceImpl .successHandler(new MyAuthenticationSuccessHandler()) //.successForwardUrl("/toMain") //此處是post請求 .failureHandler(new MyForwardAuthenticationFailureHandler()) // .failureForwardUrl("/fail") //登入失敗跳轉地址 .loginPage("/login.html");
以上就是Spring Security自定義登入頁面認證過程常用設定的詳細內容,更多關於Spring Security登入認證設定的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45