ImageVerifierCode 换一换
格式:DOCX , 页数:42 ,大小:1.51MB ,
资源ID:8888799      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8888799.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(java程序里面的shiro.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

java程序里面的shiro.docx

1、java程序里面的shiro权限管理概念引用:权限管理是系统的安全范畴,要求必须是合法的用户才可以访问系统(用户认证),且必须具有该资源的访问权限才可以访问该资源(授权)。认证:登录校验。授权:权限校验。权限模型:标准权限数据模型包括:用户、角色、权限(包括资源和权限)、用户角色关系、角色权限关系。权限分配:通过UI界面方便给用户分配权限,对上边权限模型进行增、删、改、查操作。权限控制: 基于角色的权限控制:根据角色判断是否有操作权限,因为角色的变化性较高,如果角色修改需要修改控制代码,系统可扩展性不强。 基于资源的权限控制:根据资源权限判断是否有操作权限,因为资源较为固定,如果角色修改或角色

2、中权限修改不需要修改控制代码,使用此方法系统可维护性很强。建议使用。权限管理的解决方案: 对于粗颗粒权限管理,建议在系统架构层面去解决,写系统架构级别统一代码(基础代码)。 粗颗粒权限:比如对系统的url、菜单、jsp页面、页面上按钮、类方法进行权限管理,即对资源类型进行权限管理。 对于细颗粒权限管理: 粗颗粒权限:比如用户id为001的用户信息(资源实例)、类型为t01的商品信息(资源实例),对资源实例进行权限管理,理解对数据级别的权限管理。 细颗粒权限管理是系统的业务逻辑,业务逻辑代码不方便抽取统一代码,建议在系统业务层进行处理。基于url的权限管理(掌握): 企业开发常用的方法,使用we

3、b应用中filter来实现,用户请求url,通过filter拦截,判断用户身份是否合法(用户认证),判断请求的地址是否是用户权限范围内的url(授权)。shiro概念权限管理要干的事总体上可以看成2部分,一部分是用户、角色、资源,及它们的关联关系的维护。二是认证(登录认证:登录时验证用户名、密码;认证校验:访问url时判断校验已经登录)、鉴权(访问url等资源时判断是否有权限),这几个常用操作。shiro主要功能是对认证、鉴权中的某些步骤进行了封装。登录认证流程:1、用户输入用户名、密码,提交登录。2、后台根据用户名查询用户账号信息。3、对比用户传入的密码和查询返回的账号信息中的密码是否一致。

4、认证校验流程:1、后台校验用户是否登录(shiro中是将已登录的subject放入session中。取出subject进行判断)。鉴权(校验权限)流程:1、后台根据用户名查询用户权限。2、对比用户请求的资源是否在用户所拥有的权限内。(登录以后立即查询所有权限的过程,这是在准备用户菜单列表,并不是鉴权过程)shiro对登录认证流程的第2、3步进行了封装;对认证校验的第1步进行了封装;对鉴权过程的第1步进行了封装(web环境中对第2步也进行了封装)。shiro提供了AuthorizingRealm类,用户只需要实现其中的doGetAuthenticationInfo和doGetAuthorizat

5、ionInfo方法即可。登录时,将用户输入的用户名、密码封装成AuthenticationToken对象作为参数,调用doGetAuthenticationInfo方法。查询用户时如果返回null,会自动抛出UnknownAccountException异常。返回不为null时,shiro会自动比较传入的密码和查询返回的密码是否一致,如果不一致,会抛出IncorrectCredentialsException异常。鉴权时,将用户名封装成PrincipalCollection对象作为参数,调用doGetAuthorizationInfo方法,返回一个AuthorizationInfo,不像认证过

6、程的自动比对密码,这里不会自动比对权限,而是交给用户自己判断,因为权限有很多种比对方式,如全部包含、部分包含等各种情况(web环境会自动比对权限)。shiro配置1、pom.xml引入依赖: junit junit 4.12 test org.apache.shiro shiro-core 1.4.0 commons-logging commons-logging 1.2 2、新建shiro_custom.ini放到classpath下:内容:customRealm=com.test.shiroTest.realms.MyRealmsecurityManager.realms=$customR

7、ealm这里类似于spring配置,通过$符号引用上面的customRealm。3、log4j.properties放到classpath下:内容:log4j.rootLogger=debug,stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d%p%c-%m%n4、新建自定义Realm文件MyRealm.java

8、自定义realm一般继承AuthorizingRealmMyRealm.javaimport java.util.ArrayList;import java.util.List;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.SimpleAuthenticationInfo;imp

9、ort org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;publicclass MyRealm extends AuthorizingRealm Override protected AuthenticationInfo doGetAuthentication

10、Info(AuthenticationToken token) throws AuthenticationException System.out.println(-doGetAuthenticationInfo-); / 模拟查找用户 if (!,zhangsan,lisi,wangwu,.contains(token.getPrincipal().toString() / 返回null表示没有找到用户 returnnull; / 模拟数据库查询出的密码 String password = 123456; / 返回认证信息 SimpleAuthenticationInfo simpleAut

11、henticationInfo = new SimpleAuthenticationInfo(zhangsan, password, MyRealm); returnsimpleAuthenticationInfo; Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) System.out.println(-doGetAuthorizationInfo-); / 获取身份信息 String username = (String) principals.getPri

12、maryPrincipal(); / 根据身份信息从数据库中查询权限数据 / .这里使用静态数据模拟 Listpermissions = new ArrayList(); permissions.add(user:create); permissions.add(user:delete); / 将权限信息封装装为AuthorizationInfo SimpleAuthorizationInfosimpleAuthorizationInfo = new SimpleAuthorizationInfo(); for (String permission : permissions) simpleA

13、uthorizationInfo.addStringPermission(permission); returnsimpleAuthorizationInfo; 5、创建测试程序:AuthenticationTest.java:import java.util.Arrays;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.UsernamePasswordToken;importorg.apache.s

14、hiro.config.IniSecurityManagerFactory;import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.subject.Subject;import org.apache.shiro.util.Factory;import org.junit.Test;publicclass AuthenticationTest Test publicvoid test2() / 从ini文件中创建SecurityManager工厂 Factoryfactory = newIniSecurityMana

15、gerFactory(classpath:shiro_custom.ini); / 创建SecurityManager SecurityManager securityManager = factory.getInstance(); / 将securityManager设置到运行环境 SecurityUtils.setSecurityManager(securityManager); / 创建主体对象 Subject subject = SecurityUtils.getSubject(); / 对主体对象进行认证 / 用户登陆 / 设置用户认证的身份(principals)和凭证(crede

16、ntials) UsernamePasswordToken token = new UsernamePasswordToken(zhangsan, 123456); try subject.login(token); catch (AuthenticationException e) e.printStackTrace(); / 用户认证状态 Boolean isAuthenticated = subject.isAuthenticated(); System.out.println(用户认证状态: + isAuthenticated); / 用户授权检测基于角色授权 / 是否有某一个角色 S

17、ystem.out.println(用户是否拥有一个角色: + subject.hasRole(role1); / 是否有多个角色 System.out.println(用户是否拥有多个角色: + subject.hasAllRoles(Arrays.asList(role1, role2); / subject.checkRole(role1); / subject.checkRoles(Arrays.asList(role1, role2); / 授权检测,失败则抛出异常 / subject.checkRole(role22); / 基于资源授权 System.out.println(是否

18、拥有某一个权限: + subject.isPermitted(user:delete); System.out.println(是否拥有多个权限: + subject.isPermittedAll(user:create:1, user:delete);/ / 检查权限/ subject.checkPermission(sys:user:delete);/ subject.checkPermissions(user:create:1, user:delete); 输出:使用IniRealm:当使用IniRealm时,它自己实现了doGetAuthenticationInfo方法和doGetAu

19、thorizationInfo方法,认证时,它会到配置文件中查找用户,返回含有密码的AuthenticationInfo。,鉴权时,它会从配置文件中去查询用户权限返回。因此IniRealm可以看成了自定义Realm的一个实现特例。使用配置:不需要新建Realm类了。1、新建shiro.ini,内容:users#用户zhang的密码是123,此用户具有role1和role2两个角色zhang=123,role1,role2wang=123,role2roles#角色role1对资源user拥有create、update权限role1=user:create,user:update#角色role2

20、对资源user拥有create、delete权限role2=user:create,user:delete#角色role3对资源user拥有create权限role3=user:create2、认证的测试程序同上认证的测试程序同上,只用把ini文件改成shiro.ini即可。如果用户不存在,login会抛异常:如果密码不正确,会抛异常:认证流程分析其中的核心是securityManager。subject其实是由securityManager创建的。SecurityUtils.getSubject()时会调用securityManager去创建subject。而subject的login也是调

21、用了securityManager的login1、调用ModularRealmAuthenticator.doAuthenticate方法。进入securityManger.login方法,可以看到securityManager有一个Authenticator接口成员,它的实现是ModularRealmAuthenticator。而login最终调用到了AbstractAuthenticator的authenticate方法上AbstractAuthenticator的doAuthenticate是个抽象方法,在ModularRealmAuthenticator实现。2、调用Authentic

22、atingRealm的getAuthenticationInfo查询用户信息,如果不存在就抛异常。(realms是ModularRealmAuthenticator的成员变量)3、AuthenticatingRealm调用子类的doGetAuthenticationInfo方法查询用户,校验密码进入到realm的查询里面:它会先根据用户名去查询用户info,如果info不为null,就调用assertCredentialsMatch验证密码,验证失败就抛异常。如果为null或者验证通过,都会返回info。先看查询用户:这里由于是从ini文件中读取,所以用的IniRealm。再看验证密码:使用散

23、列算法(MD5)散列算法概念散列算法也叫Hash算法,用于将一段文本生成摘要信息,不可逆,常用的有MD5、sha等。散列算法可以通过存储海量明文和密文对应表穷举的方式破解简单密码,因此密码最好不要设置成简单的123456、111111等。通常会对每一个密码生成一个随机字符串salt,再将明文+salt加密,可以提高破解难度。shiro已有封装的用salt进行MD5加密的类,如:Testpublicvoid test2() System.out.println(new Md5Hash(111111, eteokues, 1).toString(); System.out.println(new

24、SimpleHash(MD5, 111111, eteokues, 1).toString(); / 都输出cb571f7bd7a6f73ab004a70322b963d5其中111111明文,eteokues是salt,1代表加密1次。通过源码可以看出,Md5Hash构造函数其实调用了SimpleHash,它会根据传入的不同散列算法名字进行加密。在realm中使用shiro.ini配置:#定义凭证匹配器credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher#散列算法credentialsMat

25、cher.hashAlgorithmName=md5#散列次数credentialsMatcher.hashIterations=1#定义自定义realmcustomRealm=com.test.shiroTest.realms.MyRealm#将凭证匹配器注入到自定义realm上customRealm.credentialsMatcher=$credentialsMatchersecurityManager.realms=$customRealm其中配置了一个凭证匹配器,定义了凭证匹配器的散列算法和散列次数然后定义一个自定义realm,然后将凭证匹配器注入到realm上。配置凭证匹配器的原因

26、是告诉shiro加密方式,它会将用户传入的明文password加密后同返回的SimpleAuthenticationInfo中的密码进行比对。MyRealm.java:import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.SimpleAuthenticationInfo;import o

27、rg.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.apache.shiro.util.ByteSource;publicclass MyRealm extends AuthorizingRealm Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollect

28、ion principals) / TODO Auto-generated method stub returnnull; Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException System.out.println(userCode= + token.getPrincipal(); / 模拟查找用户 if (!zhangsan.equals(token.getPrincipal() returnnull; /

29、模拟数据库查询出的密码 String password = cb571f7bd7a6f73ab004a70322b963d5; String salt = eteokues; / 盐 / System.out.println(new Md5Hash(111111, eteokues, 1).toString(); / 输出cb571f7bd7a6f73ab004a70322b963d5 / 返回认证信息 SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(zhangsan, password, ByteSource.Util.bytes(salt), getN

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1