1.什么是权限管理?
只要用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.
対权限的管理分为两大类别:
- 用户认证
- 用户授权
1.用户认证:
用户认证,用户去访问系统,系统要验证用户身份的合法性
最常用得到用户身份验证得到方法, 1, 用户密码方式, 2,指纹打卡机, 3,基于验证书验证方法 系统验证用户身份之后,用户可以访问系统的资源
用户认证的流程:
- 判断该资源是否能不认证就能访问[登录页面, 首页]
- 如果该资源需要认证之后才能访问,那么判断该访问者是否认证了.
- 如果还没有认证,那么需要返回到[登录页面],用户输入认证信息 后 进行认证
- 真正通过后才能访问资源
从用户认证中可以抽取出几个概念(术语)
- subject主体: 理解为用用户,可能是程序(比如naviccat去连接数据库,) ,都需要访问系统的资源你,系统需要对subject进行身份认证**,通常得到讲为当前用户**
- principal身份信息: 通常是唯一的,一个主体还可以有多个身份信息,但是都有一个主身份信息(primary prinncipal) [我们可以选择身份证认证,学生证认证等等都是我们的身份信息] —>当前的用户的账号***
- credential凭证信息: 可以是密码,证书,指纹. ----------->密码
1.2用户授权
用户授权 ,简单理解为访问控制,在用户认证通过后,系统对用户访问资源进行控制,用户具有资源的访问权限才可以访问.
用户授权的流程:
- 用户认证通过后,到达了用户授权环节,
- 用户访问资源,系统需要判断用户胡是否有权限去操作该资源.
- 有权限才能够访问,没有权限就不能访问了 异常:401(认证失败) 403(无权限)
授权额过程简单理解为:主体认证之后,系统进行访问控制,subject 必须具备资源的访问权限才可以访问该资源.
分配权限有两种形式:
- 基于角色的权限访问控制RABC (role- based - access controller)
是以角色为中心进行的访问控制,也就是判断主体,sbuject是哪个角色的方式进行权限的访问控制.是粗粒度的.
-
基于资源的权限访问控制PBAC (resource - based access control)
是以资源为中心进行的访问控制,只需要为角色添加权限就可以.![在这里插入图片描述](https://img-blog.csdnimg.cn/20200729102541600.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25ubm5ubm5ubm5paQ==,size_16,color_FFFFFF,t_70)
权限五张表是基于sql的, 只是一个模型,shiro与 权限模型只是相似却不同, 可以把权限模型当成一个数据源.
2.什么是shiro?
shiro是一个功能强大打,易于使用的java安全框架,可以执行身份验证,授权,加密和会话管理.通过shiro易于理解的API,您可以做到这一点快速、轻松地保护任何应用程序——从最小的移动应用程序到最大的we和企业应用程序。
2.1 shiro架构?
Subject:主体,代表了当前 “用户”,这个用户不一定是一个具体的人,
与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等;即一个抽象概念;
所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给
SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者;
SecurityManager:安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;
且它管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互,
如果学习过 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;
Realm:域,Shiro 从从 Realm 获取安全数据(如用户、角色、权限),
就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的
用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的
角色 / 权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource,即安全数据源。
2.2 shiro的认证
1.新建maven工程导入以下依赖
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.1</version>
</dependency>
<!-- configure logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
2. 在resource文件夹下条件log4j.properties
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n
# General Apache libraries
log4j.logger.org.apache=WARN
# Spring
log4j.logger.org.springframework=WARN
# Default Shiro logging
log4j.logger.org.apache.shiro=INFO
# Disable verbose logging
log4j.logger.org.apache.shiro.util.ThreadContext=WARN
log4j.logger.org.apache.shiro.cache.ehcache.EhCache=WARN
3.新建QuickStart类