文档章节

给JFinal添加Shiro插件功能,支持Shiro所有注解-使用篇

玛雅牛
 玛雅牛
发布于 2013/06/12 23:41
字数 1096
阅读 6W
收藏 94

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

基于JDK1.6打包好的包括源码的Shiro插件在以下地址:

http://git.oschina.net/myaniu/jfinalshiroplugin/blob/master/dist/JFinalShiroPlugin-1.0.jar

 

Shiro共有5个注解,分别如下:

  • RequiresAuthentication:使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在当前session中已经过认证。

  • RequiresGuest:使用该注解标注的类,实例,方法在访问或调用时,当前Subject可以是“gust”身份,不需要经过认证或者在原先的session中存在记录。

  • RequiresPermissions:当前Subject需要拥有某些特定的权限时,才能执行被该注解标注的方法。如果当前Subject不具有这样的权限,则方法不会被执行。

  • RequiresRoles:当前Subject必须拥有所有指定的角色时,才能访问被该注解标注的方法。如果当天Subject不同时拥有所有指定角色,则方法不会执行还会抛出AuthorizationException异常。

  • RequiresUser:当前Subject必须是应用的用户,才能访问或调用被该注解标注的类,实例,方法。

多个注解的问题:

Shiro的认证注解处理是有内定的处理顺序的,如果有个多个注解的话,前面的通过了会继续检查后面的,若不通过则直接返回,处理顺序依次为(与实际声明顺序无关):
RequiresRoles
RequiresPermissions
RequiresAuthentication
RequiresUser
RequiresGuest
例如:你同时生命了RequiresRoles和RequiresPermissions,那就要求拥有此角色的同时还得拥有相应的权限。

 

1)RequiresRoles

 

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresRoles {
    String[] value();
    Logical logical() default Logical.AND; 
}

可以用在Controller或者方法上。可以多个roles,默认逻辑为 AND也就是所有具备所有role才能访问。

示例:

 

属于user角色
@RequiresRoles("user")

必须同时属于user和admin角色
@RequiresRoles({"user","admin"})

属于user或者admin之一。
@RequiresRoles(value={"user","admin"},logical=Logical.OR)

2)RequiresPermissions

 

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {
    String[] value();
    Logical logical() default Logical.AND; 
}

RequiresRoles及其类似,使用如下

 

@RequiresPermissions("index:hello")
@RequiresPermissions({"index:hello","index:world"})
@RequiresPermissions(value={"index:hello","index:world"},logical=Logical.OR)

3)RequiresAuthentication,RequiresUser,RequiresGuest

这三个使用方法类似。

 

@RequiresAuthentication
@RequiresUser
@RequiresGusst

4)这个是本人额外新增的一个注解@ClearShiro,用来清除某个方法上的所有访问控制注解。

这个主要用于某个Controller的绝大部分方法都需要某个角色的权限,但是个别方法例外的情况。

 

@RequiresRoles("user")
public class LoginController extends Controller {
	@ClearShiro
	public void index(){

使用时需要做以下事项:

1)Shiro依赖于slf4j,commons-beanutils,commons-logging三个jar包。

2)public void configConstant(Constants me) { 方法中需加入401,403错误代码处理。

分别对应如下:

RequiresGuest,RequiresAuthentication,RequiresUser,未满足时,抛出未经授权的异常。
如果没有进行身份验证,返回HTTP401状态码

RequiresRoles,RequiresPermissions授权异常,如果没有权限访问对应的资源,返回HTTP状态码403。

 

me.setErrorView(401, "/au/login.html");
me.setErrorView(403, "/au/login.html");
me.setError404View("/404.html");
me.setError500View("/500.html");

3)顶一个routes成员变量。

public class AppConfig extends JFinalConfig {
	/**
	 * 供Shiro插件使用。
	 */
	Routes routes;

4)在configRoute方法中加入this.routes = me;

