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>

測試