一.概述
1.授权,又称作为访问控制,是对资源的访问管理的过程。换句话说,控制谁有权限在应用程序中做什么, 通过使用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提供了四种方式的权限控制方式,在实际开发中,配合着使用四种方式,可以完成细粒度的权限控制工作。