一、权限概述:
1、什么是权限
①权限管理:一般指根据系统设置的安全策略或者安全规则,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。
②权限管理分类:
- 访问权限
管理员有增删改查权限,普通用户只有查询权限。
- 数据权限
管理员可以看到所有员工信息,但是员工只能看到自己的信息。
2、认证概念
2.1什么是认证
身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和密码,看其是否与系统中存储的该用户的用户名和密码一致,来判断用户身份是否正确。例如:密码登录,手机短信验证、三方授权等。
2.2认证流程
2.3关键对象
上边的流程图中需要理解以下关键对象:
①Subject:主体:访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体;
②Principal:身份信息是主体(subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(Primary Principal)。
③credential:凭证信息:是只有主体自己知道的安全信息,如密码、证书等。
3、授权概念
3.1什么是授权
①授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后,系统会为其分配对应的权限,当访问资源时,会校验其是否有访问此资源的权限。
②4个对象:
- 用户对象user:当前操作的用户、程序。
- 资源对象resource:当前被访问的对象。
- 角色对象role:一组"权限操作许可权"的集合。
- 权限对象permission:权限操作许可权。
3.2授权流程
3.3关键对象
授权可简单理解为who对what进行how操作
Who:主体(Subject),可以是一个用户,也可以是一个程序。
What:资源(Resource),如系统菜单、页面。按钮、方法、系统商品信息等。
访问类型:商品菜单,订单菜单,分销商菜单
数据类型:我的商品,我的订单,我的评价
How:权限/许可(Permission)
我的商品(资源)===》访问我的商品(权限许可)
分销商菜单(资源)===》访问分销商列表(权限许可)
二、Shiro概述
1、Shiro简介
1.1什么是Shiro
1.2、Shiro的特点
- · 易于理解的 Java Security API;
- · 简单的身份认证(登录),支持多种数据源(LDAP,JDBC 等);
- · 对角色的简单的签权(访问控制),也支持细粒度的鉴权;
- · 支持一级缓存,以提升应用程序的性能;
- · 内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;
- · 异构客户端会话访问;
- · 非常简单的加密 API;
- · 不跟任何的框架或者容器捆绑,可以独立运行。
2、核心组件
2.2 Subject
Subject主体,外部应用与subject进行交互,subject将用户作为当前操作的主体,这个主题:可以是一个通过浏览器请求的用户,也可能是一个运行的程序。Subject在是shiro中是一个接口,接口中定义了很多认证授权相关的方法,外部程序通过subject进行授权认证,而subject是通过SecurityManager安全管理器进行认证授权。
2.3 SecurityManager
SecurityManager权限管理器,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。SecurityManager是一个接口,继承了Authenticator,Authorizer,SessionManager这三个接口。
2.4 Authenticator
Authenticator即认证器,对用户登录时进行身份认证。
2.5 Authorizer
Authorizer授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。
2.6 Realm(数据库读取+认证功能+授权功能实现)
Realm领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据。
比如:如果用户身份数据在数据库那么Realm就需要从数据库获取用户身份信息。
注意:不要把Realm理解成只是从数据源取数据,在Realm中海油认证授权校验的相关代码。
2.7 SessionManager
SessionManager会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。
2.8 SessionDAO
三、Spring Security概述
1、含义:
Spring Security是一个灵活和强大的身份验证和访问控制框架,以确保基于Spring的Java Web应用程序的安全。它是一个轻量级的安全框架,它确保基于Spring的应用程序提供身份验证和授权支持。它与Spring MVC有很好地集成,并配备了流行的安全算法实现捆绑在一起。
安全主要包括两个操作“认证”与“验证”(有时候也会叫做权限控制)。“认证”是为用户建立一个其声明的角色的过程,这个角色可以一个用户、一个设备或者一个系统。“验证”指的是一个用户在你的应用中能够执行某个操作。在到达授权判断之前,角色已经在身份认证过程中建立了。
2、核心组件
2.1 Web/Http 安全:
这是最复杂的部分。通过建立 filter 和相关的 service bean 来实现框架的认证机制。当访问受保护的 URL 时会将用户引入登录界面或者是错误提示界面。
2.2 业务对象或者方法的安全:
控制方法访问权限的。
2.3 AuthenticationManager:
AuthenticationManager处理来自于框架其他部分的认证请求。
2.4 AccessDecisionManager:
AccessDecisionManager为 Web 或方法的安全提供访问决策。会注册一个默认的,但是我们也可以通过普通 bean 注册的方式使用自定义的 AccessDecisionManager。
2.5 AuthenticationProvider:
AuthenticationManager 是通过它来认证用户的。
2.6 UserDetailsService:
UserDetailsService跟 AuthenticationProvider 关系密切,用来获取用户信息的。
四、Shiro和Spring Security区别:
1、Shiro比Spring更容易使用,实现和最重要的理解。
2、Spring Security更加知名的唯一原因是因为品牌名称,“Spring”以简单而闻名,但讽刺的是很多人发现安装Spring Security很难,然而,Spring Security却有更好的社区支持。
3、Apache Shiro在Spring Security处理密码学方面有一个额外的模块。
4、Spring-security 对spring 结合较好,如果项目用的springmvc ,使用起来很方便。但是如果项目中没有用到spring,那就不要考虑它了。
5、Shiro 功能强大、且 简单、灵活。是Apache 下的项目比较可靠,且不跟任何的框架或者容器绑定,可以独立运行。