Shiro(四)——授权

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Back_Light_F/article/details/81486204

Coding之前,先来解释一下相关的概念吧

  • 授权:也称访问控制,即在应用中控制谁访问哪些资源(如访问页面/编辑数据/页面操作/等)。在授权中需了解几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。
  • 主体(Subject):访问应用的用户,在Shiro中使用Subject代表该用户,用户只有授权后才能访问响应的资源。
  • 资源(Resource):在应用中用户可以访问的URL,比如访问JSP页面、查看/编辑某些数据、访问某个业务方法、打印文本等都是资源,用户只有授权后才能访问。
  • 权限(Permission):安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权利。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面CRUD等。权限代表了用户有没有操作某个资源的权利,即反映在某个资源上的操作允不允许。
    • Shiro支持粗粒度权限(如用户模块的所有权限)和细粒度权限(操作某个用户的权限,即实例级别的)
  • 角色(Role):权限的集合,一般情况下会赋予用户角色而不是权限,这样用户既可以拥有一组权限,赋予权限时比较方便,典型的如:项目经理、技术总监等都是角色,不同的角色拥有一组不同的权限。

授权方式:Shiro支持三种授权方式的授权:

  1. 编程式:通过写if/else授权代码块完成
  2. 注解式:通过在执行的java方法上放置相应的注解完成,没有权限将抛出相应的异常
  3. JSP/GSP标签:在JSP/GSP页面通过相应的标签完成。

默认拦截器:

Shiro内置了很多默认的拦截器,比如身份验证、授权等相关的。默认拦截器可以参考DefaultFilter类:

 这里介绍一下roles角色过滤器:

1.先创建两个页面:user.jsp和admin.jsp

没有配置过滤器时以任何身份(user/admin(之前代码中有))都可以访问的。

现在配置roles过滤器:

/user.jsp = roles[user]
 /admin.jsp = roles[admin]

再次登录后访问两个页面:跳转到无权限的页面:

 授权的Realm如何实现:

需要继承AuthorizingRealm类,并实现其doGetAuthorizationInfo方法

Coding:实现授权Realm:

将之前的ShiroRealm的父类改为AuthorizingRealm,并实现其doGetAuthorizationInfo方法:

/*
	 * 授权时需要实现的方法
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		
		//1.从PrincipalCollection获取登录用户的信息
		Object principal = principals.getPrimaryPrincipal();
		
		//2.利用登录的用户的信息来获取当前用户的角色或权限(可能需要查询数据库)
		Set<String> roles = new HashSet<String>();
		roles.add("user");
		if("admin".equals(principal)){
			roles.add("admin");
		}
		//3.创建SimpleAuthorizationInfo,并设置其roles属性
		SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);
		//4.返回SimpleAuthorizationInfo对象
		return info;
	}

启动项目,访问:

发现admin用户是都可以访问的,user用户只能访问user.jsp页面

猜你喜欢

转载自blog.csdn.net/Back_Light_F/article/details/81486204
今日推荐