shiro课堂笔记.pdf
《shiro课堂笔记.pdf》由会员分享,可在线阅读,更多相关《shiro课堂笔记.pdf(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、shiro 第二天shiro 授权 shiro 和企业项目整合开发1 复习什么是权限管理?权限管理是系统的安全范畴,要求必须是合法的用户才可以访问系统(用户认证),且必须具有该资源的访问权限才可以访问该资源(授权)。认证:对用户合法身份的校验,要求必须是合法的用户才可以访问系统。授权:访问控制,必须具有该资源的访问权限才可以访问该资源。权限模型:标准权限数据模型包括:用户、角色、权限(包括资源和权限)、用户角色关系、角色权限关系。权限分配:通过UI 界面方便给用户分配权限,对上边权限模型进行增、删、改、查操作。权限控制:基于角色的权限控制:根据角色判断是否有操作权限,因为角色的变化性较高,如果
2、角色修改需要修改控制代码,系统可扩展性不强。基于资源的权限控制:根据资源权限判断是否有操作权限,因为资源较为固定,如果角色修改或角色中权限修改不需要修改控制代码,使用此方法系统可维护性很强。建议使用。权限管理的解决方案:对于粗颗粒权限管理,建议在系统架构层面去解决,写系统架构级别统一代码(基础代码)。粗颗粒权限:比如对系统的url、菜单、 jsp 页面、页面上按钮、类方法进行权限管理,即对资源类型进行权限管理。对于细颗粒权限管理:粗颗粒权限:比如用户id 为 001 的用户信息(资源实例)、类型为t01 的商品信息(资源实例),对资源实例进行权限管理,理解对数据级别的权限管理。细颗粒权限管理是
3、系统的业务逻辑,业务逻辑代码不方便抽取统一代码,建议在系统业务层进行处理。基于 url 的权限管理(掌握) :企业开发常用的方法,使用web 应用中 filter 来实现,用户请求url,通过 filter 拦截,判断用户身份是否合法(用户认证) ,判断请求的地址是否是用户权限范围内的url(授权 )。shiro:shiro 是一个权限管理框架,是apache 下的开源项目。相比spring security 框架更简单灵活,spring security 对spring 依赖较强。 shiro 可以实现 web 系统、 c/s、分布式等系统权限管理。shiro 认证流程:(掌握)1、subj
4、ect(主体 )请求认证,调用subject.login(token) 2、SecurityManager ( 安全管理器 )执行认证3、SecurityManager 通过 ModularRealmAuthenticator进行认证。4、ModularRealmAuthenticator将 token 传给 realm, realm 根据 token 中用户信息从数据库查询用户信息(包括身份和凭证)5、realm 如果查询不到用户给ModularRealmAuthenticator返回 null,ModularRealmAuthenticator抛出异常 (用户不存在)6、realm 如果查
5、询到用户给ModularRealmAuthenticator返回 AuthenticationInfo( 认证信息 ) 7、ModularRealmAuthenticator拿着 AuthenticationInfo( 认证信息 )去进行凭证(密码)比对。如果一致则认证通过,如果不致抛出异常(凭证错误)。subject :主体Authenticator :认证器(shiro 提供)realm(一般需要自定义) :相当于数据源,认证器需要realm 从数据源查询用户身份信息及权限信息。2 课程安排1、shiro 授权通过测试代码讲解基于角色权限控制,基于资源的权限控制(掌握)2、shiro 与
6、spring 进行整合项目框架springmvc+mybatis+shiro 3、在整合工程下学习:认证授权sessionManager 缓存管理. 3 shiro授权3.1 授权流程3.2 三种授权方法Shiro 支持三种方式的授权:编程式:通过写if/else 授权代码块完成:Subject subject = SecurityUtils.getSubject(); if(subject.hasRole(“ admin ” ) / 有权限 else / 无权限 注解式:通过在执行的Java方法上放置相应的注解完成:RequiresRoles(admin) public void hello
7、() / 有权限 JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成: 7构ifiScturilyManager环垃Subject.isPermittcd()授权SeenrityManager.isPenniticd(执行授权Authrizcr执佇授杖Ralm根据身份疣取资深忟哏佔以IL3.3 shiro-permission.ini shiro-permission.ini 里边的内容相当于在数据库。#用户users#用户zhang 的密码是 123,此用户具有 role1 和role2 两个角色zhang =123,role1,role2wang=123,role2#权限rol
8、es#角色role1 对资源 user 拥有create、update 权限role1 =user:create,user:update#角色role2 对资源 user 拥有create、delete 权限role2 =user:create,user:delete#角色role3 对资源 user 拥有create权限role3 =user:create权限标识符号规则:资源:操作 :实例 (中间使用半角 :分隔 ) user:create:01 表示对用户资源的01 实例进行create 操作。user:create:表示对用户资源进行create 操作,相当于user:create:*
9、 ,对所有用户资源实例进行create 操作。user:* :01 表示对用户资源实例01 进行所有操作。3.4 程序编写/基于角G的揆权/hflsRol崎入ft色桐RboolaanihaRoleSystem*out*println4ishasRole);/hasAllRolJiCTa有多个始boolanhatAllRolys=tubject.ha*AllRolei(Aorayt.oiListVoly1M,Volt-iV,Vole3,);5yite?m_uut_print1n-t-hdsAllRoles)jsubject*hoftoleCVoll);/chec105法ifi竹ft权,扣樂3S1
10、W+33尝榈出S京/subett.checkRolerolel3*);/甚子资强的揍权/isPermi什ed传入标iH苻booleani5PermitJtedSystem,out-printingk,-tRPHfJ|gjf,+isPenmil:i:ecl);subject:-d&Permilrtecl(*u5er:create:1M)jbooleanisPermit4:edA11=subjeirtTisPerm:t七tedAl1(user:(ireate:1,uspr:de1eteJSys-tem.OLft.prirrtin(-多入:s P e r m i+i:e d A1 1)j/使mche
11、ck方法进冇校抆,扣闲窄杈不_讨亡啪出异常ubjtict,checkPflrmibion(itemstc:1);4 自定义 realm 进行授权4.1 需求上边的程序通过shiro-permission.ini 对权限信息进行静态配置,实际开发中从数据库中获取权限数据。就需要自定义 realm,由 realm 从数据库查询权限数据。realm 根据用户身份查询权限数据,将权限数据返回给authorizer (授权器)。4.2 自定义 realm 在原来自定义的realm 中,修改doGetAuthorizationInfo方法。4.3 shiro-realm.ini 在 shiro-realm
12、.ini 中配置自定义的realm,将 realm 设置到 securityManager 中。mainOverrideprotectedAuthorizationInfodoGetAuthorizationlnfofPrincipalCollectionprincipals)/从principals获取主身份If息/柊getPrimaryPrincipal方法逅回直特为真实身份龙型t_tidoGetAuthenticationInfoiUljliiii?ijSimplstringusenCode=(String)principals.getMrimanyPnincipal()-/槙抑M數掮庠
13、获取罗嫩掮Listpermissions-add(._user:create):用户的髓permissions.add11items:add;/商知症加权限HArrayList()jpermissions=rew/&.imm遐跑杈信息(要包活上娜permissions)SirtiplAuthiorizationinfosimpleAuthoriationlrifo=:newSimpleAuthorizationlnfof);/捋宜晒愤权信息填充到simpleAuthorizationInfos报中simpleAuthorizationInfo.dddStringPermis3ions(prmi
14、sion5);simp1eAu七hori7ationTrrfo;ne+urn#自定义 realmcustomRealm =cn.itcast.shiro.realm.CustomRealm#将realm 设置到 securityManager,相当 于spring中注入securityManager.realms=$customRealm 4.4 测试程序/ 自定义 realm 进行资源授权测试Testpublicvoid testAuthorizationCustomRealm() / 创建SecurityManager工厂Factory factory = new IniSecurityM
15、anagerFactory( classpath:shiro-realm.ini); / 创建SecurityManagerSecurityManager securityManager = factory.getInstance(); / 将SecurityManager设置到系统运行环境,和 spring后将SecurityManager配置spring容器中,一般单例管理SecurityUtils.setSecurityManager(securityManager); / 创建subjectSubject subject = SecurityUtils.getSubject(); /
16、创建token 令牌UsernamePasswordToken token = new UsernamePasswordToken(zhangsan, 111111 ); / 执行认证try subject.login(token); catch (AuthenticationException e) / TODO Auto-generated catch blocke.printStackTrace(); System. out .println( 认证状态: + subject.isAuthenticated(); / 认证通过后执行授权/ 基于资源的授权,调用 isPermitted方法
17、会调用 CustomRealm从数据库查询正确权限数据/ isPermitted传入权限标识符,判断 user:create:1是否在 CustomRealm查询到权限数据之内boolean isPermitted = subject.isPermitted(user:create:1); System. out .println( 单个权限判断 + isPermitted); boolean isPermittedAll = subject.isPermittedAll(user:create:1, user:create); System. out .println( 多个权限判断 + i
18、sPermittedAll); / 使用check 方法进行授权,如果授权不通过会抛出异常subject.checkPermission(items:add:1); 4.5 授权流程1、对 subject 进行授权,调用方法isPermitted(permission 串)2、SecurityManager 执行授权,通过ModularRealmAuthorizer执行授权3、ModularRealmAuthorizer执行 realm(自定义的CustomRealm)从数据库查询权限数据调用 realm 的授权方法:doGetAuthorizationInfo4、realm 从数据库查询权限
19、数据,返回ModularRealmAuthorizer 5、ModularRealmAuthorizer调用 PermissionResolver 进行权限串比对6、如果比对后, isPermitted 中permission 串在 realm 查询到权限数据中,说明用户访问permission 串有权限, 否则 没有权限,抛出异常。5 shiro与项目整合5.1 需求将原来基于url 的工程改成使用shiro 实现。5.2 创建新工程创建 web 工程:permission_shiro1110 5.3 去除原工程的认证和授权的拦截删除 springmvc.xml 中: 5.4 jar 包包括
20、:shiro-web 的 jar、shiro-spring 的 jar shiro-code 的 jar 5.5 web.xml中配置 shiro的 filter 在 web 系统中, shiro 也通过 filter 进行拦截。 filter 拦截后将操作权交给spring 中配置的filterChain (过虑链儿)shiro 提供很多filter 。在 web.xml 中配置 filter BsMrc-rprirgCfISshirs-wet)sMrc-vrebaluirf5itijshiroFilterorg*springframework*web.filter*DelegatingFi
21、lterProxytangetFilterLifecycletruetargetBeanNameshiroFiltershiroFilter/*5.6 applicationContext-shiro.xml 在 applicationContext-shiro.xml 中配置 web.xml 中 fitler 对应 spring 容器中的bean。5.7 静态资源对静态资源设置逆名访问:修改 applicationContext-shiro.xml: c!-*w&b.xmli?Jhirop:!“Jyy7cWebn;iJS3-*propertyname=【,secii/it3f/ttpwtfe
22、iref-wsecwrityNanugsr,r/TiDginUrliAiaJt-嘛S有认沾讳会请字tt地址jfiOU证.iffiTttim0forn(iAufh*mtipropertyname=Hiooint/rivlue-m/iogin.actionm/攰脑峨乂.M上向节1庠拉行.pnopertyM/itterChainDsfinii:iansuname-=aron弋/propertyrityManager全亩IS-kbeanid=11secwrityNanagsrmcla55=iHor3ppcache,shrirorucb-Migt.OcfaultiifebSccjrityManageru
23、C!5ecuU-realm-kbeanid=rustoafleaimclass=Vn,itcast.ssti.shiro.Custowtkeol/value/images/*/js/styles/*=anon牛中anonanon5.8 登陆5.8.1 原理使用FormAuthenticationFilter过虑器实现,原理如下:将用户没有认证时,请求loginurl进行认证,用户身份和用户密码提交数据到loginurl FormAuthenticationFilter拦截住取出 request中的 username 和 password(两个参数名称是可以配置的)FormAuthenticat
24、ionFilter调用 realm 传入一个 token (username 和 password)realm 认证时根据username 查询用户信息(在 Activeuser中存储,包括 userid、 usercode 、 username、 menus) 。如果查询不到, realm 返回 null ,FormAuthenticationFilter向 request 域中填充一个参数(记录了异常信息)5.8.2 登陆页面由于FormAuthenticationFilter的用户身份和密码的input的默认值( username 和 password),修改页面的账号和密码的 inpu
25、t的名称为 username 和 password 5.8.3 登陆代码实现/7餐陆拐交地址_和叩卩11(:300Sb&anid=shiriiter*cla55=l,cjrg,ipac/je,shir1-loginUrlU还 根 交 埔 址,将 会m求 此WAl进f!iUE_STJtfelsforRAjthnticdtionFilteriSMAiif-通远unauthorizedUr丄相较有权限揲作哦转芡B-propertyramG-rvnaothorizedUrluvalue=Vre/sc,jspfpropertyndrne=,p/iLterC/ioif7JeiLnitiorrsT7aTij
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- shiro 课堂 笔记
限制150内