SpringSecurity学习(五)用户密码加密与自定义登录页面

Spring Security支持MD5,SHA,Bcrypt,hash等。MD5不加盐算法通过撞库很容易得到匹配的密码明文。官方API中有这么一段话。

说明spring官方推荐使用BcryptPasswordEncoder。
PasswordEncoder接口只有两个抽象方法,encode用于加密和matches用于匹配。MessageDigestPasswordEncoder也实现了PasswordEncoder接口,它有两个子类Md5PasswordEncoder和ShaPasswordEncoder,看名字就知道是干啥的。

项目结构

搭建步骤——用户密码加密

更新spring-security.xml

1
2
3
4
5
6
7
8
9
10
11
12
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="userDetailsService">
<password-encoder ref="encoder"/>
</authentication-provider>
</authentication-manager>
<beans:bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="enableGroups" value="true"/>
</beans:bean>
<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
<beans:constructor-arg name="strength" value="11"/>
</beans:bean>

说明:

  1. 只需要给authentication-provider元素添加子元素password-encoder,并提供一个实现了PasswordEncoder接口的类bean作为引用即可。
  2. 当然,这样的话,只是在登录验证的时候会使用Bcrypt算法验证。所以,注册密码要使用BcryptPasswordEncoder加密。

搭建步骤——自定义登录界面

新建login.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="j_spring_security_check" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="登录">
<input type="reset" value="重置">
</td>
</tr>
</table>
</form>
</body>
</html>

说明:

  1. action属性的值不要改变,就是j_spring_security_check,这是登录时提交的默认地址。这个只是Spring Security用来标记登录页面使用的提交地址,真正关于登录这个请求是不需要用户自己处理的。
  2. 我发现错写成j-spring-security-check也是行得通的(⊙o⊙)…

更新HelloController

增加一个登录接口,仅仅返回登录页面

1
2
3
4
@RequestMapping("/login")
public String loginPage(Model model){
return "login";
}

更新spring-security.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/" access="permitAll" />
<intercept-url pattern="/home" access="permitAll" />
<intercept-url pattern="/login" access="permitAll"/>
<intercept-url pattern="/admin**" access="hasRole('ADMIN')" />
<intercept-url pattern="/dba**"
access="hasRole('ADMIN') and hasRole('DBA')" />

<form-login
login-page="/login"
username-parameter="username"
password-parameter="password"
login-processing-url="/j_spring_security_check"
authentication-failure-url="/Access_Denied" />

</http>

说明:

  1. /login要允许在不登录的情况下能访问。
  2. 登录页面的form表单要指定action属性,否则会跳转不出登录页面;form-login元素一定要指定login-processing-url属性,否则会报404的错。

热评文章