在數據表中存的密碼不該該是123456,而應該是123456加密以後的字符串,並且還要求這個加密算法是不可逆的,即由加密後的字符串不能反推回來原來的密碼,若是能反推回來那這個加密是沒有意義的。著名的加密算法,好比 MD5,SHA1。下面就來介紹如何用shiro進行MD5加密並驗證前端
1.在註冊的時候將前端傳過來的密碼入數據庫以前進行加密java
public void encryptPassword(User user) { String salt = new SecureRandomNumberGenerator().nextBytes().toHex(); user.setSalt(salt); String newPassword = new SimpleHash( algorithmName, user.getPassword(), user.getSalt(), hashIterations).toHex(); user.setPassword(newPassword); }
2.在spring容器中自定義realm的配置加入HashedCredentialsMatcher,這樣前端輸入的密碼進入realm就會自動進行加密了,此外還能夠配置了加密次數等。算法
<bean id="myShiroRealm" class="com.wang.realm.MyShiroReaml"> <!-- businessManager 用來實現用戶名密碼的查詢 --> <property name="userService" ref="userService" /> <property name="permissionService" ref="permissionService" /> <!-- 若是不加入密碼匹配的操做,密碼就不會存在 --> <!-- 加入了密碼匹配器以後,就會默認將前臺傳遞過來的密碼自動MD5加密 --> <property name="credentialsMatcher"> <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> <!-- 加密的方式 --> <constructor-arg index="0" type="java.lang.String" value="MD5" /> <!-- 加密的次數,默認是1次 --> <property name="hashIterations" value="2"/> </bean> </property> </bean>
3.這部分就是realm的驗證部分了接收前端的參數,取出數據庫中的對象,而後根據密碼,鹽值等進行解密,匹配等等,這部分shiro已經幫咱們作好了。spring
// 認證方法 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //驗證帳號密碼 UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; User user = userService.findUserByName(token.getUsername()); if(user==null){ throw new UnknownAccountException(); } if(Boolean.TRUE.equals(user.getLocked())) { throw new LockedAccountException(); //賬號鎖定 } ByteSource credentialsSalt = ByteSource.Util.bytes(user.getSalt());//這裏的參數要給個惟一的; //最後的比對須要交給安全管理器 //三個參數進行初步的簡單認證信息對象的包裝 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( user.getUsername(), //用戶名 user.getPassword(), //密碼 credentialsSalt, getName() //realm name ); return authenticationInfo; }