首页 > 代码库 > Spring Security应用开发(05)自定义表单认证

Spring Security应用开发(05)自定义表单认证

Spring Security自动产生的登录页面非常简陋,但是Spring Security提供了丰富的自定义功能。

 

1.1.1. 密码摘要处理

 

数据库中的密码字段可以使用SHA摘要算法处理后再保存,而不是以明文保存。

mysql> select * from users;

+----------+----------+---------+

| username | password | enabled |

+----------+----------+---------+

| lisi     | 123      |       1 |

| wangwu   | 123      |       1 |

| zhangsan | 123      |       1 |

+----------+----------+---------+

3 rows in set (0.00 sec)

 

mysql> update users set password=sha(password);

Query OK, 3 rows affected (0.01 sec)

Rows matched: 3  Changed: 3  Warnings: 0

 

mysql> select * from users;

+----------+------------------------------------------+---------+

| username | password                                 | enabled |

+----------+------------------------------------------+---------+

| lisi     | 40bd001563085fc35165329ea1ff5c5ecbdbbeef |       1 |

| wangwu   | 40bd001563085fc35165329ea1ff5c5ecbdbbeef |       1 |

| zhangsan | 40bd001563085fc35165329ea1ff5c5ecbdbbeef |       1 |

+----------+------------------------------------------+---------+

 

 

为了让Spring Security能够正常使用SHA处理后的密码字段,需要使用password-encoder标签,并指定hash属性为sha

 <sec:password-encoder hash="sha" /> 

 

1.1.2. 自定义的登录页面

如果需要使用自行设计的登录页面,Spring Securityform-login标签的各种属性能满足需要。

      login-page: 登录页面的URL

      username-parameter:登录表单中用户名的字段名称。

      password-parameter:登录表单中密码的字段名称。

      login-processing-url:登录表单提交地址。

      authentication-success-forward-url:登录成功跳转地址。

      authentication-failure-url:登录失败跳转地址。

 

登录表单设计:

需要通过${_csrf.parameterName}标签加入_csrf隐藏字段,否则出现拒绝访问的错误。

 

<c:url var="loginurl" value="/login/login_process.action"></c:url>

<FORM action="${loginurl }" method="post">

<br /><LABEL for="username">用户</LABEL><INPUT id="username" name="username" maxlength="64" type="text"  />

<br /><LABEL for="password">密码</LABEL><INPUT id="password" name="password" maxlength="64" type="password" />

<br /><INPUT type="submit" value="登录" />

<input type="hidden"  name="${_csrf.parameterName}"   value="${_csrf.token}"/>

</FORM>

 

 

同时还可以根据需要设计相应的登录成功页面和登录失败页面。

 

1.1.3. 自定义退出登录页面

如果需要自定义退出登录页面,则可以使用logout标签。

      invalidate-session:是否清空session

      logout-url="/login/logout.action":退出表单的提交地址。

      logout-success-url:退出成功后的跳转地址。

 

退出登录表单同样需要加入_csrf隐藏字段。

<c:url var="logoutUrl" value="/login/logout.action"/>

  <form  action="${logoutUrl}" method="post">

       <input type="submit" value="退出系统" />

       <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

  </form>

 

 

在使用POST方式时可以正常退出登录,而使用GET方式则无法正常退出登录。

 

1.1.4. 自定义拒绝访问页面

如果需要自定义拒绝访问页面,则可以使用access-denied-handler标签,其error-page属性

可以指定自定义页面。

 

1.1.5. 完整配置

 

spring-security.xml完整的配置信息如下所示:

 

<!-- 角色和URL模式的对应关系 -->

 <sec:http auto-config="true" use-expressions="true">

 

 <!-- 登录相关页面 -->
 <sec:form-login login-page="/login/login_form.action"
      username-parameter="username"
      password-parameter="password"
      login-processing-url="/login/login_process.action"
      authentication-success-forward-url="/login/login_success.action"
      authentication-failure-url="/login/login_failed.action"
  />

  <sec:access-denied-handler error-page="/login/access_denied.action" />

  <sec:logout invalidate-session="true"
      logout-url="/login/logout.action"
      logout-success-url="/login/logout_success.action"
  />


 <sec:intercept-url pattern="/admin/**" access="hasRole(‘ROLE_ADMIN‘)" />
 <sec:intercept-url pattern="/user/**" access="hasRole(‘ROLE_USER‘)" />
 <sec:intercept-url pattern="/home/**" access="hasRole(‘ROLE_USER‘) or hasRole(‘ROLE_ADMIN‘)" />

 </sec:http>

 

 <!-- 用户和角色的对应关系 -->

 <sec:authentication-manager>
   <sec:authentication-provider>
      <sec:jdbc-user-service data-source-ref="dataSource"  />
      <sec:password-encoder hash="sha" />
      </sec:authentication-provider>
 </sec:authentication-manager>
  <beans:bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
        <beans:property name="locations">  
            <beans:value>classpath*:config/spring/jdbc.properties</beans:value>  
        </beans:property>  

 </beans:bean>  

 
    <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <beans:property name="driverClassName" value="${jdbc.driverClassName}" />  
        <beans:property name="url" value="${jdbc.url}" />  
        <beans:property name="username" value="${jdbc.username}" />  
        <beans:property name="password" value="${jdbc.password}" />  
    </beans:bean>  

 

Spring Security应用开发(05)自定义表单认证