前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shiro教程2(自定义Realm)

shiro教程2(自定义Realm)

作者头像
用户4919348
发布2019-04-02 11:39:58
8580
发布2019-04-02 11:39:58
举报
文章被收录于专栏:波波烤鸭波波烤鸭

  通过shiro教程1我们发现仅仅将数据源信息定义在ini文件中与我们实际开发环境有很大不兼容,所以我们希望能够自定义Realm。

自定义Realm的实现

创建自定义Realmjava类

创建一个java文件继承AuthorizingRealm类,重写两个抽象方法

代码语言:javascript
复制
/**
 * 自定义的Realm
 * @author dengp
 *
 */
public class MyRealm extends AuthorizingRealm{

	/**
	 * 认证方法
	 * @param token 
	 * 	就是我们在测试代码中 定义的UsernamePasswordToken对象
	 *  有我们保存的需要验证的账号密码信息
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		// 获取账号信息
		String principal = (String) token.getPrincipal();
		// 正常逻辑此处应该根据账号去数据库中查询,此处我们默认账号为 root 密码123456
		// 验证账号
		if(!"root".equals(principal)){
			// 账号错误
			return null;
		}
		String pwd = "123456";
		// 验证密码
		AuthenticationInfo info = new SimpleAuthenticationInfo(principal, pwd,"myrealm");
		return info;
	}
	
	/**
	 * 授权方法
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		// TODO Auto-generated method stub
		return null;
	}
}

方法名

说明

doGetAuthenticationInfo

完成账号认证的方法

doGetAuthorizationInfo

完成用户授权的方法

配置ini.xml文件

代码语言:javascript
复制
[main]
#自定义 realm
customRealm=com.dpb.realm.MyRealm
#将realm设置到securityManager
securityManager.realms=$customRealm

测试

测试代码和上个案例一模一样

代码语言:javascript
复制
@Test
public void test() {
	// 1.获取SecurityManager工厂对象
	Factory<SecurityManager> factory = 
			new IniSecurityManagerFactory("classpath:shiro.ini");
	// 2.通过Factory对象获取SecurityManager对象
	SecurityManager securityManager = factory.getInstance();
	// 3.将SecurityManager对象添加到当前运行环境中
	SecurityUtils.setSecurityManager(securityManager);
	
	// 4.获取Subject对象
	Subject subject = SecurityUtils.getSubject();
	AuthenticationToken token = new UsernamePasswordToken("root1", "12345");
	// 登录操作
	try {
		subject.login(token);
	} catch (UnknownAccountException e) {
		System.out.println("账号出错...");
	} catch(IncorrectCredentialsException e){
		System.out.println("密码出错...");
	}
	// 获取登录的状态
	System.out.println(subject.isAuthenticated());
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原理分析

为什么要继承AuthorizingRealm?

  上个教程中我们完整的分析了认证的流程,我们发现在认证的过程核心代码是此:

在这里插入图片描述
在这里插入图片描述

核心方法是doGetAuthenticationInfo(token) 在Realm的结构中

在这里插入图片描述
在这里插入图片描述

  AuthorizingRealm和AuthenticatingRealm都提供的有doGetAuthenticationInfo (token) 的抽象方法。但是AuthenticatingRealm中要重写的抽象方法太多而AuthorizingRealm只需要重写两个方法,且这两个方法都是我们需要使用的。故选择继承AuthorizingRealm

自定义的Realm什么时候被调用的?

在这里插入图片描述
在这里插入图片描述

密码验证什么时候执行的?

注意:自定义Realm中只完成了账号的认证。密码认证还是在AuthenticatingRealm中完成的,只是我们在自定义Realm中完成了密码的设置。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自定义Realm的实现
    • 创建自定义Realmjava类
      • 配置ini.xml文件
        • 测试
        • 原理分析
          • 为什么要继承AuthorizingRealm?
            • 自定义的Realm什么时候被调用的?
              • 密码验证什么时候执行的?
              相关产品与服务
              访问管理
              访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档