Shiro学习笔记(一)

Shiro学习笔记(一)

Shiro 是当下常见的安全框架,主要用于用户验证和授权操作。

SHIRO 入门

Shiro 概念:在使用Shiro 之前,大家做登录,权限什么的都是五花八门,各种花里胡哨的代码,不同系统的做法很有可能千差万别。
但是使用 Shiro 这个安全框架之后,大家做权限的方式都一致化了,这样的好处就是你的代码我看起来容易,我的代码你也好理解。
Shiro 也比较成熟,基本上能满足大部分的权限需要。
在 Shiro 入门 中使用ini 配置文件进行了相关权限数据的配置。 在这里面定义和安全相关的数据: 用户,角色和权限,例如:

#定义用户
[users]
#用户名 zhang3  密码是 12345, 角色是 admin
zhang3 = 12345, admin
#用户名 li4  密码是 abcde, 角色是 产品经理
li4 = abcde,productManager
#定义角色
[roles]
#管理员什么都能做
admin = *
#产品经理只能做产品管理
productManager = addProduct,deleteProduct,editProduct,updateProduct,listProduct
#订单经理只能做订单管理
orderManager = addOrder,deleteOrder,editOrder,updateOrder,listOrder

但是实际工作中,我们都会把权限相关的内容放在数据库里。 所以本知识点讲解如何放在数据库里来撸。

数据库支持

RBAC 概念:
RBAC 是当下权限系统的设计基础,同时有两种解释:
一: Role-Based Access Control,基于角色的访问控制
即,你要能够删除产品,那么当前用户就必须拥有产品经理这个角色
二:Resource-Based Access Control,基于资源的访问控制
即,你要能够删除产品,那么当前用户就必须拥有删除产品这样的权限
基于 RBAC 概念, 就会存在3 张基础表: 用户,角色,权限, 以及 2 张中间表来建立 用户与角色的多对多关系,角色与权限的多对多关系。 用户与权限之间也是多对多关系,但是是通过 角色间接建立的。

注: 补充多对多概念: 用户和角色是多对多,即表示:
一个用户可以有多种角色,一个角色也可以赋予多个用户。
一个角色可以包含多种权限,一种权限也可以赋予多个角色

然后在DAO层中提供和权限相关查询
Realm 概念:在 Shiro 中存在 Realm 这么个概念, 当应用程序向 Shiro 提供了 账号和密码之后, Shiro 就会问 Realm 这个账号密码是否对, 如果对的话,其所对应的用户拥有哪些角色,哪些权限。
所以Realm 是什么? 其实就是个中介。 Realm 得到了 Shiro 给的用户和密码后,有可能去找 ini 文件,就像Shiro 入门中的 shiro.ini,也可以去找数据库,就如同本知识点中的 DAO 查询信息。
Realm 就是干这个用的,它才是真正进行用户认证和授权的关键地方。

DatabaseRealm:DatabaseRealm 就是用来通过数据库 验证用户,和相关授权的类。
两个方法分别做验证和授权:
doGetAuthenticationInfo(), doGetAuthorizationInfo()

 DatabaseRealm 这个类,用户提供,但是不由用户自己调用,而是由 Shiro 去调用。 就像Servlet的doPost方法,是被Tomcat调用一样。
加密

md5 加密:如果密码是明文的,这样是有巨大风险的,一旦泄露,就不好了。
所以,通常都会采用非对称加密,什么是非对称呢?就是不可逆的,而 md5 就是这样一个算法.
例如123 用 md5 加密后,得到字符串: 202CB962AC59075B964B07152D234B70
这个字符串,却无法通过计算,反过来得到源密码是 123.
这个加密后的字符串就存在数据库里了,下次用户再登陆,输入密码 123, 同样用md5 加密后,再和这个字符串一比较,就知道密码是否正确了。
如此这样,既能保证用户密码校验的功能,又能保证不暴露密码。

盐:上面讲了md5加密,但是md5加密又有一些缺陷:

  1. 如果我的密码是 123,你的也是 123, 那么md5的值是一样的,那么通过比较加密后的字符串,我就可以反推过来,原来你的密码也是123.
  2. 与上述相同,虽然 md5 不可逆,但是我可以穷举法呀,我把特别常用的100万或者更多个密码的 md5 值记录下来,比如12345的,abcde的。 相当一部分人用的密码也是这些,那么只要到数据库里一找,也很快就可以知道原密码是多少了。这样看上去也就破解了,至少一部分没有想象中那么安全吧。
    为了解决这个问题,引入了盐的概念。 盐是什么意思呢? 比如炒菜,直接使用md5,就是对食材(源密码)进行炒菜,因为食材是一样的,所以炒出来的味道都一样,可是如果加了不同分量的盐,那么即便食材一样,炒出来的味道也就不一样了。

所以,虽然每次 123 md5 之后都是202CB962AC59075B964B07152D234B70,但是 我加上盐,即 123+随机数,那么md5值不就不一样了吗? 这个随机数,就是盐,而这个随机数也会在数据库里保存下来,每个不同的用户,随机数也是不一样的。
再就是加密次数,加密一次是202CB962AC59075B964B07152D234B70,我可以加密两次呀,就是另一个数了。 而黑客即便是拿到了加密后的密码,如果不知道到底加密了多少次,也是很难办的。

有了以上基础,那么就可以开始在原来的教程里加入对加密的支持了。 在开始之前,要修改一下user表,加上盐 字段: salt。
因盐是随机数,得保留下来,如果不知道盐巴是多少,我们也就没法判断密码是否正确了,在DAO中增加两个方法 createUser,getUser
createUser 用于注册,并且在注册的时候,将用户提交的密码加密
getUser 用于取出用户信息,其中不仅仅包括加密后的密码,还包括盐
修改 DatabaseRealm,把用户通过 UsernamePasswordToken 传进来的密码,以及数据库里取出来的 salt 进行加密,加密之后再与数据库里的密文进行比较,判断用户是否能够通过验证。

SHIRO 如何集成到WEB中

修改web.xml,在里面加了个过滤器。 这个过滤器的作用,简单的说,就是 Shiro 入门里的运行的主类这部分的工作,悄悄的干了
在jsp和servlet中编写前端和后端。然后根据 shiro.ini 里的配置信息去操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值