public void configRoute(Routes me) {
		this.routes = me;
		// TODO Auto-generated method stub
		me.add("/", IndexController.class);
		me.add("/au",AdminUserController.class);

5)public void configPlugin(Plugins me) {方法的最好加入

 

//加载Shiro插件
//me.add(new ShiroPlugin(routes));
ShiroPlugin shiroPlugin = new ShiroPlugin(this.routes);
shiroPlugin.setLoginUrl("/login.do");
shiroPlugin.setSuccessUrl("/index.do");
shiroPlugin.setUnauthorizedUrl("/login.do");
me.add(shiroPlugin);

 

6)配置一个拦截器,我这是配置了一个全局拦截器,在某些系统中,可以只给后他需要验证的部分添加拦截器,前台部分可以不用该访问控制拦截器。

 

public void configInterceptor(Interceptors me) {
		// TODO Auto-generated method stub
		me.add(new ShiroInterceptor());
	}

7)根据需要实现一个Realm,继承自AuthorizingRealm即可。

可参考:

http://www.oschina.net/question/176164_35893

 

8)配置shiro.ini文件,该文件需放在 /WEB-INF/shiro.ini这个位置。我的shiro.ini如下:

参考了http://my.oschina.net/smile622/blog/135098

 

[main]
#realm
myRealm = com.lh.openapi.manager.shiro.ShiroDbRealm
securityManager.realm = $myRealm

#cache
shiroCacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
shiroCacheManager.cacheManagerConfigFile = classpath:ehcache-shiro.xml
securityManager.cacheManager = $shiroCacheManager

#session
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
sessionDAO.activeSessionsCacheName = shiro-activeSessionCache
sessionManager.sessionDAO = $sessionDAO
securityManager.sessionManager = $sessionManager
securityManager.sessionManager.globalSessionTimeout = 360000

