Shiro整合SSH开发4:Realm授权,perms过滤器测试和使用方法讲述

使用:org.apache.shiro.web.filter.authz.RolesAuthorizationFilter进行授权拦截

本文还是使用静态的验证方式,将在以后一步步进行数据库查询认证信息和授权信息,不过,为了方便大家一步步学习和查看,还是先从静态的方式开始吧。


     perms(许可验证)

     org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

perms:例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。

/admins/user/**=perms[user:add:*]表示:要访问【/admins/user/**】必须具有【user:add:* 】权限

此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/51226800

更多有关老猫的文章:http://blog.csdn.net/nthack5730


在application-shiro.xml中配置URL所需要的权限:

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

<property name="securityManager" ref="securityManager" />

<property name="loginUrl" value="/user/login.action" /> <!-- 没有权限或者失败后跳转的页面 -->

<property name="filterChainDefinitions">

<!-- , roles[admin], perms[document:read] -->

<value>

<!-- 对静态资源设置匿名访问 -->

/js/** = anon

/css/** = anon

/img/** = anon

/fonts/** = anon

/scripts/** = anon

/user/login.action = authc

/user/logout = logout

<!-- 进入后台需要权限:admin:* -->

/backstage/** = perms[admin:*]

/user/** = user

</value>

</property>

</bean>


在Struts2中加入上面Shiro中过滤链的对应的链接的Action:

【Action可以不用配置处理方法的,这个大家应该都知道吧?】

<!-- 后台 -->

<package name="backstage" namespace="/backstage" extends="struts-default">

<default-action-ref name="index" />

<action name="index">

<result>/WEB-INF/jsp/backstage/index.jsp</result>

</action>

</package>


自定义Realm的授权doGetAuthorizationInfo方法:

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

//从principals获取主身份信息

//将getPrimaryPrincipal()返回的值强制转换为真实身份信息【在上边的doGetAuthenticationInfo()认证通过填充到SimpleAuthenticationInfo中的身份信息】

String userCode = (String) principals.getPrimaryPrincipal();

//根据身份信息获取权限信息

//先链接数据库。。。

//模拟从数据库获取数据

List<String> permissions = new ArrayList<String>();

permissions.add("admin:*");//用户的创建权限

permissions.add("user:update");//用户的修改

permissions.add("item:add");//商品的添加权限

//....等等权限

//查到权限数据,返回

SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();

//将List里面的权限填充进去

simpleAuthorizationInfo.addStringPermissions(permissions);

return simpleAuthorizationInfo;

}

此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/51226800

更多有关老猫的文章:http://blog.csdn.net/nthack5730

在上面的代码中,主要加入权限的是:

【以后这里的权限数据是从数据库中查回来的,测试的时候为了更加直观,所以就直接用了静态写死的方式展示给大家看。】

List<String> permissions = new ArrayList<String>();

permissions.add("admin:*");//用户的创建权限

permissions.add("user:update");//用户的修改

permissions.add("item:add");//商品的添加权限

//....等等权限

权限部分添加后,通过addStringPermissions方法将这个collection交给授权管理器进行权限的判断。

//将List里面的权限填充进去

simpleAuthorizationInfo.addStringPermissions(permissions);


测试流程:

1、在application-shiro.xml配置过滤的规则

<!-- 进入后台需要权限:admin:* -->

/backstage/** = perms[admin:*]

2、用户在认证通过后,请求【/backstage/**】即backstage命名空间中任意地址

PermissionsAuthorizationFilter拦截,发现需要【admin:*】权限

3、PermissionsAuthorizationFilter调用Realm中的doGetAuthorizationInfo方法来获取数据库中正确的权限

4、PermissionsAuthorizationFilter对需要的权限【admin:*】和获取的权限进行对比,如果【admin:*】在realm返回的权限列表中,则授权通过,否则没有权限。在没有权限的时候,我们就用下面对没有权限的操作进行页面跳转。

此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/51226800

更多有关老猫的文章:http://blog.csdn.net/nthack5730


配置没有权限(授权失败)页面:

在使用Struts2时候,如果没有访问权限,就会报Status 401错误,毕竟401这个很不友好,那么我们通过加入没有权限访问页面,就可以防止出现401这个不友好的界面的问题。

需要在spring配置文件中,【shiroFilter】的bean中加入如下配置:

<!-- 通过unauthorizedUrl指定没有权限操作时跳转页面-->

<property name="unauthorizedUrl" value="/refuse.jsp" />


存在的问题总结:

在applicationContext-shiro.xml中配置过滤器链,需要将全部的URl和权限对应起来进行配置,这种配置方式是比较麻烦的,不方便使用。

每次授权,都需要调用realm查询数据库,对于系统的性能具有很大的影响。设想:以后通过shiro的缓存来解决。

之后会一一处理这些问题。

时间: 2024-10-06 06:21:35

Shiro整合SSH开发4:Realm授权,perms过滤器测试和使用方法讲述的相关文章

Shiro整合SSH开发3:配置Shiro认证后页面地址跳转问题(和详述不配置需要注意的问题)

在视频教程中讲请求认证成功后跳转页面的问题是一笔带过的,但是我觉得有必要单独写一篇对应的文章进行叙述. 我用了SSH来整合Shiro,在开发后验证的过程中,每次登陆后Shiro都会跳转到一个不知名js中,但是重点是我上一次访问的地址是: Edit http://localhost:8080/shiro_05/user/login.action 认证之后应该跳转到上一个请求的地址,但是Shiro却跳转到了: http://localhost:8080/shiro_05/user/js/eqmt.j

项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器,整合ehcache环境,只需要配置即可.     <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>

shiro学习笔记_0600_自定义realm实现授权

博客shiro学习笔记_0400_自定义Realm实现身份认证 介绍了认证,这里介绍授权. 1,仅仅通过配置文件来指定权限不够灵活且不方便.在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息 保存到了数据库中.所以需要从数据库中去获取相关的数据信息.可以使用 shiro 提供的JdbcRealm来实现,,也可以自定义realm来实现.使用jdbcRealm往往也不够灵活.所以在实际应用中大多数情况都是自定义Realm来实现. 2,自定义Realm 需要继承 AuthorizingRea

业务逻辑:五、完成认证用户的动态授权功能 六、完成Shiro整合Ehcache缓存权限数据

一. 完成认证用户的动态授权功能 提示:根据当前认证用户查询数据库,获取其对应的权限,为其授权 操作步骤: 在realm的授权方法中通过使用principals对象获取到当前登录用户 创建一个授权信息对象 根据用户查询角色列表,并遍历角色列表 在循环体中将角色关键字添加到授权信息对象的角色属性中 根据用户查询权限列表,并遍历权限列表 在循环体中将权限关键字添加到授权信息对象的权限属性中 在角色与权限service类的根据用户查询角色与权限方法中判断用户是否为系统管理员 如果是系统管理员就查询出所

shiro授权及自定义realm授权(七)

1.授权流程 2.    三种授权方法 Shiro 支持三种方式的授权: 编程式:通过写if/else 授权代码块完成: Subject subject = SecurityUtils.getSubject(); if(subject.hasRole("admin")) { //有权限 } else { //无权限 } 注解式:通过在执行的Java方法上放置相应的注解完成: @RequiresRoles("admin") public void hello() {

Spring+SpringMVC+Hibernate 与 shiro 整合步骤

通过这篇文章你可以了解到: SSH 三大框架(spring + springMVC + Hiberante) 与 shiro 安全验证框架如何整合: 通过一个示例,快速理解 shiro 框架. [TOC] 1. 业务需求分析 用户 N - 角色 N - 权限 N 我们可以想象一下,在平时工作中的职务,比如:业务经理,部门主管等,他们拥有很多的权力,而一个公司中不会只有一个业务经理,也不会只有一个部门主管,如果我们要给不同的人分配职务权力时,每次都是具体的条条框框去分配,人累心也累.而如果我们事先

教你 Shiro 整合 SpringBoot,避开各种坑

最近搞了下 Shiro 安全框架,找了一些网上的博客文章,但是一到自己实现的时候就遇到了各种坑,需要各种查资料看源码以及各种测试. 那么这篇文章就教大家如何将 Shiro 整合到 SpringBoot 中,并避开一些小坑,这次实现了基本的登陆以及角色权限,往后的文章也讲解了其他的功能,如 <教你 Shiro + SpringBoot 整合 JWT> 附上源码:https://github.com/HowieYuan/shiro 依赖包 <dependency> <groupI

SpringBoot与Shiro整合

修改pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <

spring与shiro整合

除了基本的以外,我们还需要shiro-web和shiro-spring的的架包,下面是所需要的所有shiro架包,至于其他的架包,像缓存的架包,Spring和SpringMVC的架包还是和我们以前使用的架包一样的. <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.3</version