目前jfinal使用shiro进行身份验证和受权的后台实现已完成,如今我再来总结下学习过程及代码实现过程。最近半年多项目开发都用.net,但又不甘心用了一年多的java,jfinal就这样被废弃,因此就准备业余时间本身用jfinal搭个框架,作点什么,具体作什么,还没想好,先搭好框架再说。用jfinal实现增删改查很简单,从官网下个demo来改改就行了,可是要作个包括有身份验证及受权完善的系统,就要稍微花点功夫了。java
1、作一些简单的jfinal的配置(如数据库配置,路由配置)后,要学习一下java比较流行且成熟的身份验证受权框架shiro,shiro这个东西乍眼一看以为挺简单的,可深刻去研究一下,发现他使用挺简单,但它的实现原理并无那么简单,我的以为学习shiro的过程,不仅是学习它的使用,更多的是学习它的思想,它用的各类模式,我也说不上来,目前大概也就知道个单例模式和工厂模式,总之,就是高大上和不明觉厉。学习shiro还在路上,由此也激发了我想了解设计模式的欲望。下面再来总结下这两周学习的shiro吧,不梳理下把他放在脑子里过一久又当垃圾丢了,学了东西总要在脑子了刻下点什么东西,对不对?web
2、shiro API理解数据库
一、Shiro能帮咱们完成认证、受权、加密、会话管理、与Web集成、缓存等功能。目前我主要学习了认证,受权和web继承。apache
二、Shiro的对外API主要有:Subject,SecurityManager,Realm,三者关系以下:设计模式
(1)Subject(api核心):主体,表明当前用户,全部Subject都会被绑定到SecurityManager。api
(2)SecurityManager(shiro核心):管理全部Subject,而且与Subjec的t全部交互,都是委托SecurityManager来实现的。缓存
(3)realm:用于获取用户身份和拥有权限,即如判断用户名和密码是否匹配,判断用户是否拥有某些权限。安全
3、shiro身份认证和受权流程步骤大致以下:app
一、先收集用户身份和凭证,如用户名和密码,并将其转换为token,传递给Subject进行认证和受权,而Subject又委托给SecurityManager。框架
二、在realm进行身份认证和受权,认证是判断输入用户名和密码是否正确的过程,认证成功后才能受权,在这里会经过用户id获取该用户拥有的全部角色和全部权限,以供后面判断该用户是否有权限访问特定资源。
以上步骤作好用户认证和受权的准备工做,接下来就是怎么给资源(如方法)加访问控制权限,好比用户列表只有拥有“用户管理”权限的人才能看见,那么怎么加这个限制呢?
三、shiro提供jsp标签和java注解,用来判断用户是否拥有某些资源的权限,这里我用java注解。shiro提供了五种注解,只需将这些注解定义在想要安全控制的方法上便可。
(1)RequiresGuest:加此注解的方法可被匿名用户访问
(2)RequiresUser:加此注解的方法只能被已登陆的用户访问(包括:已认证或已记住)
(3)RequiresAuthentication:加此注解的方法只能被已认证的用户访问(不包括已记住)
(4)RequiresRoles:加此注解的方法仅被指定角色的用户访问
(5)RequiresPermissions:加此注解的方法仅被指定权限的用户访问
四、接下来j要作的事情就是,怎么在访问一个方法时获取这个方法的注解里的角色/权限,并与第2步得到的用户拥有的角色/权限作比较,若是用户拥有的角色/权限包含了此方法上注解里的角色/权限,那么,用户就能够调用该方法,若是不包含,则用户将不能调用该方法,并返回到一个提示未受权的页面。如今问题来了,像jfinal这样的web框架怎么使用shiro拦截全部请求,判断是否已认证或有权限呢?
(1)在web.xml中配置以下节点
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> <filter> <filter-name>ShiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> </filter> <filter-mapping> <filter-name>ShiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
经过上面的配置,EnvironmentLoaderListener在容器启动时初始化SecurityManager,经过ShiroFilter拦截请求并完成认证与受权。
(2)具体获取每一个方法上的注解,并判断用户是否有权限调用该方法,大飞已经实现了,用他的就能够。