#这里的规则,web.xml中的配置的ShiroFilter会使用到。
[urls]
/** = anon
/card/** = user
/school/** = user
/rpc/rest/** = perms[rpc:invoke], authc
/** = authc

 

9)配置web.xml在所有filter前面添加

 

<listener>
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
  </listener>
    <filter>
    <filter-name>shiro</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>shiro</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

若shiro.ini中配置了

[urls]
/** = anon
/card/** = user
/school/** = user

相关访问控制规则,ShiroFilter会优先匹配这些规则,这个规则通过后,才会执行JFinal的Filer。才会进入JFinal的处理循环。

 

© 著作权归作者所有

玛雅牛

玛雅牛

粉丝 487
博文 115
码字总数 28117
作品 4
西安
高级程序员
私信 提问
加载中

评论(42)

JFinal
JFinal

引用来自“大胡子爸爸”的评论

jfinal 3.3 版本,plugin 启动放到 routes初始化之前了。要在route初始化之后手动启动plugin,否则routes取到为null。

public void configRoute(Routes routes) {
......这里配置routes.......
afterConfigRoutes(routes);
}

private void afterConfigRoutes(Routes routes) {
//在routes初始化完后手动启动plugin插件
ShiroPlugin plugin = new ShiroPlugin(routes);
plugin.setLoginUrl("/login");
plugin.setUnauthorizedUrl("/unauthorized");
plugin.setSuccessUrl("/");
plugin.start();
}

这个问题不知道有没有其他解决方案?@JFinal @玛雅牛
正在想办法升级,多多关注社区动态: http://www.jfinal.com/share/495

另外,这里还有一个整合方案,看是不能解决你的问题:http://www.jfinal.com/share/410
大胡子爸爸
jfinal 3.3 版本,plugin 启动放到 routes初始化之前了。要在route初始化之后手动启动plugin,否则routes取到为null。

public void configRoute(Routes routes) {
......这里配置routes.......
afterConfigRoutes(routes);
}

private void afterConfigRoutes(Routes routes) {
//在routes初始化完后手动启动plugin插件
ShiroPlugin plugin = new ShiroPlugin(routes);
plugin.setLoginUrl("/login");
plugin.setUnauthorizedUrl("/unauthorized");
plugin.setSuccessUrl("/");
plugin.start();
}

这个问题不知道有没有其他解决方案?@JFinal @玛雅牛
RobertCool
RobertCool
@玛雅牛 config中通过add(new Routes())的方式添加的路由不会被扫描到
这个有人提了个Pull Request,麻烦合并一下
咿咦咦咦咦咦酷
咿咦咦咦咦咦酷
评论不了?
咿咦咦咦咦咦酷
咿咦咦咦咦咦酷
最近在做JFinal整合Shiro. 这篇帖子帮了我很多。我是直接从3.0开始接触的JFinal,发现插件存在一点问题:
JFinal-ext包中的 shiro插件,里面的ShiroPlugin类中:Entry<String, Class<? extends Controller>> entry : routes.getEntrySet() 这个方法,在3.0的JFinal里是没有的,所以,我看了源码以后改成了Route route : routes.getRouteItemList()的方式。
原来的JFinal2.0里的Routes是用Map存储的,而3.0里是用的List.所以,这里就出了问题. 然而在JFinal-ext-3.1.0.jar包里还是2.0的写法,希望@JFinal @玛雅牛 能看一下.
还有个问题:就是在web.xml里,Shiro的Filter一定要放在所有Filter的前面,这个帖子也有提到过.但是我还是出现了问题:org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code,either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton. This is an invalid application configuration.
我的解决方案是:在JFinal-shiro.jar里的AbstractAuthzHandler类, SecurityUtils.getSubject();之前加入以下代码:
Factory<SecurityManager> factory = new IniSecurityManagerFactory(PathKit.getRootClassPath() + "/shiro.ini");
     SecurityManager security = factory.getInstance();
     SecurityUtils.setSecurityManager(security);
希望能看到更具体的JFinal中使用shiro的贴。
咿咦咦咦咦咦酷
咿咦咦咦咦咦酷
最近在做JFinal整合Shiro. 这篇帖子帮了我很多。我是直接从3.0开始接触的JFinal,发现插件存在一点问题:
JFinal-ext包中的 shiro插件,里面的ShiroPlugin类中:Entry<String, Class<? extends Controller>> entry : routes.getEntrySet() 这个方法,在3.0的JFinal里是没有的,所以,我看了源码以后改成了Route route : routes.getRouteItemList()的方式。
原来的JFinal2.0里的Routes是用Map存储的,而3.0里是用的List.所以,这里就出了问题. 然而在JFinal-ext-3.1.0.jar包里还是2.0的写法,希望@JFinal @玛雅牛 能看一下.
还有个问题:就是在web.xml里,Shiro的Filter一定要放在所有Filter的前面,这个帖子也有提到过.但是我还是出现了问题:org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code,either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton. This is an invalid application configuration.
我的解决方案是:在JFinal-shiro.jar里的AbstractAuthzHandler类, SecurityUtils.getSubject();之前加入以下代码:
Factory<SecurityManager> factory = new IniSecurityManagerFactory(PathKit.getRootClassPath() + "/shiro.ini");
     SecurityManager security = factory.getInstance();
     SecurityUtils.setSecurityManager(security);
希望能看到更具体的JFinal中使用shiro的贴。
咿咦咦咦咦咦酷
咿咦咦咦咦咦酷
最近在做JFinal整合Shiro. 这篇帖子帮了我很多。我是直接从3.0开始接触的JFinal,发现插件存在一点问题:
JFinal-ext包中的 shiro插件,里面的ShiroPlugin类中:Entry<String, Class<? extends Controller>> entry : routes.getEntrySet() 这个方法,在3.0的JFinal里是没有的,所以,我看了源码以后改成了Route route : routes.getRouteItemList()的方式。
原来的JFinal2.0里的Routes是用Map存储的,而3.0里是用的List.所以,这里就出了问题. 然而在JFinal-ext-3.1.0.jar包里还是2.0的写法,希望@JFinal @玛雅牛 能看一下.
还有个问题:就是在web.xml里,Shiro的Filter一定要放在所有Filter的前面,这个帖子也有提到过.但是我还是出现了问题:org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code,either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton. This is an invalid application configuration.
我的解决方案是:在JFinal-shiro.jar里的AbstractAuthzHandler类, SecurityUtils.getSubject();之前加入以下代码:
Factory<SecurityManager> factory = new IniSecurityManagerFactory(PathKit.getRootClassPath() + "/shiro.ini");
     SecurityManager security = factory.getInstance();
     SecurityUtils.setSecurityManager(security);
希望能看到更具体的JFinal中使用shiro的贴。
Role
Role
不错不错,最近也集成中,谢谢分享
玛雅牛
玛雅牛 博主

引用来自“施立”的评论

[urls]
/** = anon
/card/** = user
/school/** = user
第一条使用/**时 使用org.apache.shiro.web.filter.authc.AnonymousFilter
访问/card/ 这个url时候 第二条会生效吗? 我的测试结果是 第一条使用过后 其他将不会生效
这个不清楚啊,我主要是使用注解方式来管理权限。具体查查shiro的官方文档。
施立
施立
[urls]
/** = anon
/card/** = user
/school/** = user
第一条使用/**时 使用org.apache.shiro.web.filter.authc.AnonymousFilter
访问/card/ 这个url时候 第二条会生效吗? 我的测试结果是 第一条使用过后 其他将不会生效
给JFinal添加Shiro插件功能,支持Shiro所有注解

个人实现了给JFinal添加Shiro插件功能,支持Shiro所有注解。 写了三篇博客来介绍,还请@JFinal指点。 给JFinal添加Shiro插件功能,支持Shiro所有注解-实现篇 给JFinal添加Shiro插件功能,支持...

玛雅牛
2013/06/13
6.3K
9
JFinal的Shiro权限管理插件 2.0 版发布,支持JFinal 2.0

JFinal的Shiro权限管理插件 更新说明: 1)支持JFinal2.0 2)添加了一些实际项目中的代码供参考。 3)由于shiro需要与具体的业务整合才能使用,所以这个插件仅仅是方便在jfinal中使用shiro。...

玛雅牛
2015/08/18
6.2K
24
给JFinal添加Shiro插件功能,支持Shiro所有注解-实现篇

2015年8月3日更新: 支持JFinal 2.0 版本,同时给出了一些实际代码,想见git @JFinal给出了一些好的建议,已重构部分代码。 代码放在oschina的git上,访问地址: http://git.oschina.net/mya...

玛雅牛
2013/06/12
1.7W
8
给JFinal添加Shiro插件功能,支持Shiro所有注解-HTTL篇

由于使用HTTL模板引擎,所以也想将Shiro和HTTL集成起来。 具体实现如下,此嗲吗和给JFinal添加Shiro插件功能,支持Shiro所有注解-实现篇中的一样。 在httl.properties中添加一行代码。 集成完...

玛雅牛
2013/06/12
3.1K
9
Jboot 1.0-rc.3 发布,基于 JFinal 的微服务框架

Jboot是一个基于jfinal、undertow开发的一个类似springboot的开源框架, 我们已经在正式的商业上线项目中使用。到目前为止,Jboot已经支持如下功能: 1、JFinal 核心的自动注入:包含了JFina...

理工男海哥
2017/10/23
1.5K
8

没有更多内容

加载失败,请刷新页面

加载更多

数据结构和算法 | 第一部分第五课:算法复杂度实践

>作者 谢恩铭,公众号「程序员联盟」。 转载请注明出处。 原文:https://www.jianshu.com/p/060ef52580af >《数据结构和算法》全系列 内容简介 前言 寻找最大和最小的元素 寻找不重复的元素 ...

程序员联盟_
17分钟前
8
0
tomcat项目改造->jerryrat

先做一点笔记防止自己忘了,还有很多小细节要慢慢调试, 有些其实也不是漏洞,但是等保测试有些特殊的情况,只能去做兼容性的处理 1:编译tomcat8 https://tomcat.apache.org/download-80.cgi...

国产大熊猫
18分钟前
25
0
aop:aspect与aop:advisor的区别

https://www.jianshu.com/p/40f79da0cdef

osc_6jhxf9ab
18分钟前
28
0
Python破解24点游戏,从此打扑克就没输过

文源网络,仅供学习之用,如有侵权请联系删除。 24点游戏 对于任意给定的四张扑克牌,计算是否有赢得24点游戏的方法(即使用加、减、乘、除四则运算凑成24的方法);如果有的话,列出所有可能...

Python圈子
18分钟前
12
0
阿里短信回执.net sdk的bug导致生产服务cpu 100%排查

一:背景 1. 讲故事 去年阿里聚石塔上的所有isv短信通道全部对接阿里通信,我们就做了对接改造,使用阿里提供的.net sdk。 网址:https://help.aliyun.com/document_detail/114480.html 同事...

osc_slnrw1du
19分钟前
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部