shiro_07_自定义Realm_一夏洛克一的博客-程序员宅基地

技术标签: 自定义Realm  shiro  

在之前我们用的都是直接读取ini文件的数据,显然这种方式不现实,仅针对数据量较小的时候的测试,这一篇来介绍利用自定义的Realm读取数据库的数据。

第一步,根据用户拥有角色和权限建立数据库:

我们按照上一篇的用户关系来建数据库,一个角色可以对应多个用户,一个角色也可以对应多个权限。所以我们要建3张表:

t_user(id,userName,password,roleId)

t_roles(id,roleName)

t_permission(id,permission,roleId)

每个用户对应一个roleId外键,关联t_role表,这样就实现了一个角色对应多个用户,每一个权限对应一个roleId外键,关联t_role表,这样实现了一个角色对应多个权限。

按照之前的数据填好表。

第二步:自定义Realm

新建MyRealm类,继承AuthorizingRealm,实现里面的doGetAuthenticationInfo,doGetAuthorizationInfo方法,

首先实现doGetAuthenticationInfo方法:获取token里面的用户名,然后去数据库找看是否有这一个用户名,如果没有直接抛出异常,如果有,会new 一个SimpleAuthenticationInfo对象将从数据库找到的用户名和密码传进去,看是否和token里面的密码一样,如果不一样,也会抛出异常,如果一样则身份验证通过,

	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		String userName= (String)token.getPrincipal();//获取身份信息
		//根据用户名查找
		Connection con = null;
		try {
			con = dbUtil.getCon();
			User user = userDao.getByUserName(con, userName);
			if(user!=null) {
				AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getUserName(),user.getPassword(),"xx");
				return authenticationInfo;
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return null;
		
	}

