您的位置:首页 > 其它

038 shiro进行权限控制的方式 - bos

2017-08-22 14:51 309 查看
一、URL拦截方式(基于过滤器实现)

1.如前面介绍的,通过配置ShiroFilterFactoryBean的filterChainDefinitions属性,进行URL拦截的相关配置

<!-- 配置shiro框架的工厂对象 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"></property>
<!-- 注入相关页面访问URL -->
<property name="loginUrl" value="/login.jsp"/>
<property name="successUrl" value="/index.jsp"/>
<property name="unauthorizedUrl" value="unauthorized.jsp"/>

<!-- 注入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>
</bean>

二、使用shiro的方法注解方式进行权限控制(基于代理技术实现)

1.在Spring的配置文件中开启shiro的注解支持

<!-- 开启shiro框架注解支持 -->
<bean id="defaultAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
<!-- 表示必须使用cglib方式为Action创建动态代理对象 -->
<property name="proxyTargetClass" value="true"/>
</bean>

<!-- 配置shiro框架提供的切面类,用于创建代理对象 -->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"></bean>

2.在Action的方法上添加注解,注明调用方法需要的权限

1.下面的注解表示执行StaffAction的deleteBatch方法需要用户具有staff-delete权限

/**
* 批量删除
* @return
*/
@RequiresPermissions("staff-delete")
public String deleteBatch(){
staffService.deleteBatch(ids);
return LIST;
}

3.注意开启注解时,proxyTargetClass要设置为true

<1>该属性默认为false,表示使用JDK提供的动态代理创建目标Action的代理对象,这要求目标类必须对接口编程
<2>这在StaffAction中并不适用,虽然StaffAction实现了接口,但向页面提供的方法并不是用接口定义的,因此若不设置为true将无法代理Action中的方法
<3>设置为true,表示使用cglib进行代理对象的创建,由于cglib是利用继承进行代理,因此对任何类都是适用的

4.当用户不具有权限时,核心过滤器会直接抛出异常,若不捕获则会直接再页面回显,用户不友好,因此要利用表现层框架捕获异常

5.在struts.xml中配置捕获权限不足所抛出的异常,并配置对应的处理页面,注意全局异常要在全局结果集的后面

<global-results>
<result name="login">/login.jsp</result>
<result name="unauthorized">/unauthorized.jsp</result>
</global-results>

<!-- 配置全局异常捕获 -->
<global-exception-mappings>
<exception-mapping result="unauthorized" exception="org.apache.shiro.authz.UnauthorizedException"/>
</global-exception-mappings>

三、使用shiro提供的页面标签的方式进行权限控制(标签技术实现)

1.在jsp页面中引入shiro的标签库

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

2.使用shiro的标签来控制页面元素的展示

<shiro:hasPermission name="staff-delete">
{
id : 'button-delete',
text : '删除',
iconCls : 'icon-cancel',
handler : doDelete
},
</shiro:hasPermission>

3.<shiro:hasPermission name="权限名">标签可以根据是否具有权限进行内部相应按钮的展示

四、代码级别权限控制(基于代理技术)

1.通过在调用方法之前编写Java代码校验权限,违背开闭原则,不建议使用

public String deleteBatch(){

//获取当前的Subject对象
Subject subject = SecurityUtils.getSubject();
//校验权限,没有权限直接抛出异常,有权限才可继续执行
subject.checkPermission("staff-delete");

staffService.deleteBatch(ids);
return LIST;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: