`

springrain技术详解(3)-shiro的filterChainDefinitions

 
阅读更多

springrain使用shiro控制权限,配置filterChainDefinitions结合数据库校验权限.

shiro在web.xml中配置全局过滤器,springrain配置的是一个spring bean “shiroFilter”,在这个bean中可以根据访问路径再配置不同的过滤器,

shiro 默认自带的过滤器如下:

Filter Name Class
anon org.apache.shiro.web.filter.authc.AnonymousFilter
authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
logout org.apache.shiro.web.filter.authc.LogoutFilter
noSessionCreation org.apache.shiro.web.filter.session.NoSessionCreationFilter
perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
port org.apache.shiro.web.filter.authz.PortFilter
rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
ssl org.apache.shiro.web.filter.authz.SslFilter
user org.apache.shiro.web.filter.authc.UserFilter

我们平常用的就是 anon:任何人都可以访问;authc:必须登录才能访问,不包含rememberme ;user:登录用户才可以访问,包含rememberme ;perms:指定过滤规则,这个一般是扩展使用,不会使用原生的,例如springrain扩展的为frameperms.

filterChainDefinitions 就是指定过滤规则的,一般是把公共配置使用配置文件,例如 js  css img 这些资源文件是不拦截的,业务相关的url配置到数据库,有过滤器查询数据库进行权限判断.

不要想着把所有的url都配置到配置文件,这是一个误区!

springrain的配置如下图:

filterChainDefinitions

拦截器的优先级是从上至下,如果有匹配的拦截器就会返回,例如 访问 /js/abc.js 第一个拦截器 anon符合,就返回true了,不再往下匹配了.

最后一句是 /**=user,frameperms 意思就是除了上面的那些,其他的所有都要经过 user和frameperms.如果没有登陆 user就会阻断,不会执行到frameperms.

frameperms 就是我们自定义实现的过滤器,从数据库中查询用户的权限,判断当前用户是否有权限访问拦截的url.

具体拦截的工作流程是怎么样的呢?

第一步:认证和授权的 realm.例如springrain扩展的shiroDbRealm,在doGetAuthorizationInfo授权方法里,

                // 添加角色及权限信息
		SimpleAuthorizationInfo sazi = new SimpleAuthorizationInfo();
		try {
			sazi.addRoles(userRoleMenuService.getRolesAsString(userId));
			sazi.addStringPermissions(userRoleMenuService
					.getPermissionsAsString(userId));
		} catch (Exception e) {
			logger.error(e);
		}

		return sazi;

sazi.addRoles:获取当前用户所有的角色,用于依据角色判断权限的shiro过滤器,springrain中没有使用
sazi.addStringPermissions:获取当前用户的所有权限,springrain中的权限就是url,所以在springrain中这就是一个url的集合
我们的拦截器每次校验权限都会调用doGetAuthorizationInfo,获取当前用户的所有权限.
我们的权限拦截器 只要判断当前用户访问的url是否在他的权限集合内就可以了,例如 springrain中frameperms 的校验url权限:

 
//会调用realm的doGetAuthorizationInfo授权方法
permitted= subject.isPermitted(uri);

这个基本就是权限校验的流程

本文出自 9iu.org,转载时请注明出处及相应链接。

本文永久链接: http://www.9iu.org/2013/12/12/springrain3-shiro-filter.html

0
分享到:
评论

相关推荐

    springrain-master.zip

    SpringRain-master.zip文件正是这样一个以云原生微服务为核心的应用实例,它结合了Kubernetes(K8S)的容器编排能力,以及apisix或istio的服务网格技术,旨在为开发者提供一套高效、稳定的Web开发框架。 首先,让...

    springrain

    7. 缓存:在SpringRain项目中可能还涉及到使用缓存技术来提高应用程序性能。在数据访问层,可以通过Spring的缓存抽象来缓存数据库查询结果,减少对数据库的直接访问次数,从而提升应用性能。 8. 工具类:在实际开发...

    springrain云原生微服务实现 v1.0.zip

    "springrain-master"文件夹中的源码提供了SpringRain的核心实现。通过分析源码,我们可以了解其如何处理服务注册、服务发现、熔断策略、配置中心等功能,这对于理解微服务架构和云原生实践非常有帮助。 7. **毕业...

    Apache_Shiro_使用手册中文版

    在SpringRain项目中,Shiro被用于实现权限控制功能。 在Shiro框架中,有三个核心组件构成了其基本架构,它们分别是Subject、SecurityManager和Realm。 Subject代表了“当前操作用户”,它可以是人,也可以是第三方...

    springrain云原生微服务实现

    【SpringRain云原生微服务实现】:SpringRain是一款基于Java平台的云原生微服务框架,它旨在帮助开发者高效地构建、部署和管理微服务应用。云原生是一种现代的软件开发方法,强调利用云计算的优势,如弹性伸缩、自动...

    springrain-servlet

    servlet servlet servlet servlet servlet

    基于K8S + apisix/istio 实现云原生微服务.springrain自带代码生成器,能够生成对表的增删改查的逻辑代码

    基于K8S + apisix/istio 实现云原生微服务.springrain自带代码生成器,能够生成对表的增删改查的逻辑代码.springrain是标准Maven项目,只依赖springboot,没有hibernate,struts,ibatis,数据库调优可以使用druid输出慢...

    JAVA初学者必看-Java编码规范.doc

    - **类命名**:类名应使用名词或名词性词组,每个单词的首字母大写,如`Person`,`SpringRain`。 - **方法命名**:方法名应使用动词或动词性词组,首字母小写,后续单词首字母大写,如`run()`,`display...

    Java编码规范学习

    例如,`class Person`,`class SpringRain`。 - **方法**:使用动词或动词性词组,首字母小写,第二个单词及以后的首字母大写。例如,`run()`,`displayInformation()`。 - **接口**:与类的命名规则相同,例如`...

    开关电源EXCEL辅助设计

    反激式开关电源EXCEL,方便计算大致参数等,并含有相应磁芯材料技术参数。

Global site tag (gtag.js) - Google Analytics