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;
}
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;
}
相关文章推荐
- shiro进行权限控制的四种方式
- springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】
- Jfinal配合Shiro进行权限控制
- springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】
- springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制
- springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】
- Git Repo Gerrit方式下如何进行代码读权限控制
- 使用shiro进行系统身份验证-权限控制,登录界面乱跳
- Spring结合Shiro进行权限控制
- shiro提供的权限控制方式
- Shiro入门之二 --------基于注解方式的权限控制与Ehcache缓存
- shrio注解的方式进行权限控制
- springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】
- 使用Shiro进行权限控制的实现流程
- 【SSMS】springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制
- springmvc配置shiro进行权限控制
- springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】
- 总结Shiro提供的权限控制方式
- iis ftp 进行用户隔离进行权限控制的两种方式
- springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】