对于使用Acegi框架实现安全的开发人员,都会碰到用户密码加密的需求。数据库中存储的是加密后的密文,用户登录时需将输入的密码加密后在和数据库中的密文密码进行比对。
Acegi本身考虑的已经很周到了,提供了3中常用的密码加密方式,分别为Md5,Sha,Plaintext,由3个类分别实现
1.Md5PasswordEncoder - Md5方式
2.ShaPasswordEncoder - 哈西方式
3.PlaintextPasswordEncoder - 明文方式
使用起来也很简单,只需做简单的配置,例如:
<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="jdbcDaoImpl" /> <property name="userCache" ref="userCache" /> <property name="passwordEncoder" ref="md5PasswordEncoder" /> </bean> <bean id="md5PasswordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"/>
对于需要自己扩展自定义加密机制的人也很简单,只需要实现Acegi的org.acegisecurity.providers.encoding.PasswordEncoder 接口。其中有两个方法:
@实现加密的方法,既将明文转换为密文的方法
public abstract String encodePassword(String rawPass, Object salt)
throws DataAccessException;
@验证密码是否有效的方法,返回'true'则登录成功
public abstract boolean isPasswordValid(String encPass, String rawPass, Object salt)
throws DataAccessException;
例如:
public class JitPasswordEncoder implements PasswordEncoder { public String encodePassword(String rawPass, Object salt) throws DataAccessException { NetSignServer netSignServer = new NetSignServer(); String pass = null; try { pass = netSignServer.NSHashAndBase64Encode(rawPass); } catch (IOException e) { e.printStackTrace(); } return pass; } public boolean isPasswordValid(String encPass, String rawPass, Object salt) throws DataAccessException { String pass1 = "" + encPass; String pass2 = encodePassword(rawPass, salt); return pass1.equals(pass2); } }
其中encPass是数据库中保存的密码,rawPass是用户输入的密码,salt是生成密码时的种子,这个例子中我未用到。
流程是,当用户登录时,将调用isPasswordValid()方法验证登录凭证,isPasswordValid()方法将会调用encodePassword()方法将用户输入的密码进行加密,然后将数据库中所存密码和输入的加密后的密码进行比对,符合返回'true'则用户登录成功。
至此相信你已经掌握了如何实现如何在Acegi中自定义加密密码的方法,至于salt参数的使用有待后续讲解。
The end.