shiro权限控制

shiro权限控制

 

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
 
权限控制的方式
 
从类别上分,有两大类:
- 认证:你是谁?–识别用户身份。
- 授权:你能做什么?–限制用户使用的功能。
 
权限的控制级别
 
从控制级别(模型)上分:
- URL级别-粗粒度
- 方法级别-细粒度
- 页面级别-自定义标签(显示)
- 数据级别-最细化的(数据)
 
URL级别的权限控制-粗粒度
 
在web.xml中配置一个过滤器filter,在过滤器中,对请求的地址进行解析,字符串截取:
url.substring()…把上下文前面的路径都截取掉,剩下user_login.action。
过滤器代码:
以通过查询数据库,来判断,当前登录用户,是否可以访问user_login.action。
url级别控制,每次请求过程中只控制一次 ,相比方法级别权限控制 是粗粒度的 !URL级别权限控制,基于Filter实现。
 
方法级别的权限控制-细粒度
 
aop面向切面的编程,在方法执行之前,进行权限判断,如果没有权限,抛出异常,终止方法的继续运行。
自定义注解 在需要权限控制方法上, 添加需要的权限信息
代理 (Spring AOP ),在目标方法运行时 进行增强 ,通过反射技术获取目标方法上注解中权限 , 查询数据库获取当前登陆用户具有权限,进行比较。
相比URL级别权限控制, 可以控制到服务器端执行的每个方法,一次请求中可以控制多次。
 
页面(显示)级别的权限控制-自定义标签
 
页面显示的权限控制,通常是通过 自定义标签来实现
 
数据级别的权限控制
 
在每条数据上增加一个字段,该字段记录了权限的值。数据和权限绑定。
代码,你在查询数据的时候,需要去权限和用户对应表中,通过当前登录用户的条件,查询出你的数据权限。然后再将数据权限作为一个条件,放到业务表中进行查询。从而限制了数据的访问。
 
权限系统的数据表设计
 
· 资源:用户要访问的目标,通常是服务中的程序或文件
· 权限:用户具有访问某资源的能力
· 角色:权限的集合,为了方便给用户授权。
· 用户:访问系统的’人’。
表对象实体:
- 用户(User)表:访问系统的用户,比如用户登录要用
- 权限(Function)表:系统某个功能允许访问而对应的权限
- 角色(Role)表:角色是权限的集合(权限组),方便用户授权。
表对象之间的关系:
- 用户和角色关系表:一个用户对应N个角色,一个角色可以授予N个用户—》多对多关系
- 角色和权限关系表:一个角色包含N个权限,一个权限可以属于N个角色—》多对多关系
完整的权限相关表:
URL级别权限控制包含:资源表、权限表、角色表、用户表,以及相关关系(都是多对多),共7张表。
方法级别的权限控制包含:功能权限、角色、用户,以及相关关系(都是多对多),共5张表。
但Apache Shiro框架支持的URL级别权限控制,是将资源和资源权限对应关系配置到了配置文件中,不需要表的支撑,只需要5张表了。
 
Apache Shiro权限控制
 
Apache Shiro 可以不依赖任何技术使用, 可以直接和web整合,通常在企业中和Spring 结合使用。
Authentication: 认证 — 用户登录
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名字的权限。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值