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 >
说明:
只需要给authentication-provider元素添加子元素password-encoder,并提供一个实现了PasswordEncoder接口的类bean作为引用即可。
当然,这样的话,只是在登录验证的时候会使用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>
说明:
action属性的值不要改变,就是j_spring_security_check
,这是登录时提交的默认地址。这个只是Spring Security用来标记登录页面使用的提交地址,真正关于登录这个请求是不需要用户自己处理的。
我发现错写成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 >
说明:
/login
要允许在不登录的情况下能访问。
登录页面的form表单要指定action属性,否则会跳转不出登录页面;form-login元素一定要指定login-processing-url属性,否则会报404的错。