随记shrio
第一记:shrio之身份认证(Authentication或Authenticator)之默认配置INITREALM
第一步:导入jar包
第二步:配置SecurityManager,这个SecurityManager可以放认证所需要的认证域,不用Spring-boot,那么就需要用工厂的方式产生SecurityManager.示例:
Factory<SecurityManager> factory = new InitSecurityManagerFactory("classpath:shrio.ini");
SecurityManager securityManager = factory.getInstance();
第三步:SecurityUtils对SecurityManager进行了封装。示例:
SecurityUtils.setSecurityManger(securityManager);
第四步:获取用户:Subject ,示例
Subject subject = SecurityUtils.getSubject();
第五步:用户登入:示例,在登入过程中会抛出账户异常和密码不匹配异常。
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("taodewei","123456");
subject.login( usernamePasswordToken);
第六步:用户和密码自动认证,怎样证明有没有自动认证,打印的是布尔值。
System.out.println(subject.isAuthenticated());
第七步:退出登入:subject.logout();
第八步:总结,以上的步骤没有出现SecurityManager,Authenticator,Authentication strategy,Realm对象。其实这些都在shrio.ini配置文件中默认配置呢。默认配置是可以进行省略的,如下图所示:
第二记:shrio之身份认证(Authentication或Authenticator)之默认配置JDBCREALM
第一步:导入jar包
第二至第七步都是一样的
第八步:不一样,因为需要指定域,默认是INIRealm.还需要指定数据源,以及特定的数据库,表明和查询字段,因此需要对shrio.ini进行配置,配置模版如下所示:
第三记:shrio之身份认证之定义Realm的配置
第一步:到jar包
第二步:自定义Realm类,这里定义一个自定义的PropertiesRealm类,该类需要继承AuthorizingRealm类。其次复写父类里面的两个方法,目前认证只用到了其中的一个方法。具体的实现如下所示:首先看如下两个方法,如图所示
下面是在doGetAuthenticationInfo加入自己的逻辑代码
上面的两段代码在同一个方法里面
第三步:就是配置文件的配置:如下图所示:
第四记:shrio之认证策略
针对多个Realm的时候涉及到了认证策率的问题,如下图所示:
其次,就是在配置文件里面,配置认证策略以及将配置策略放入到认证器里面,其次再将认证器放入到SecurityManager中。配置文件如下所示:
第五记:shrio之加密技术之编码/解码
一般编解码的技术有base64以及十六进制,以下一次讲解:
Base64编解码
base64编码示例:如下图所示:
上图中的原文是字符串hello,经过Base64之后的aGVsbG8=
Base64解码示例:如下图所示:
如上图所示,Base64解码后的字符串经过解码之后,又变成了明文Hello.
十六进制的编解码
十六进制编码:示例如下图所示:
如上图所示:十六进制编码之后,原文hello变成了68656c6c6f.
十六进制解码:示例如下图所示:
如上图所示,十六进制解码后的字符串经过解码之后,又变成了明文Hello.
第六记:shrio之加密技术之MD5与SHA,MD5和SHA都属于散列算法
MD5加密技术
md5工具类的构造函数有三个构造函数,每个构造函数都对应了一种加密方式,第二种方式加盐了,提高密码的安全行,防止MD5反解密。具体三个构造函数的使用,如下所示:
上图就解释了MD5的三种加密方式。s1没有加盐,s2加盐,s3加盐并且加了散列的次数。
SHA加密:其实SHA有很多种情况,例如sha1 sha25 sha384 sha512,后面数字代表了加密的字符串序列的长度。其次SHA的加密过程和MD5类似。
下图是SHA的加密示例:
上图加密后的结果就可以看出,sha后面的数字越长,那么它的加密后的字符串就越长。
第七记:shrio之加密技术通用工具类
如果在代码里面写死具体使用那种方法来进行加密,如果以后需要进行修改的时候,就需要对类进行修改,这就违背了内闭外开的原则。因此,一个通用的加密工具类产生了,你选择的那种加密类型,可以通过控制反转传入到你需要的算法类型。因此,当你需要修改加密类行的时候,就不需要进行代码的修改了,具体的代码示例如下图所示:
关于通用工具的控制反转在下面的加密和密码匹配种体现。
第八记:shrio之加密服务接口
shrio提供了服务接口,也提供了接口默认的实现类,也支持自定义实现类,下面就是基于默认的实现类和自定义类的使用,具体如下图所示
上面注释就是使用了默认的加密方式,下面没有注释就是使用了自定义的加密和密码匹配方式,自定的实现类如下图所示:
上面图中的密码匹配的写法是 return encryptPassword(plaintextPassword).equals(encryted);
第九记:shrio之密码匹配器(CredentialsMatcher)
这个接口以及接口的实现类不是供外部服务使用的。默认的主要实现类,如下图所示:
举例:如果在开发的接口没有指明密码匹配器,那么就使用默认的密码匹配器,然后默认的密码匹配器是用原文密码和加密后的密码直接进行匹配的,从而会导致错误。因此在开发的过程中一般需要指定密码匹配器。
自定义密码匹配器
第一步,就是配置文件:如下图所示:
第二步:按照上面jdbcRealm的写法写代码,然后就会自动进行将明文加密后再与数据库中的密码相匹配了。如果不再配置文件指定匹配器,那么就会使用默认的匹配器,默认的匹配器就会用原文密码和加密后的密码进行匹配,最后就会报错,匹配不成功。指定了密码匹配器以及密码匹配器使用的加密算法类型,以上是针对不带盐值的加密匹配,如果带盐值的匹配就复杂一点。
第三步:针对带盐值的密码匹配,首先要自定义密码匹配器,其次就是定义密码匹配器使用的算法,其次就是设置散射的次数,以及修改数据库的查询语句,查询出来的语句是需要带盐值的。最后还是自定义jdbcsaltRealm 继承JdbcRealm修改默认的盐值类型。最后自定义的域需要配置在配置文件中,具体的下面的图片:
图片一:自定义的JdbcSaltRealm类
图片二:在配置文件里面配置自定义的域
图片三:重写sql
图片四:定义匹配器的属性
上图中的false表示使用Hex:十六进编码
图片五:登入类
第四步,以上的认真是针对盐存在数据库中的认证模式,如果盐是公共盐,只在用户登入的时候,进行通过手动的加密处理,然后登入成功后,返回了一个token给用户,然后登入系统后面的每次一操作都用shrio来做用户的认证,此时的认证只根据用户传过来的值,判断redis中是否有值,如果有之说明该用户正确,如果为空,说明就没有,返回token失效。其实这里就是用到了shrio的拦截器的作用,针对每一次调用都进行了拦截。但是此拦截器要排除登入之外(“annon”).这段理解来自于项目。
shrio之授权
第一步:权限:主要是对数据库的增删改查,其次就是角色概念:角色其实是一些权限的集合。
第二步:系统的表结构:
第三步:就是权限认证的流程,如下图所示:
第四步:写了一个简单的案例,基于角色的:使用了默认的Realm
第五步:先介绍对权限访问的一些基本概念,如下图所示:
第六步:写了一个简单的案例,基于权限的:使用了默认的Realm,在上面的案例中进行了补充。如下图所示:
第七步:上面的代码都是基于如下的配置文件
第八步:基于jdbcRealm的权限的认证,在该认证里面,首先自己需要建立五张表:用户表,权限表,角色表,用户角色表,权限角色表。然后需要配置初始化文件,初始化文件主要是需要重写角色查询语句,开启权限功能,其次就是,重写权限查询语句。具体步骤如下面的图片所示:
图片一:在之前用户认证的配置文件里面添加如果所示的配置:
图片二:就是用户调用权限认证的代码
图片三:是JdbcRealm源码里面的一段代码,就返回SimpleAuthorizationInfo:里面放了权限字符串。
上述图片三需要和项目中的代码做下比较。这里里面还可以放入set的集合。集合里面是字符串,权限字符串,然后项目里面的controller层只需要加入注解。