shiro教程6(多realm認證)
- 2019 年 12 月 12 日
- 筆記
為什麼要使用多realm認證?
實際開發中存在這樣一種場景,同一個密碼可能在MqSQL中存儲,也可能在Oracle中存儲,有可能MqSQL中使用的是MD5加密算法,而Oracle使用SHA1加密算法。這就需要有多個Realm以及認證策略的問題。
實現多realm認證
在上篇教程的基礎上我們來完成此案例shiro教程5(整合SSM項目-認證)
首先MD5和SHA1加密簡單實現
SHA1算法
public static void main(String[] args) { // 算法引入的是 org.apache.shiro.crypto.hash.Sha1Hash // shiro中提供的jar包 // SHA1算法 原始密碼 鹽值 加密次數 Sha1Hash sha1= new Sha1Hash("123456", "aaa", 2); System.out.println(sha1); // 輸出結果是:61c47830088c7355a7a2ac0106137632f2476bea }
MD5算法
@Test public void Md5Test() { // 對單個信息加密 Md5Hash md5 = new Md5Hash("123456"); System.out.println(md5.toString()); // 加密添加鹽值 增大解密難度 md5 = new Md5Hash("123456","aaa"); System.out.println(md5.toString()); // 加密添加鹽值 增大解密難度 2迭代兩次 md5 = new Md5Hash("123456","aaa",2); System.out.println(md5); // 輸出結果:a7cf41c6537065fe724cc9980f8b5635 }
模擬數據
users表中存儲的數據是MD5加密的數據
users1表中存儲的數據是SHA1加密的數據
項目實現多Realm認證
mapper接口
public interface UsersMapper { /** * 查詢users表 * @param userName * @return */ public Users queryUserByName(String userName); /** * 查詢users1表 * @param userName * @return */ public Users queryUserByNameSHA1(String userName); }
mapper映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dpb.mapper.UsersMapper"> <select id="queryUserByName" resultType="users"> select * from users where username = #{param1} </select> <select id="queryUserByNameSHA1" resultType="users"> select * from users1 where username = #{param1} </select> </mapper>
service處理
public interface IUsersService { public Users login(String userName); public Users loginSha1(String userName); }
@Service public class UsersServiceImpl implements IUsersService { @Resource private UsersMapper mapper; @Override public Users login(String userName) { // TODO Auto-generated method stub return mapper.queryUserByName(userName); } @Override public Users loginSha1(String userName) { // TODO Auto-generated method stub return mapper.queryUserByNameSHA1(userName); } }
添加一個自定義Realm文件
添加多Realm配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> <!-- 註冊自定義Realm --> <bean class="com.dpb.realm.MyRealm" id="myRealm"> <!-- 配置憑證匹配器 --> <property name="credentialsMatcher"> <!-- 定義憑證匹配器 --> <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> <!-- 配置散列算法 --> <property name="hashAlgorithmName" value="MD5" /> <!-- 配置散列次數 --> <property name="hashIterations" value="2" /> </bean> </property> </bean> <!-- 註冊第二個Realm --> <bean class="com.dpb.realm.MyRealmSha1" id="myRealmSha1"> <!-- 配置憑證匹配器 --> <property name="credentialsMatcher"> <!-- 定義憑證匹配器 --> <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> <!-- 配置散列算法 --> <property name="hashAlgorithmName" value="SHA1"/> <!-- 配置散列次數 --> <property name="hashIterations" value="2" /> </bean> </property> </bean> <!-- 註冊SecurityManager --> <bean class="org.apache.shiro.web.mgt.DefaultWebSecurityManager" id="securityManager"> <property name="authenticator"> <bean class="org.apache.shiro.authc.pam.ModularRealmAuthenticator" > <property name="authenticationStrategy" > <!-- 至少有一個Realm認證通過 --> <bean class="org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy"/> </property> </bean> </property> <!-- 配置自定義Realm --> <property name="realms" > <list> <ref bean="myRealm"/> <ref bean="myRealmSha1"/> </list> </property> </bean> <!-- 註冊ShiroFilterFactoryBean 注意id必須和web.xml中註冊的targetBeanName的值一致 --> <bean class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" id="shiro"> <!-- 註冊SecurityManager --> <property name="securityManager" ref="securityManager" /> <!-- 登錄地址 如果用戶請求的的地址是 login.do 那麼會對該地址認證 --> <property name="loginUrl" value="/login.do" /> <!-- 登錄成功的跳轉地址 --> <property name="successUrl" value="/jsp/success.jsp" /> <!-- 訪問未授權的頁面跳轉的地址 --> <property name="unauthorizedUrl" value="/jsp/refuse.jsp" /> <!-- 設置 過濾器鏈 --> <property name="filterChainDefinitions"> <value> /login.do=authc /**=anon </value> </property> </bean> </beans>