然后调用doGetAuthorizationInfo方法去把拥有的权限和角色获取到,通过用户名从数据库里找到角色和权限分别存储在set集合里,new 一个authorizationInfo对象,调用setRoles和setStringPermissions方法将从数据库里获得的set集合放入,返回authorizationInfo即可。

	/**
	 * 对已经身份认证过的用户授予权限
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		String userName = (String)principals.getPrimaryPrincipal();
		SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
		Connection con = null;
		try {
			con = dbUtil.getCon();
			authorizationInfo.setRoles(userDao.getRole(con,userName));
			authorizationInfo.setStringPermissions(userDao.getPermissions(con,userName));
		}catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return authorizationInfo;
	}

数据库的操作就不一一说明了,很简单。

第三步:配置ini文件:

[main]
authc.loginUrl=/login
roles.unauthorizedUrl=/unauthorized.jsp
perms.unauthorizedUrl=unpermitted.jsp
MyRealm=com.java.realm.MyRealm
securityManager.realm=$MyRealm
[urls]
/login=anon
/admin=authc
/student=roles[teacher]
/delete=perms["user:delete"]

把用户,角色,权限信息去掉,然后换成自定义的realm。

第四步:测试。

没有问题。

分析一遍执行过程:

首先,从登录界面开始说,用户输入用户名和密码,点击登录,请求/login请求,从web.xml中找到对应映射的servlet类,找到了LoginServlet,执行里面的dopost方法,这个方法将用户输入的用户名和密码获取,并利用shiro得到当前用户subject,并将用户名密码封装成一个token,当subject当前用户执行.login方法时,把token带着就执行刚才写的doGetAuthenticationInfo方法,进行身份验证,具体验证过程上面已经介绍了,当身份验证通过后,有调用doGetAuthorizationInfo方法进行角色和权限的授权,并进行角色和权限的验证,执行完login ,接着执行我们自己写的转发到sueecss界面。当登录后,用户再请求时,shiro会再进行一遍角色和权限的授权,并再进行一次角色和权限的验证,因此说shiro安全性很高。

loginServlet的dopost方法:

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("login dopost");
		String userName = req.getParameter("userName");
		String password = req.getParameter("password");
		Subject subject = SecurityUtils.getSubject();
		UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
		try {
			subject.login(token);
			resp.sendRedirect("success.jsp");
		}catch(Exception e) {
			e.printStackTrace();
			req.setAttribute("errorMsg", "用户名或密码错误");
			req.getRequestDispatcher("login.jsp").forward(req, resp);
		}
	}
	

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27163329/article/details/81840519

智能推荐

H.264流媒体协议格式中的Annex B格式和AVCC格式深度解析_HTJOY的博客-程序员宅基地

版权声明:本文为CSDN博主「Chucky_Hu」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/Romantic_Energy/article/details/50508332本文需要读者对H.264流有一定的了解才可以理解2种格式差异。首先要理解的是没有标准的H.264基本流...

卡卡转会终于尘埃落定,银河战舰二代开始了_liuwei1981的博客-程序员宅基地

    米兰官网和皇马官网宣布卡卡转会皇马,弗洛伦蒂诺果然不是卡尔德隆这样的傻×可以比拟的。    卡尔德隆上任的筹码就是卡卡。c罗和罗本,夸下海口的结果是只签了一个在切尔西呆不下去的罗本,傻×。    弗洛伦蒂诺不愧是银河战舰的缔造者,上任初始,就搞定了卡尔德隆搞了几年也没有搞定的卡卡。    下一个会是谁?c罗?伊布?比利亚?巴萨甚至一度担心梅西步菲戈的后尘。    看这次转会...

阅微草堂笔记_weixin_30737363的博客-程序员宅基地

今儿又发现一个不错的格言:心心在一艺,其艺必工;心心在一职,其职必举。网上查了一下出处,似乎是来自纪晓岚的阅微草堂笔记郭石洲言,朱明经静园,与一狐友。一日,饮静园家,大醉睡花下,醒而静园问之曰:吾闻贵族醉后多变形,故以衾覆君而自守之,君竟不变,何也?曰:此视道力之浅深矣,道力浅者能化形幻形耳,故醉则变,睡则变,仓皇惊怖则变;道力深者能脱形,犹仙家之尸解,已归人道...

nmcli d 查看网卡信息_stone_tomcat的博客-程序员宅基地

nmcli命令详解nmcli命令是redhat7或者centos7之后的命令,该命令可以完成网卡上所有的配置工作,并且可以写入配置文件,永久生效。显示参数show 显示详细信息status 显示简略信息1、查看接口信息:命令的选项和参数都可以简写2、查看连接信息3、启动/停止接口或P.S:建议使用 nmcli device disconnect(connect) interface-name因为使用该命令,在启动...

软件随想录(local.joelonsoftware.com/wiki)-2003年12月14日 双元文化主义 - Biculturalism_双文化主义_铁文的博客-程序员宅基地

2003年12月14日 双元文化主义 - Biculturalism The Joel on Software Translation Project:双元文化主义From The Joel on Software Translation ProjectJump to: navigation, search双元文化主义作者:周思博 (Joel Spo

tshark学习笔记(一)_tshark -e radius_wkend的博客-程序员宅基地

TShark (Wireshark) 2.4.5 (Git v2.4.5 packaged as 2.4.5-1) Dump and analyze network traffic. See https://www.wireshark.org for more information.转储和分析网络流量Usage: tshark [options] ...Capture i...

随便推点

What is CRA?_战斗的螃蟹的博客-程序员宅基地

转载于:https://blog.csdn.net/huddheaven/article/details/52300262什么是CRA?众所周知,sensor的效能与sensor本身的灵敏度与光线入射到sensor的角度有关。而光线入射到sensor pixel的角度是由Lens的CRA和sensor的Micro Lens开口布局(sensor的CRA)决定的。CRA是Chief Ray Angl...

无U盘安装系统(到固态硬盘)教程_不用u盘给固态硬盘装系统_yygg329405的博客-程序员宅基地

这几天购买了固态硬盘,安装系统时忘带U盘,故在无U盘无光驱的情况下,安装操作系统到固态硬盘中。基本情况:笔记本电脑,电脑上已有硬盘,将固态硬盘SSD换到硬盘位,将硬盘装在光驱位,从硬盘将操作系统安装到SSD。硬盘的操作系统:win7x64,固态硬盘要安装的操作系统win10x64。安装方式/工具:1、nt6:nt6_hdd_installer_v3.1.42、onekey...

CSS居中的各种实现方式_攻城狮Lee丶的博客-程序员宅基地

CSS中如何完美做到居中,一直是令前端工程师头疼的问题。最近读到CSS-TRICKS中的一篇帖子,将居中问题的解决方案策略化。感觉收获很大,翻译过来供大家交流学习。当我们书写CSS时,让元素居中,是抱怨的爆发点之一:为什么会这么难?我认为问题的关键,不在于怎么做,而在于我们如何从诸多居中方法中选择出适应当前情景的。所以接下来,让我们一起创建一颗决策树,希望可以让居中变得简单。水平居中行内元素我们可...

关于Linux内核中有多少代码是来自华人_nliu的博客-程序员宅基地

关于Linux内核中有多少代码是来自华人?统计是基于KPS(Kernel Patch Statistic),日期是从2005年4月16日至今,也就是现在比较活跃的内核代码捐赠者,之前的捐赠者并没有包含在内。以下引用该文:“ 按照补丁数量排序,排第一的是Herbert xu,一共贡献了 735 个补下。herbert xu目前供职于Redhat,曾经是Debian Developer。按照补丁行数排

常用集合类的特点_常用集合类有哪些特点_阿尔巴斯的博客-程序员宅基地

集合类是java中比较重要的类,同时也是面试过程当中经常涉及到的一类问题,在这里对常用的集合类进行一下整理总结。 集合类结构如图1所示:

Spring事务控制基于AOP 纯注解配置和XML配置_多凡的博客-程序员宅基地

这里的xml可以和下面的SpringConfiguration类选择配置一个即可,作用是创建容器要扫面的包,和开启spring注解aop的支持<!-- Bean.xml--><?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/bea...

推荐文章

热门文章

相关标签