shiro权限控制
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
权限控制的方式
从类别上分,有两大类:
- 认证:你是谁?–识别用户身份。
- 授权:你能做什么?–限制用户使用的功能。
- 认证:你是谁?–识别用户身份。
- 授权:你能做什么?–限制用户使用的功能。
权限的控制级别
从控制级别(模型)上分:
- URL级别-粗粒度
- 方法级别-细粒度
- 页面级别-自定义标签(显示)
- 数据级别-最细化的(数据)
- URL级别-粗粒度
- 方法级别-细粒度
- 页面级别-自定义标签(显示)
- 数据级别-最细化的(数据)
URL级别的权限控制-粗粒度
在web.xml中配置一个过滤器filter,在过滤器中,对请求的地址进行解析,字符串截取:
url.substring()…把上下文前面的路径都截取掉,剩下user_login.action。
过滤器代码:
以通过查询数据库,来判断,当前登录用户,是否可以访问user_login.action。
url级别控制,每次请求过程中只控制一次 ,相比方法级别权限控制 是粗粒度的 !URL级别权限控制,基于Filter实现。
url.substring()…把上下文前面的路径都截取掉,剩下user_login.action。
过滤器代码:
以通过查询数据库,来判断,当前登录用户,是否可以访问user_login.action。
url级别控制,每次请求过程中只控制一次 ,相比方法级别权限控制 是粗粒度的 !URL级别权限控制,基于Filter实现。
方法级别的权限控制-细粒度
aop面向切面的编程,在方法执行之前,进行权限判断,如果没有权限,抛出异常,终止方法的继续运行。
自定义注解 在需要权限控制方法上, 添加需要的权限信息
代理 (Spring AOP ),在目标方法运行时 进行增强 ,通过反射技术获取目标方法上注解中权限 , 查询数据库获取当前登陆用户具有权限,进行比较。
相比URL级别权限控制, 可以控制到服务器端执行的每个方法,一次请求中可以控制多次。
自定义注解 在需要权限控制方法上, 添加需要的权限信息
代理 (Spring AOP ),在目标方法运行时 进行增强 ,通过反射技术获取目标方法上注解中权限 , 查询数据库获取当前登陆用户具有权限,进行比较。
相比URL级别权限控制, 可以控制到服务器端执行的每个方法,一次请求中可以控制多次。
页面(显示)级别的权限控制-自定义标签
页面显示的权限控制,通常是通过 自定义标签来实现
数据级别的权限控制
在每条数据上增加一个字段,该字段记录了权限的值。数据和权限绑定。
代码,你在查询数据的时候,需要去权限和用户对应表中,通过当前登录用户的条件,查询出你的数据权限。然后再将数据权限作为一个条件,放到业务表中进行查询。从而限制了数据的访问。
代码,你在查询数据的时候,需要去权限和用户对应表中,通过当前登录用户的条件,查询出你的数据权限。然后再将数据权限作为一个条件,放到业务表中进行查询。从而限制了数据的访问。
权限系统的数据表设计
· 资源:用户要访问的目标,通常是服务中的程序或文件
· 权限:用户具有访问某资源的能力
· 角色:权限的集合,为了方便给用户授权。
· 用户:访问系统的’人’。
表对象实体:
- 用户(User)表:访问系统的用户,比如用户登录要用
- 权限(Function)表:系统某个功能允许访问而对应的权限
- 角色(Role)表:角色是权限的集合(权限组),方便用户授权。
- 用户(User)表:访问系统的用户,比如用户登录要用
- 权限(Function)表:系统某个功能允许访问而对应的权限
- 角色(Role)表:角色是权限的集合(权限组),方便用户授权。
表对象之间的关系:
- 用户和角色关系表:一个用户对应N个角色,一个角色可以授予N个用户—》多对多关系
- 角色和权限关系表:一个角色包含N个权限,一个权限可以属于N个角色—》多对多关系
- 用户和角色关系表:一个用户对应N个角色,一个角色可以授予N个用户—》多对多关系
- 角色和权限关系表:一个角色包含N个权限,一个权限可以属于N个角色—》多对多关系
完整的权限相关表:
URL级别权限控制包含:资源表、权限表、角色表、用户表,以及相关关系(都是多对多),共7张表。
方法级别的权限控制包含:功能权限、角色、用户,以及相关关系(都是多对多),共5张表。
URL级别权限控制包含:资源表、权限表、角色表、用户表,以及相关关系(都是多对多),共7张表。
方法级别的权限控制包含:功能权限、角色、用户,以及相关关系(都是多对多),共5张表。
但Apache Shiro框架支持的URL级别权限控制,是将资源和资源权限对应关系配置到了配置文件中,不需要表的支撑,只需要5张表了。
Apache Shiro权限控制
Apache Shiro 可以不依赖任何技术使用, 可以直接和web整合,通常在企业中和Spring 结合使用。
Authentication: 认证 — 用户登录
Authorization : 授权 —- 功能权限管理
Authorization : 授权 —- 功能权限管理
通过引入Maven坐标导入shiro
官方建议:不推荐直接引入shiro-all,依赖比较多,原因怕有jar冲突。官方推荐根据需要单独导入jar。
Shiro基本原理
Shiro的框架的体系结构:
Shiro权限控制流程的原理:
· 应用代码 —- 调用Subject (shiro的Subject 就代表当前登陆用户) 控制权限 —- Subject 在shiro框架内部 调用 Shiro SecurityManager 安全管理器 —– 安全管理器调用 Realm (程序和安全数据连接器 )。
· Subject要进行任何操作,都必须要调用安全管理器(对我们来说是自动的)。
而安全管理器会调用指定的Realms对象,来连接安全数据。
· Realms用来编写安全代码逻辑和访问安全数据,是连接程序和安全数据的桥梁。
URL级别的权限控制配置整合和url级别认证
配置过滤器web.xml:放在struts的前端控制器之前配置,但放在openEntitymanage之后。
[XML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
<!-- shiro权限过滤器 -->
< filter >
<!-- 这里的 filter-name 要和 spring 的 applicationContext-shiro.xml 里的 org.apache.shiro.spring.web.ShiroFilterFactoryBean
的 bean name 相同 -->
< filter-name >shiroSecurityFilter</ filter-name >
<!-- spring的代理过滤器类:以前的过滤器 -->
< filter-class >org.springframework.web.filter.DelegatingFilterProxy</ filter-class >
< init-param >
<!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 -->
< param-name >targetFilterLifecycle</ param-name >
< param-value >true</ param-value >
</ init-param >
</ filter >
< filter-mapping >
< filter-name >shiroSecurityFilter</ filter-name >
< url-pattern >/*</ url-pattern >
</ filter-mapping >
配置ApplicationContext.xml:(shiro权限控制过滤器+ shiro安全管理器)
<!-- shiro权限控制过滤器bean -->
< bean id = "shiroSecurityFilter" class = "org.apache.shiro.spring.web.ShiroFilterFactoryBean" >
<!-- shiro 的核心安全接口 -->
< property name = "securityManager" ref = "securityManager" />
<!-- 要求登录时的链接 -->
< property name = "loginUrl" value = "/login.jsp" />
<!-- 登陆成功后要跳转的连接 -->
< property name = "successUrl" value = "/index.jsp" />
<!-- 未授权时要跳转的连接,权限不足的跳转路径 -->
< property name = "unauthorizedUrl" value = "/unauthorized.jsp" />
<!-- shiro 连接约束配置(URL级别的权限控制),即URL和filter的关系,URL控制规则:路径=规则名 -->
< property name = "filterChainDefinitions" >
< value >
<!--按需求配置-->
/login.jsp = anon
/validatecode.jsp = anon
/js/** = anon
/css/** = anon
/images/** = anon
/user_login.action* = anon
/page_base_staff.action = anon
/page_base_region.action = perms["user"]
/page_base_subarea.action = roles["operator"]
/** = authc
</ value >
</ property >
</ bean >
<!-- shiro安全管理器 -->
< bean id = "securityManager" class = "org.apache.shiro.web.mgt.DefaultWebSecurityManager" >
<!-- 注入 Realm连接安全数据-->
</ bean >
|
配置shiroFilter 其实是一个过滤器链,含有10个Filter(校验功能)。
常用:
认证
- anon不用认证(登录)就能访问(单词注意大小写)
- authc: 需要认证(登录)才能使用,例如/admins/user/**=authc,没有参数。
授权:
- perms:需要拥有某权限才能使用,如具体允许的权限:/page_base_region.action =perms[“user”],如果要访问该action,当前登录用户必须拥有user名字的权限。
认证
- anon不用认证(登录)就能访问(单词注意大小写)
- authc: 需要认证(登录)才能使用,例如/admins/user/**=authc,没有参数。
授权:
- perms:需要拥有某权限才能使用,如具体允许的权限:/page_base_region.action =perms[“user”],如果要访问该action,当前登录用户必须拥有user名字的权限。