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>





测试
