首页 > 代码库 > 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 Security的form-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)自定义表单认证