1.认证与授权
认证:Authentication指的是分辨用户是谁?
授权:Authorization指的是认证后的用户具有那些权限。
2.RBAC模型
RBAC模型指的是基于角色的权限管理。通常通过用于与角色关联、角色与权限进行关联来进行管理实现。通过角色关联权限,可在一定长度上降低权限管理的难度。
3.Session-Cookie认证
Session-Cookie认证授权指的是在Session和Cookie会话中,通过维系一个SessionId来证明用户的身份唯一性。
1.执行流程
1、客户端请求服务端,服务端生成SessionId,并将其通过Cookie的形式发送给客户端;
2、客户端存储Cookie信息,每次请求时携带该Cookie中的SessionId即可。
3、服务端获取请求中的SessionId,与Redis中的记录进行比对。
2.分布式实现
单节点部署中,不用管考虑SessionId的唯一性。但在分布式环境中,必须考虑多台服务器中SessionId的唯一性。
方案一:
负载均衡合理分配。Nginx负载均衡时、通过Hash来将用户分散到包含该用户信息的同一台服务器上,依次来避免SessionId不同步性问题。(服务宕机则丢失SessionId)
方案二:
多台服务之间同步SessionId,但这种需要一定的同步成本。
方案三:
设立独立可访问的Session存储服务,各个结点均可共享该服务。
3.Session必须依赖Cookie?
未必,SessionId不仅可以通过Cookie进行存储,也可以通过URL进行传输。
4.Cookie为何无法防范CRSF?
Cookie在客户端存储SessionId,攻击者可以通过客户端的Cookie获取到用户的SessionId信息,发起攻击。
Token通常存储在localStorage中,攻击者难以获取到用户身份的Token信息。
4.Jwt&Token认证
Token指的是用户身份令牌。
Jwt是一种基于Token的、更加规范化的JSON令牌,包含Header、Payload、Signature三部分
1、Header(头):包含类型及其加密算法
2、Payload(有效载荷):包含用户数据的主体部分
3、Signature(签名):使用Header中的加密算法,和Secret秘钥对Header和Payload进行加密
Jwt更加是对Session和Cookie的一种用户功能优化
1.Jwt防止篡改?
服务端在接受到Jwt后、会根据Header、Payload等重新生成一个秘钥、通过该秘钥与旧的Jwt进对比、一致则未被篡改。
5.Shiro框架
Shiro是一个简单灵活的轻量级安全认证与授权框架、可通过简单快速的进行集成开发。
1.核心架构
1.Subject:主体、及当前登录的用户
2.Security Manager:Shiro的核心安全管理器、管理内部组件实例、并对外提供服务
3.Authorizer:认证器、Shiro进行身份认证
4.Authenticator:授权器,Shiro进行用户授权
5.Realm:域,Shiro中认证授权等的核心组成
6.Session Manger:指的是会话管理
2.Authentication认证流程
1.Subject.login(token)进行登录、然后将其委托给Security Manager
2.Security Manager再将其委托给Authentication进行认证
3.Authentication内部中通过Strategy和Realm进行认证
3.Authorization授权流程
Shiro中提供了三种授权方式、一种是基于编程式的授权方式、一种是基于注解的授权方式、另一种是用户JSP等的标签形式
1.编程式
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有权限
} else {
//无权限
};
1.注解式
@RequiresRoles("admin")
public void hello() {
//有权限
};