读码农翻身之安全

1、JAAS
Java Authentication Authorization Service,简称JAAS,属于jdk的标准包的一部分。然而用的人却不多。

2、认证与授权
认证就是确定你是谁,通常需要验证对方提供的用户名和密码。授权就是确定你能做什么,比如能否创建账号,能否删除用户等等。

3、替换JAAS的JSecurity:
读码农翻身之安全
从以上的代码来看,通过用户名和密码登录后,会返回一个token,然后使用这个token进行了登录的操作, 然后就能判断当前用户是否属于admin的这个角色,判断当前用户是否如果删除用户的权限。
(以这种思路,如果要自己来做的话,首先用户肯定是有一张用户表的,然后还需要有一张角色表,角色与用户关联关系表,权限表,角色与权限关联关系表。通过添加各种表的关系,来实现认证。而且这种安全系统,最好单独独立出一个网元来做,而不是放在本地服务中。)

角色可以简单的认为是一个权限的集合。有意思的是,如上述所示的user:delete,这其实是定义的一种权限符号规则,格式如下所示:
读码农翻身之安全读码农翻身之安全
4、JSecurity是去哪里验证用户名、密码、角色、权限?
如果以我个人的观点,这些信息都是保存到数据库中的,而如果JSecurity没有把这些信息保存到数据库,那么难道是保存在内存?不可能保存到内存!程序重启就没有了。那么如果这样的话,还是有较大可能是通过某种规律去做到权限控制的。比如通配符这种?

读码农翻身之安全
认证过程如下:
1、应用配置使用JDBCRealm
2、应用告诉JSecurity怎么从用户表中根据用户名获取到password
3、用户执行subject.login操作,JSecurity使用SQL进行查询,匹配用户名和密码
4、然后通过用户名获取到角色。

5、JSeurity后面更名为Shiro。

再来梳理下Shiro是如何做到认证的。
1、代码示例如下所示:
读码农翻身之安全
首先第一步是获取到了一个Subject,为什么叫Subject而不叫User呢?因为来认证的有可能是用户,也有可能是程序,所以叫做Subject

2、Shiro去哪里验证这些用户名、密码、权限、角色?
对于每个应用来说,这些安全相关的数据保存的地方可能都不一样,可能在文本文件中、数据库中、LDAP服务器中,数据格式也不尽相同,有的把用户叫做user,有的可能叫做username…而Shiro作为一个框架,抽象出来一个概念,叫做Realm。这个Realm是一个接口,就像一座桥梁,把应用程序特定的数据和Shiro框架能理解的格式联系起来。可以把用户应用特有的数据安全转化为Shiro能理解的格式。
读码农翻身之安全
那是不是意味着每个应用都得提供一个独特的JDBCRealm/LDAPRealm/IniRealm这样的实现类呢?不是的,而且显然这样不合理,比如:如果有个应用程序,使用的数据库保存用户名和密码,那么只需要提供一个sql给JDBCRealm,框架就可以自动完成认证。(也就是说,其实数据还是保存在数据库等媒介中,而框架抽象出来一个Realm,这个Realm的目的是为了从这些媒介中获取到数据信息。)
读码农翻身之安全

个人理解:以Shiro这种框架管理,假如有多个应用都有自己的用户角色,框架作为认证。不如所有应用都去连接一个认证系统,这个认证系统使用shiro来进行权限管控,其他应用在做操作之前,先调用认证网元,如果通过了,才能进行实际的逻辑操作。

Realm:域的意思。负责访问安全认证数据。shiro框架并不存在安全认证数据,安全认证数据需要用户自己存储。shiro支持很多的Realm实现,也就是说安全认证数据我们可以放到数据库中,也可以放到文件中等等。可以把realm理解为以前web项目的dao层。