第一部分 什么是Apache Shiro
1、什么是 apache shiro :
Apache Shiro是一个功能强大且易于使用的Java安全框架,提供了认证,授权,加密,和会话管理
2、Apache Shiro 的三大核心组件:
1、Subject :当前用户的操作
2、SecurityManager:用于管理所有的Subject
3、Realms:用于进行权限信息的验证
Subject:即当前用户,在权限管理的应用程序里往往需要知道谁能够操作什么,谁拥有操作该程序的权利,shiro中则需要通过Subject来提供基础的当前用户信息,Subject 不仅仅代表某个用户,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。
SecurityManager:即所有Subject的管理者,这是Shiro框架的核心组件,可以把他看做是一个Shiro框架的全局管理组件,用于调度各种Shiro框架的服务。
Realms:Realms则是用户的信息认证器和用户的权限人证器,我们需要自己来实现Realms来自定义的管理我们自己系统内部的权限规则。
3、Authentication 和 Authorization
在shiro的用户权限认证过程中其通过两个方法来实现:
1、Authentication:是验证用户身份的过程。
2、Authorization:是授权访问控制,用于对用户进行的操作进行人证授权,证明该用户是否允许进行当前操作,如访问某个链接,某个资源文件等。
4、其他组件:
除了以上几个组件外,Shiro还有几个其他组件:
1、SessionManager :Shiro为任何应用提供了一个会话编程范式。
图片转自:http://kdboy.iteye.com/blog/1154644
第二部分 Apache Shiro 整合Spring的Web程序构建
1、准备工具:
hibernate来对数据持久层进行操作
控制显示层框架:SpringMVC 这边我使用了SpringMVC实际开发中也可以是其他框架
准备好所需要的jar放到项目中。
2、创建数据库:
首先需要四张表,分别为 user(用户)、role(角色)、permission(权限)、userRole(用户角色关系表)
这边分别创建四张表的实体类,通过Hiberante的hibernate.hbm2ddl.auto属性的update
- /***
- @Table"t_user"
- @Entity
- publicclass
- @Id
- @GeneratedValue
- //多对多用户权限表
- @OneToMany"user"
- /****
- @Entity
- @Table"t_role"
- publicclass
- @Id
- @GeneratedValue
- /**角色名**/
- /**角色说明**/
- /****
- @Entity
- @Table"t_permission"
- publicclass
- @Id
- @GeneratedValue
- /**token**/
- /**资源url**/
- /**权限说明**/
- /**所属角色编号**/
- /***
- @Entity
- @Table"t_user_role"
- publicclass
- @Id
- @GeneratedValue
- @ManyToOne
- @JoinColumn"userId"true
- @ManyToOne
- @JoinColumn"roleId"true
3、编写操作用户业务的Service:
- @Service
- publicclass
- /****
- public
- new
- return
- /***
- public
- "调用"
- ifnull
- returnnull
- new
- for
- new
- for
- return
- @Autowired
- private
4、编写shiro组件自定义Realm:
- package
- import
- import
- import
- import
- import
- import
- import
- import
- import
- import
- import
- import
- /****
- publicclassextends
- /***
- @Override
- protected
- //根据自己系统规则的需要编写获取授权信息,这里为了快速入门只获取了用户对应角色的资源url信息
- ifnull
- ifnull
- new
- for
- //将权限资源添加到用户信息中
- return
- returnnull
- /***
- @Override
- protectedthrows
- ifnull""
- ifnull
- returnnew
- returnnull
- /**用户的业务类**/
- private
- public
- return
- publicvoid
- this
上述类继承了Shiro的AuthorizingRealm类 实现了AuthorizationInfo和AuthenticationInfo两个方法,用于获取用户权限和认证用户登录信息
5、编写LoginController:
- package
- import
- import
- import
- import
- import
- import
- import
- import
- import
- import
- /****
- @Controller
- publicclass
- /***
- @RequestMapping"toLogin"
- public
- return"login"
- /***
- @RequestMapping"login"
- public
- new
- ifnull
- "toLogin"
- "msg""用户不存在"
- return
- if
- "toLogin"
- "msg""账号密码错误"
- return
- new
- "redirect:/home"
- return
- @Autowired
- private
6、编写信息认证成功后的跳转页面:
- package
- import
- import
- @Controller
- publicclass
- @RequestMapping("home"
- public
- "登录成功"
- return"home"
7、Shiro的配置文件.xml
- "shiroFilter"class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"
- "securityManager""securityManager"
- "loginUrl""/toLogin"
- "successUrl""/home"
- "unauthorizedUrl""/403"
- "filterChainDefinitions"
- "myShiroRealm"class="org.swinglife.shiro.MyShiroRealm"
- "accountService""accountService"
- "securityManager"class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"
- "realm""myShiroRealm"
- "accountService"class="org.swinglife.service.AccountService"
- "shiroCacheManager"class="org.apache.shiro.cache.ehcache.EhCacheManager"
- "cacheManager""cacheManager"
loginUrl 用于配置登陆页
successUrl 用于配置登录成功后返回的页面,不过该参数只会在当登录页面中并没有任何返回页面时才会生效,否则会跳转到登录Controller中的指定页面。
unauthorizedUrl 用于配置没有权限访问页面时跳转的页面
filterChainDefinitions:apache shiro通过filterChainDefinitions参数来分配链接的过滤,资源过滤有常用的以下几个参数:
1、authc 表示需要认证的链接
2、perms[/url] 表示该链接需要拥有对应的资源/权限才能访问
3、roles[admin] 表示需要对应的角色才能访问
4、perms[admin:url] 表示需要对应角色的资源才能访问
8、登陆页login.jsp
- <body>
- <h1></h1>
- <formaction="login"method="post">
- username:<inputtype="text"name="username"><p>
- password:<inputtype="password"name="password">
- <p>
- <inputtype="submit"value="submit">
- </form>
- </body>
9、运行程序
在数据库中添加一条用户、角色、以及权限数据,并且在关联表中添加一条关联数据:
转载出处:
最后输入 账号密码 就会跳转
shiro jar:http://download.csdn.net/detail/swingpyzf/8766673
项目源码:github:https://github.com/swinglife/shiro_ex