第 4 章 自定义登陆页面

Spring Security虽然默认提供了一个登陆页面,但是这个页面实在太简陋了,只有在快速演示时才有可能它做系统的登陆页面,实际开发时无论是从美观还是实用性角度考虑,我们都必须实现自定义的登录页面。

4.1. 实现自定义登陆页面

自己实现一个login.jsp,放在src/main/webapp/目录下。

+ ch004/
  + src/
    + main/
      + resources/
        * applicationContext.xml
      + webapp/
        + WEB-INF/
          * web.xml
        * admin.jsp
        * index.jsp
        * login.jsp
    + test/
      + resources/
  * pom.xml
        

4.2. 修改配置文件

在xml中的http标签中添加一个form-login标签。

<http auto-config='true'>
    <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />1
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <form-login login-page="/login.jsp"2
                authentication-failure-url="/login.jsp?error=true"3
                default-target-url="/" />4
</http>
        

1

让没登陆的用户也可以访问login.jsp。[2]

这是因为配置文件中的“/**”配置,要求用户访问任意一个系统资源时,必须拥有ROLE_USER角色,/login.jsp也不例外,如果我们不为/login.jsp单独配置访问权限,会造成用户连登陆的权限都没有,这是不正确的。

2

login-page表示用户登陆时显示我们自定义的login.jsp。

这时我们访问系统显示的登陆页面将是我们上面创建的login.jsp。

3

authentication-failure-url表示用户登陆失败时,跳转到哪个页面。

当用户输入的登录名和密码不正确时,系统将再次跳转到/login.jsp,并添加一个error=true参数作为登陆失败的标示。

4

default-target-url表示登陆成功时,跳转到哪个页面。[3]

4.3. 登陆页面中的参数配置

以下是我们创建的login.jsp页面的主要代码。

<div class="error ${param.error == true ? '' : 'hide'}">
  登陆失败<br>
  ${sessionScope['SPRING_SECURITY_LAST_EXCEPTION'].message}
</div>
<form action="${pageContext.request.contextPath}/j_spring_security_check1" method="post"2 style="width:260px;text-align:center;">
  <fieldset>
    <legend>登陆</legend>
    用户: <input type="text" name="j_username3" style="width:150px;" value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}"/><br />
    密码: <input type="password" name="j_password4" style="width:150px;" /><br />
    <input type="checkbox" name="_spring_security_remember_me5" />两周之内不必登陆<br />
    <input type="submit" value="登陆"/>
    <input type="reset" value="重置"/>
  </fieldset>
</form>
        

1

/j_spring_security_check,提交登陆信息的URL地址。

自定义form时,要把form的action设置为/j_spring_security_check。注意这里要使用绝对路径,避免登陆页面存放的页面可能带来的问题。[4]

2

必须使用post方式提交用户名和密码,如果不设置method属性,form默认使用get方式,这会导致password以明文的方式暴露到url中。

3

j_username,输入登陆名的参数名称。

4

j_password,输入密码的参数名称

5

_spring_security_remember_me,选择是否允许自动登录的参数名称。

可以直接把这个参数设置为一个checkbox,无需设置value,Spring Security会自行判断它是否被选中。

以上介绍了自定义页面上Spring Security所需的基本元素,这些参数名称都采用了Spring Security中默认的配置值,如果有特殊需要还可以通过配置文件进行修改。

4.4. 测试一下

经过以上配置,我们终于使用了一个自己创建的登陆页面替换了原来Spring Security默认提供的登录页面了。我们不仅仅是做个样子,而是实际配置了各个Spring Security所需的参数,真正将自定义登陆页面与Spring Security紧紧的整合在了一起。以下是使用自定义登陆页面实际运行时的截图。

进入登录页面

图 4.1. 进入登录页面


用户登陆失败

图 4.2. 用户登陆失败


实例见ch004。



[2] 有关匿名用户的知识,我们会在之后的章节中进行讲解。

[3] 登陆成功后跳转策略的知识,我们会在之后的章节中进行讲解。

[4] 关于绝对路径和相对路径的详细讨论,请参考http://www.mossle.com/docs/jsp/html/jsp-ch-03.html#jsp-ch-03-04-01