ITPub博客

首页 > IT职业 > IT图书 > Spring Security笔记:自定义登录页

Spring Security笔记:自定义登录页

IT图书 作者:CNNBULL 时间:2021-09-09 09:11:30 0 删除 编辑

以下内容参考了 http://www.mkyong.com/spring-security/spring-security-form-login-example/

接上回,在前面的Hello World示例中,Spring Security为我们自动生成了默认登录页,对于大多数项目而言,如此简单的登录页并不能满足实际需求,接下来,我们看看如何自定义登录页

一、项目结构

图片描述

与前一个示例相比较,只是多了一个css样式以及登录页login.jsp,这二个文件具体的内容如下:

 1 @CHARSET "UTF-8"; 
 2  
 3 .error { 
 4     padding: 15px; 
 5     margin-bottom: 20px; 
 6     border: 1px solid transparent; 
 7     border-radius: 4px; 
 8     color: #a94442; 
 9     background-color: #f2dede;
 10     border-color: #ebccd1;
 11 }
 12 
 13 .msg {
 14     padding: 15px;
 15     margin-bottom: 20px;
 16     border: 1px solid transparent;
 17     border-radius: 4px;
 18     color: #31708f;
 19     background-color: #d9edf7;
 20     border-color: #bce8f1;
 21 }
 22 
 23 #login-box {
 24     width: 300px;
 25     padding: 20px;
 26     margin: 100px auto;
 27     background: #fff;
 28     -webkit-border-radius: 2px;
 29     -moz-border-radius: 2px;
 30     border: 1px solid #000;
 31 }

login.css

 1  
 3  
 4 html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
 5  
 6  
 7  
 8 Login Page 
 9 
 10 
 11 
 12     

Spring Security Custom Login Form (XML)

 13   14     
 15         

Login with Username and Password

 16           17             
${error}
 18         
 19           20             
${msg}
 21         
 22         
" method='POST'>  24               25                   26                       27                       28                   29                   30                       31                       32                   33                   34                       36                   37             
User:
Password:
 38               40           41     
 42   43 

login.jsp

有几个地方解释一下:

第9行,css静态资源的引用方式,如果对Spring MVC不熟悉的人,可借此示例学习一下

15-20行,用了一个if标签来判断登录验证是否有错,如果验证失败,则显示错误信息,其中error,msg这二个变量,是从Controller里返回的信息(后面马上会讲到)

23行form表单的action地址留意一下,这个不能改,这是Spring Security的约定

38-39行的隐藏域_csrf,这是用来防止跨站提交攻击的,如果看不懂,可暂时无视。

 

二、Controller

 1 package com.cnblogs.yjmyzz; 
 2  
 3 import org.springframework.stereotype.Controller; 
 4 import org.springframework.web.bind.annotation.RequestMapping; 
 5 import org.springframework.web.bind.annotation.RequestMethod; 
 6 import org.springframework.web.bind.annotation.RequestParam; 
 7 import org.springframework.web.servlet.ModelAndView; 
 8  
 9 @Controller10 public class HelloController {
 11 
 12     @RequestMapping(value = { "/", "/welcome" }, method = RequestMethod.GET)
 13     public ModelAndView welcome() {
 14 
 15         ModelAndView model = new ModelAndView();
 16         model.addObject("title", "Spring Security Custom Login Form");
 17         model.addObject("message", "This is welcome page!");
 18         model.setViewName("hello");
 19         return model;
 20 
 21     }
 22 
 23     @RequestMapping(value = "/admin", method = RequestMethod.GET)
 24     public ModelAndView admin() {
 25 
 26         ModelAndView model = new ModelAndView();
 27         model.addObject("title", "Spring Security Custom Login Form");
 28         model.addObject("message", "This is protected page!");
 29         model.setViewName("admin");
 30 
 31         return model;
 32 
 33     }
 34 
 35     //新增加的Action方法,映射到
 36     // 1. /login 登录页面的常规显示
 37     // 2. /login?error 登录验证失败的展示
 38     // 3. /login?logout 注销登录的处理
 39     @RequestMapping(value = "/login", method = RequestMethod.GET)
 40     public ModelAndView login(
 41             @RequestParam(value = "error", required = false) String error,
 42             @RequestParam(value = "logout", required = false) String logout) {
 43 
 44         ModelAndView model = new ModelAndView();
 45         if (error != null) {
 46             model.addObject("error", "Invalid username and password!");
 47         }
 48 
 49         if (logout != null) {
 50             model.addObject("msg", "You've been logged out successfully.");
 51         }
 52         model.setViewName("login");
 53 
 54         return model;
 55 
 56     }
 57 
 58 }

HelloController

增加了一个login方法,映射到登录的三种情况(常规显示,出错展示,注销登录)

 

三、spring-security.xml

 1  
 7  
 8      
 9         
 10         
 13         
 14         <!-- enable csrf protection -->
 15         
 16     
 17 
 18     
 19         
 20             
 21                 
 22             
 23         
 24     
 25 
 26 

spring-security.xml

注意8-16行的变化,一看即懂,就不多做解释了

 

运行效果:

登录页正常显示的截图

图片描述

登录失败的截图

图片描述

有兴趣的还可以看下对应的html源代码

图片描述

防跨站提交攻击的_csrf隐藏域,会生成一个随机的类似guid字符串来做校验,以确定本次http post确实是从本页面发起的,这跟asp.net里mac ViewState的思路一致。

 

最后附示例源代码下载:SpringSecurity-CustomLoginForm-XML(0717).zip

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2524/viewspace-2800253/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-08-16

  • 博文量
    80
  • 访问量
    24793