shiro授权管理方式详解

本文详细介绍了Shiro授权管理的各个方面,包括授权的核心元素——权限、角色和用户,以及如何将权限分配给角色并关联用户。文章探讨了三种授权控制方法:方法注解、页面标签和自定义Realm授权,并提供了相关配置和代码示例,强调了这些方式结合使用能实现精细化的权限控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.概述 

1.授权,又称作为访问控制,是对资源的访问管理的过程。换句话说,控制谁有权限在应用程序中做什么, 通过使用shiro的授权功能,能够完成细粒度的权限控制。

2.授权的三要素

  授权有着三个核心元素:权限、角色和用户 。

  我们需要在应用程序中对用户和权限建立关联,通常的做法就是将权限分配给某个角色,然后将这个角色关联一个或多个用户


二.shiro完成权限控制的四种方式

1.使用方法注解方式进行权限控制(基于代理技术实现),比较灵活

第一步:在spring配置文件中开启shiro注解支持,spring使用AOP的方式为方法注入权限控制代码。必须使用cglib方式创建代理对象。具体如下代码

<!-- 开启shiro框架注解支持 -->
	<bean id="defaultAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
		<property name="proxyTargetClass" value="true"></property>
	</bean>
	<!-- 配置shiro框架提供的切面类,用于创建代理对象 -->
	<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/>
第二步:在action的方法中使用注解,如下
@RequiresPermissions("staff-delete")
//执行此方法,用户需要staff-delete权限
	public String deleteBatch() {
		staffService.deleteBatch(ids);
		return LIST;
	}
2.URL拦截权限控制(基于过滤器实现),比较高效,但是不够灵活

<!--注入URL拦截规则 -->
		<property name="filterChainDefinitions">
			<value>
				/css/** = anon
				/js/** = anon
				/images/** = anon
				/validatecode.jsp* = anon
				/login.jsp = anon
				/userAction_login.action = anon
				/page_base_staff.action = perms["staff-list"]
				/* = authc
			</value>
		</property>

作为一个property配置在ShiroFilterFactoryBean的bean配置中,其中anon代表不进行权限控制可匿名访问,

perms代表要进行权限控制,authc代表要认证过后才能访问。

3.页面标签权限控制(基于标签技术实现),可以实现在页面展示的权限化

第一步:在jsp页面中引入shiro的标签库

%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
第二步:在需要进行权限控制的控件外围加上shiro标签
shiro:hasPermission name="staff-delete">
	{
		id : 'button-delete',
		text : '删除',
		iconCls : 'icon-cancel',
		handler : doDelete
	},
	</shiro:hasPermission>

4.代码级别的权限控制,由于要侵入代码,使用较少

//获得当前用户
Subject subject=SecrityUtils.getSubject();
//校验权限
subject.checkPermission("staff-delete");
三.shiro授权方法

第一步:在自定义的Realm中对登陆用户进行授权,代码如下

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
		SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
		info.addStringPermission("staff-list");
		info.addStringPermission("staff-delete");
		return info;
	}
第二步:在strut.xml中配置全局异常捕获,当权限不足时,跳转到此页面,异常为UnauthorizedException

<global-results>
	<result name="unauthorized">/unauthorized.jsp</result>
</global-results>
<global-exception-mappings>
	<exception-mapping result="unauthorized" exception="org.apache.shiro.authz.UnauthorizedException"></exception-mapping>
</global-exception-mappings>
至此,shiro框架就完成了一个比较简单的权限管理。需要注意的是以上的权限控制都是固定的,在真正的项目中权限数据需要放在在数据库中,权限表管理角色表,角色表管理用户表,在自定义Realm中通过为用户分配不同的角色而动态的分配权限。

四.总结

shiro提供了四种方式的权限控制方式,在实际开发中,配合着使用四种方式,可以完成细粒度的权限控制工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值