shiro是一个非常强大灵活的权限控制框架,属于apache的顶级项目.springrain使用shiro实现了权限控制功能.
下图充分说明了shiro的体系架构
归根到底,权限控制无非是利用过滤器控制访问的认证和授权,shiro也不例外.我们来看看shiro是怎么实现的吧.
要在web中使用shiro,总共分三步:
第一步:在web.xml中配置shiro的过滤器,建议是应用的第一个过滤器,springrain示例配置如下:
02 |
< filter-name >shiroFilter</ filter-name >
|
03 |
< filter-class >org.springframework.web.filter.DelegatingFilterProxy</ filter-class >
|
05 |
< param-name >targetFilterLifecycle</ param-name >
|
06 |
< param-value >true</ param-value >
|
10 |
< filter-name >shiroFilter</ filter-name >
|
11 |
< url-pattern >/*</ url-pattern >
|
12 |
< dispatcher >REQUEST</ dispatcher >
|
13 |
< dispatcher >FORWARD</ dispatcher >
|
14 |
< dispatcher >INCLUDE</ dispatcher >
|
15 |
< dispatcher >ERROR</ dispatcher >
|
这个shiroFilter其实是个spring bean,等下会重点说这个bean,dispatcher这个标签是为了在forward和redirect的情况下也需要经过过滤器
第二步:配置spring-shiro,springrain配置是applicationContext-shiro.xml
02 |
< bean id = "securityManager" class = "org.apache.shiro.web.mgt.DefaultWebSecurityManager" >
|
04 |
< property name = "realm" ref = "shiroDbRealm" />
|
06 |
< property name = "sessionManager" ref = "sessionManager" />
|
08 |
< property name = "cacheManager" ref = "shiroCacheManager" />
|
11 |
< bean id = "sessionManager" class = "org.apache.shiro.web.session.mgt.DefaultWebSessionManager" >
|
13 |
< property name = "globalSessionTimeout" value = "1800000" />
|
15 |
< property name = "sessionDAO" ref = "shiroSessionDao" />
|
17 |
< property name = "sessionIdCookie" ref = "sharesession" />
|
19 |
< property name = "sessionValidationSchedulerEnabled" value = "true" />
|
23 |
< bean id = "sharesession" class = "org.apache.shiro.web.servlet.SimpleCookie" >
|
25 |
< constructor-arg name = "name" value = "SHAREJSESSIONID" />
|
28 |
< bean id = "shiroSessionDao" class = "org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO" />
|
31 |
< bean id = "shiroCacheManager" class = "org.apache.shiro.cache.MemoryConstrainedCacheManager" />
|
34 |
< bean id = "shiroFilter" class = "org.apache.shiro.spring.web.ShiroFilterFactoryBean"
|
35 |
depends-on = "frameperms" >
|
37 |
< property name = "securityManager" ref = "securityManager" />
|
39 |
< property name = "loginUrl" value = "/login" />
|
41 |
< property name = "successUrl" value = "/index" />
|
43 |
< property name = "unauthorizedUrl" value = "/unauth" />
|
45 |
< property name = "filterChainDefinitions" >
|
63 |
< property name = "filters" >
|
65 |
< entry key = "frameperms" value-ref = "frameperms" ></ entry >
|
70 |
< bean id = "lifecycleBeanPostProcessor" class = "org.apache.shiro.spring.LifecycleBeanPostProcessor" />
|
frameperms是自定义的过滤器,除了那些特殊url,其他的菜单都在数据库,查询用户权限判断,下一篇文章介绍下权限相关的表结构.
另外不建议在web项目使用类似 admin:user:edit这种方式控制权限,这种方式等同给url又起了一个别名,这样虽然看起来比较容易理解,但是相当死板和麻烦.建议直接使用url判断权限
authc 和 user的区别是 user包含 rememberme,authc不包含,就这一点区别.
第三步:实现数据库认证和权限过滤
数据库认证shiroDbRealm的代码:
http://git.oschina.net/chunanyong/springrain/blob/master/springrain/src/org/springrain/frame/shiro/ShiroDbRealm.java
自定义权限过滤frameperms的代码:
http://git.oschina.net/chunanyong/springrain/blob/master/springrain/src/org/springrain/frame/shiro/FramePermissionsAuthorizationFilter.java
另外 springrain 没有使用authc实现登陆,而是使用一个普通的controller方法进行登陆
org.springrain.frame.controller.BaseController.loginPost(User, HttpSession, Model, HttpServletRequest)
其中
//会调用 shiroDbRealm 的认证方法
//org.springrain.frame.shiro.ShiroDbRealm.doGetAuthenticationInfo(AuthenticationToken)
user.login(token);
本文出自 9iu.org,转载时请注明出处及相应链接。
本文永久链接: http://www.9iu.org/2013/12/10/springrain1-shiro.html
相关推荐
springrain-springboot设计资源
SpringRain-master.zip文件正是这样一个以云原生微服务为核心的应用实例,它结合了Kubernetes(K8S)的容器编排能力,以及apisix或istio的服务网格技术,旨在为开发者提供一套高效、稳定的Web开发框架。 首先,让...
7. 缓存:在SpringRain项目中可能还涉及到使用缓存技术来提高应用程序性能。在数据访问层,可以通过Spring的缓存抽象来缓存数据库查询结果,减少对数据库的直接访问次数,从而提升应用性能。 8. 工具类:在实际开发...
在SpringRain项目中,Shiro被用于实现权限控制功能。 在Shiro框架中,有三个核心组件构成了其基本架构,它们分别是Subject、SecurityManager和Realm。 Subject代表了“当前操作用户”,它可以是人,也可以是第三方...
4. **权限控制** - 内置权限管理系统,支持角色、权限分配,增强系统安全性。 5. **监控与日志** - 集成了Prometheus和Grafana等监控工具,以及Logback等日志框架,方便实时监控和问题排查。 6. **Docker容器化** - ...
"springrain-master"文件夹中的源码提供了SpringRain的核心实现。通过分析源码,我们可以了解其如何处理服务注册、服务发现、熔断策略、配置中心等功能,这对于理解微服务架构和云原生实践非常有帮助。 7. **毕业...
servlet servlet servlet servlet servlet
基于K8S + apisix/istio 实现云原生微服务.springrain自带代码生成器,能够生成对表的增删改查的逻辑代码.springrain是标准Maven项目,只依赖springboot,没有hibernate,struts,ibatis,数据库调优可以使用druid输出慢...
- **类命名**:类名应使用名词或名词性词组,每个单词的首字母大写,如`Person`,`SpringRain`。 - **方法命名**:方法名应使用动词或动词性词组,首字母小写,后续单词首字母大写,如`run()`,`display...
1. **命名惯例**: - **类**:通常使用名词或名词性词组,每个单词的首字母大写。例如,`class Person`,`class SpringRain`。 - **方法**:使用动词或动词性词组,首字母小写,第二个单词及以后的首字母大写。...
反激式开关电源EXCEL,方便计算大致参数等,并含有相应磁芯材料技术参数。