版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程目5、掌握Shiro进行的常用方法权限管管理实现对用户系统的控制按照安全规则或者安全策略控制用户可以而且只能访户首先经过认证,认证通过后用户具有该资源的权限方可。用户认是系统通过核对用户输入的用户名和口令看其是否与系统中的该用户的用户名和口令用户名认证流是否允 问
YES用户是否用户是否认通过进行用 认YES继
是否认证通过
NO续认箱地址等,一个主体可以有多个,但是必须有一个主(PrimaryPrincipal 等问系统的资源,对于某些资源没限是无法的。权限控认分权限控认分配权NO系统资继继有意义,如用户查询权限、用户添限、某个类方法的调用权限、编号为001用户的修改权限等,通过权限可知主体对哪些资源都有哪些操作。主主(用户权(查询权(添加权(删除权类型商品资(商品信息资主体(账号、)********用角权1111****用角1资*****1111****基于角色的控,RBAC基于角色的控制(Role-BasedAccessControl)是以角色为中心进行控制,比如:主体的角色为总经理可以查询企业运营报表,查询员工工资信息等控制流程如,YESYES查询工资信无无处(通常提示用户无权操作}if(主体.hasRole("总经理角色id")|| }基于资源的控RBAC基于资源的控制(Resource-BasedAccessControl)是以资源为中心进行}权限管理解决方service接口添加校验实现,service接口需要传入当前操作人的标识,与商品信息创建人标识对比,不一url基于url是企业中常用的权限管理方法,实现思路是:将系统操作的每个url配置在权限表中,将权限对应到角色,将角色分配给用户,用户系统功能通过Filter进行过虑过虑器获取到用户的url,只要的url是用户分配角色中的url则放行继续。系系统的资 认证通过将用户认证通过将用户 权限url记录到 Url是否公开地( 地Url是否公开地( 地址是否存在url是否公开地Url是否是公地址(只 认 是否存在权限url获 过虑获 提示无权操放行继放行继放行继放行继NO进行用 认省系统开发时间,并且权限管理框架提供了完善的认证和功能有利于系统扩展,但基于url实web系统框架:springmvc3.2.0+mybatis3.2.7(springmvc教案)UI:jqueryeasyUI1.2.2mysql5.1导入,先导入shiro_sql_talbe.sql再导入shiro-sql_table_data.sqlactiveUser用户publicpublicclassActiveUserimplementsjava.io.SerializableprivateStringuserid;//用户idprivateStringusercode;/用户账号privateStringusername;/privatesprivateList<SysPermissionpermissions用户认证使用springmvc器对用户认证进行如果用户没有登陆则跳转到登陆页面,filter实现。publicpublicclassLoginInterceptorimplementsHandlerInterceptor在进入controllerpublicbooleanpreHandle(HttpServletRequest{)List<String>open_urls=的Stringurl=for(Stringopen_url:open_urls)if(url.indexOf(open_url)>=0)//如 的是公开地址则放return}}HttpSessionsession=ActiveUseractiveUser=(ActiveUser)if(activeUser!=null)return}return}用户使用springmvc器对用户url进行如果用户的url没有分配权限则跳转到无权操作提示页面(refuse.jspfilter实现。publicpublicclassPermissionInterceptorimplementsHandlerInterceptor在进入controller进入actionpublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{//TODOAuto-generatedmethod//用 Stringurl=)List<String>open_urls=//用 的for(Stringopen_url:open_urls)if(url.indexOf(open_url)>=0)//如 的是公开地址则放return}}//从session获取用户公 List<String>common_urls=//用 的for(Stringcommon_url:common_urls)if(url.indexOf(common_url)>=0)//如 return}}}HttpSessionsession=request.getSession();ActiveUseractiveUser=(ActiveUser)取出session中权限//校验用 for(SysPermissionsysPermission:permission_list){Stringpermission_url=sysPermission.getUrl();if(url.contains(permission_url)){return}}request,response);return}url等)activeUsersession。publicStringloginsubmit(HttpSessionsession,Stringpassword,Stringrandomcode)throwsString 错thrownew } 认ActiveUseractiveUser=sysService.authenticat(usercode,session.setAttribute("activeUser"activeUser);return}service**Title:@param@param@returnActiveUser@throwspublicActiveUserauthenticat(Stringusercode,Stringthrows根据用户idpublicList<SysPermission>findSysPermissionList(Stringthrows shiro介shiro。shiro。ShiroSubjectsubject进行交互,subject记录了当前操作用户,将用户的SubjectshirosubjectsubjectSecurityManagerSecurityManager即安全管理器,对全部的subject进行安全管理,它是shiro的,subjectSecurityManagersubject的认证、等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行,通SessionManager进行会话管理等。,Authenticator即认证器,对用户进行认证,Authenticator是一个接口,shiro提供Authorizer即器,用户通过认证器认证通过,在功能时需要通过器判断用securityManger注意:realm理解成只是从数据源取数据,在realm中还有认证校验的相关shiroweb应用上,也可以将分布式应用的会话集中在一点管理,此特性可以通过jdbc将会话到数据库。Cryptography即管理,shiro提供了一套加密/的组件,方便开发。比如提供shirojarjavashirojarshiro提供的功能了。shiro-core是包必须选用还提供了与web整合的shiro-web与spring整合的shiro-spring、quartzshiro-quartzshirojarmaven坐标。参考 shiro认构构造SecurityManager环提交认执行认执行认根 获取验证信入门程序(用户登陆和退出javajdk版本:1.7.0_72shiro-coreJpertieslog4j.rootLogger=debug,Shiro.iniSecurityManager环境。配置eclipseini文件编辑:在eclipse配置后,在classpath创建shiro.ini配置文件,为了方便测试将用户名和配置shiro.ini配置文件中:publicvoidtestLoginLogout()构建SecurityManager工厂,IniSecurityManagerFactory可以从ini文件Factory<SecurityManager>factory=newIniSecurityManagerFactory(通过工厂创建SecurityManagersecurityManager=////Subjectsubject=UsernamePasswordTokentoken=newtry}catch(AuthenticationExceptione)//TODOAuto-generatedcatchblock}BooleanisAuthenticated=System.out.println("用户认证状态:isAuthenticated=System.out.println("用户认证状态:}3AuthenticatorModularRealmAuthenticatorrealmini配置文件取用户真实的账号和,这里使用的是IniRealm(shiro自带)4IniRealm先根据token中的账号去ini中找该账号,如果找不到则给org.apache.shiro.authc.UnknownAccountExceptionNoaccountfoundfor.apache.shiro.authc.IncorrectCredentialsException:Submitted rememberMe=false]didnotmatchtheexpectedcredentials.上边的程序使用的是Shiro自带的IniRealmIniRealm从ini配置文件中用户的信息,大部分情况下需要从系统的数据库中用户信息,所以需要自定义realm。shiro最基础的是Realm接口,CachingRealm负责缓存处理,AuthenticationRealmpublicpublicclassCustomRealm1extendsAuthorizingRealmpublicStringgetName()return}publicbooleansupports(AuthenticationTokentoken)returntokeninstanceof}protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{//从tokenStringusername=(String)returnreturn}Stringpassword"123";//SimpleAuthenticationInfosimpleAuthenticationInfonewusername,password,return}protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){//TODOAuto-generatedmethodreturn}}# 测试代码同入门程序,将ini的地址修改为shiro-realm.ini。 无法将转成原始内容散列算法常用于对进行散列常用的散列算法有MD5SHA。一般散列算法需要提供一个salt(盐)与原始内容生成信息,这样做的目的是为了安全性,比如:111111的md5值是:96e eb72c92a549dd5a330112,拿着 eb72c92a549dd5a330112”去md5很容易进行,如果要是对111111和salt(盐,一个随机数)进行散列,这样虽然都是111111加不同的盐会生成Stringpassword_md5newMd5Hash("111111").toString();Stringpassword_md5_sale_1=newMd5Hash("111111","eteokues",Stringpassword_md5_sale_2=newMd5Hash("111111","uiwueylm",StringsimpleHash=newSimpleHash("MD5","111111",realmrealm从数据库取出盐和加密后的值由shiro完成校验。自定义protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{Stringusername=(String)是Stringpassword=Stringsalt="eteokues";SimpleAuthenticationInfosimpleAuthenticationInfo=username,password,return}realm配. 测试代shiro执根根获取资源权限信执Shiro支持三种方式的编程式:通过写if/else代码块完成Subjectsubject=//}else//}publicvoido(){//}JSP/GSP:在JSP/GSP页面通过相应的完成<!—限—本序测试使用第一种编程方式,实际与web系统集成使用后两种方式 在ini文件中用户、角色、权限的配置规则是“用户名=,角色1,角色2...”“角色=12...:”是资源用户实例001的所限:user:*:001 publicvoidtestPermission()//Factory<SecurityManager>factory=newIniSecurityManagerFactory(创建SecurityManagersecurityManager=将securityManagerSubjectsubject=
//设置用户认证的 UsernamePasswordTokentoken=newUsernamePasswordToken("zhang",try}catch(AuthenticationExceptione)//TODOAuto-generatedcatchblock}BooleanisAuthenticated=System.out.println("用户认证状态://用 检测基于角System.out.println("用户是否拥有一个角色:System.out.println("用户是否拥有多个角色:"+subject.hasAllRoles(Arrays.asList("role1""role2"))); //System.out.println("是否拥有某一个权限:System.out.println("是否拥有多个权限:"+subject.isPermittedAll("user:create:1""user:delete"));}////用 检测基于角System.out.println("用户是否拥有一个角色:System.out.println("用户是否拥有多个角色:"+subject.hasAllRoles(Arrays.asList("role1""role2"))); System.out.println("是否拥有某一个权限:System.out.println("是 subject.isPermittedAll("user:create:1","user:delete"));check realmrealmdoGetAuthorizationInfo方法,此方法需要完成:根据用户从数据库查询权限字符串,由shiro进行。protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){Stringusername=(String)//根 List<String>permissions=newArrayList<String>();SimpleAuthorizationInfosimpleAuthorizationInfonewfor(Stringpermission:permissions){}return}2securityManager通过ModularRealmAuthorizershiro与项目集成开shirospringwebshiro与springweb项目整合在“基于url实现的工程”基础上整合,基于url1、shirospring整合2shiroweb取消原springmvc认证和去掉springmvc.xml中配置的LoginInterceptor和PermissionInterceptor器shirojarweb.xmlshiro filter设置true由servlet容器控制filter设置spring容器filter的beanid,如果不设置则找与filter-name一致 Shiro的Web<bean<propertyname="securityManager"ref="securityManager"loginUrl认证提交地址,如果没有认证将会请求此地址进行认证,请求此地址将由formAuthenticationFilter进行表单认证--><propertyname="loginUrl"value="/login.action"<propertyname="unauthorizedUrl"value="/refuse.jsp"<property<!--退 /logout.action=<!--无 页面--/refuse.jsp=<!--roles[XX]表示有XX角色才 /item/list.action=/js/**/images/**/styles/** .jsp/item/*<!--user表 /**=<beanid="securityManager"<propertyname="realm"ref="userRealm"realm<beanid="userRealm"址的话会自动寻找项目web项目的根 publicpublicclassCustomRealm1extendsAuthorizingRealmpublicStringgetName()return}支持什么类型的tokenpublicbooleansupports(AuthenticationTokentoken)returntokeninstanceof}protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{从tokenStringusername=(String)拿username//如果查询不到则返回if(!username.equals("zhang"return}Stringpassword"123";/根据用户id s=newSysPermissionsysPermission_1=newSysPermissionsysPermission_2newSysPermission();ActiveUseractiveUser=newActiveUser(); //SimpleAuthenticationInfosimpleAuthenticationInfo=activeUser,password,return}protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){ActiveUseractiveUser=(ActiveUser)Stringuserid=// List<String>permissions=newArrayList<String>();将权限信息封闭为SimpleAuthorizationInfosimpleAuthorizationInfo=for(Stringpermission:permissions)}return}}publicStringloginsubmit(Modelmodel,HttpServletRequestthrowsExceptionshiro在认证过程中出现错误后将异常类路径通过request返回StringexceptionClassName=(String)requestthrownewCustomException("账号不存在}elseexceptionClassName))thrownewCustomException("用户名 错误elseif("randomCodeError".equals(exceptionClassName)){thrownewCustomException(" }thrownewException();//}}return}sessionshirocontrollersessionmodelpublicStringfirst(Modelmodel)throwsSubjectsubject=ActiveUseractiveUser=(ActiveUser)subject.getPrincipal();model.addAttribute("activeUser",activeUser);return}shirosessionManager,shirologout执行退出操作/logout.action=shiro过滤器简 对应的java anon:例子/admins/**=anon没有参数,表示可以使用authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,FormAuthenticationFilter是hasAllRoles()方法。isPermitedAll()方法。rest:例子/admins/user/**=rest[user],根据请求的方法,相当于],port:例子/admins/user/**=port[8081当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,salhttphttps等,serverName是你的host,8081是url配置里port的端口,queryString是你的url里的?后面的参数user:例如/admins/user/**=user没有参数表示必须存在用户,认证通过或通过记住我认证通过的可以,当登入操作时不做检查md5加密校验。applicationContext-shiro.xml:<bean<propertyname="hashAlgorithmName"value="md5"<propertyname="hashIterations"value="1"realm<beanid="userRealm"<propertyname="credentialsMatcher"ref="credentialsMatcher"realmpublicpublicclassCustomRealm1extendsAuthorizingRealmprivateSysServicepublicStringgetName()return}支持什么类型的tokenpublicbooleansupports(AuthenticationTokentoken)returntokeninstanceof}protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{从tokenStringusercode=(String)SysUsersysUser=null;try{sysUser=}catch(Exceptione)//TODOAuto-generatedcatchblock}if(sysUser==null)return}//根据用户id取出菜单 s=null;try{s= }catch(Exceptione)//TODOAuto-generatedcatchblock}Stringpassword=Stringsalt=ActiveUseractiveUser=newActiveUser(); SimpleAuthenticationInfosimpleAuthenticationInfo=activeUser,password,returnreturn}}8.3修改realm方publicpublicclassCustomRealm1extendsAuthorizingRealmprivateSysServicepublicStringgetName()return}支持什么类型的tokenpublicbooleansupports(AuthenticationTokentoken)returntokeninstanceof}protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){ActiveUseractiveUser=(ActiveUser)Stringuserid=List<SysPermission>permissions=null;try{permissions=}catch(Exceptione)//TODOAuto-generatedcatchblock} 信SimpleAuthorizationInfosimpleAuthorizationInfo=for(SysPermission}return}}controller开启aop<aop:configproxy-target-开启shiro<propertyname="securityManager"ref="securityManager"商品查询controller方法添限(item:query:publicModelAndViewqueryItem()throwsException上边代码s)表示必须拥有“y”权限方可执行。同理,商品修改controller方法添限(item:update:(value(value=publicStringeditItem(@RequestParam(value="id",required=true)Integerid,Modelmodel)throwsExceptionpublicStringeditItemSubmit(@ModelAttribute("item")Itemsitems,BindingResultresult,MultipartFilepictureFile,Modelthrowsjsp控介Jsp名 RememberMe RememberMe<shiro:hasAnyRolesname="abc,123" abc123<shiro:hasRole <shiro:lacksRole <shiro:hasPermission 拥限资源<shiro:lacksPermission abc 显示用户名<shiro:principal 显示用户中的属性jsp页面添加<shiro:hasPermissionhref="${pageContext.request.contextPath/item/editItem.action?id=${ite<shiro:hasPermissionhref="${pageContext.request.contextPath/item/editItem.action?id=${iteshiro每次都会通过realm获取权限信息为了提高速度需要添加缓存第一次从realm中权限数据之后不再这里Shiro和EhcacheEhcachejar在applicationContext-shiro.xml<beanid="securityManager"<propertyname="realm"ref="userRealm"<propertyname="cacheManager"<beanid="cacheManager"<propertyname="cacheManagerConfigFile"<<ehcache 地址--<diskStorepath="F:\develop\ehcache" 当用户权限修改后,用户再次登陆shiro会自动调用realm从数据库获取权限数据如果在修改权限后想立即清除缓存则可以调用realm的clearCacherealm中定义clearCachedpublicvoidclearCached(){PrincipalCollectionprincipals=}在权限修改后调用realmrealm已经由spring中获取realm实例,调用clearCachedsession<beanid="securityManager"<beanid="securityManager"<propertyname="realm"ref="userRealm"<prop
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 解除劳动合同通知书简易范本
- 服务外包的合同范本
- 私人之间的保密协议
- 破碎机买卖合同3篇
- 个人租汽车给公司租赁合同
- 钢结构工程施工合同
- 河道采砂合同范本
- 2024年度股权转让及投资意向书2篇
- 2024年度合作协议:甲乙双方关于共同开展项目的具体条款2篇
- 《生物化学方法》课件
- 酒店业食品安全
- 2024版《安全生产法》考试题库附答案(共80题)
- 网络安全技术作业指导书
- 2024年信息网络工程分包劳务合同
- 网约车全国公共科目考试题库与答案(一)
- 煤矿灾害预防及事故应急管理
- 统编版 高中语文 必修上册 生命的诗意第三单元大单元教学
- 建筑施工安全生产治本攻坚三年行动工作计划
- 河道防汛应急预案(6篇)
- 2024年销售代理协议范本
- 电工登高作业安全操作规程
评论
0/150
提交评论