Shior权限

一、概述

1、什么是权限管理?

答: 实现对用户访问系统的控制,用户只能访问自己被授权的资源。只要有用户名和密码的系统,权限管理都会出现。
举个例子: 答:给张三赋予 “人力资源经理”角色,该角色就具有“查询员工”,“添加员工”,“修改员工”,“删除员工”的权限。此时张三进入系统后,就有这些操作权限。

2 、shiro概述
  • Apache Shiro是Java的一个安全框架
  • 强大、小、简单易用,主要用来:便捷的认证、授权、加密、会话管理、与WEB集成、缓存等
  • Spring中的Spring Security也是一个权限框架,但是它和Spring的依赖过于紧密,是个重量级框架,没有Shior使用简单。
  • 而Shior不依赖于Spring,不仅可以用于 web,还可以用于C/S系统,分布式系统权限管理。
2 、shiro整体架构/架构流程
  • 整体架构:
    • ①用户(Subject)发送请求到安全管理器(Security Manager)
    • ②安全管理器调用认证器组件(Authenticator)进行认证
    • ③认证需要的比对数据(token与数据库中的数据)通过Realm来获取。

在这里插入图片描述在这里插入图片描述

二、Shior核心概念

1、核心类
  • Authentication:身份认证/登陆,验证用户是不是拥有相应的身份(角色)。(判断用户名密码是否匹配的登陆过程)
  • Authorization:授权,即:权限认证,验证某个已认证的用户是否拥有某个权限。
  • Session Manager:会话管理。用户登陆后就是建立了一次会话,在退出之前,所有的信息都在会话当中。
2、主要概念
  • Subject:代表正在操作系统的客户
  • SecurityManager:安全管理器,相当于SpringMVC中的DispatcherServlet。校验用户是否合法。
  • Realms:提供从数据库取出来的用户名 和 密码。
  • token: 中保存了用户输入的账号和密码。
    ###### 3、

三、Shiro的使用(认证 和 授权)

0、创建Maven项目(quick start)
1、Shiro需要的jar包
<dependency>《!--Shiro jar--》
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-core</artifactId>
  <version>1.4.0</version>
</dependency>

<dependency>《!--引入日志jar--》
  <groupId>commons-logging</groupId>
  <artifactId>commons-logging</artifactId>
  <version>1.2</version>
</dependency>

<dependency><!--日志依赖的jar : slf4j-nop-->
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-nop</artifactId>
  <version>1.7.25</version>
  <scope>test</scope>
</dependency>

在这里插入图片描述

2、Shiro认证流程代码分析

在这里插入图片描述

3、Shiro认证流程:(匹配账号密码来进行登陆验证)
  • 1、构造一个SecurityManager环境。
  • 2、主体(用户)提交认证subject.login(token)给安全管理器(SecurityManager) 。。。。。 //subject.login(token)的方法内部会把token提交给安全管理器去做认证(即:调用securityManager.login(token))。
  • 3、安全管理器 调用认证器组件(Authenticator)执行真正的认证

认证的流程

认证的流程: 用户发送认证请求到安全管理器,安全管理器调用认证器组件进行认证。
如何认证? 安全管理器在调用 认证器组件认证之前,要调用realm进行数据库查询 判断是否有该用户。没有的话,直接返回认证信息info为null,就不再调用认证器组件了。若该用户存在的话,则再调用认证器组件进行认证。

匹配原则?

  • 先匹配账号是否存在,若账号不存在返回info==null;若账号存在(即:info != null),再交给一个认证器接着再验证密码是否匹配。

认证流程图

在这里插入图片描述在这里插入图片描述

4、自定义Realm(在Realm中做登陆的认证)

当用户真实的账号密码没有保存在.ini文件中,而是要从数据库中进行读取获得时,我们就需要自定义Realm来进行认证的验证。
在这里插入图片描述在这里插入图片描述

5、散列密码
  • 1)概述:一般用于对数据加密,加密结果为:一串长字符。是一种不可逆的算法。一般适用于存储密码之类的数据,常见的散列算法如:MD5、SHA等。
    • 不可逆:(明文转换成密文之后,就没有办法再转成明文了)
    • 很多的MD5解密网站,实质就是 根据你输入的密文 去数据库查询 对应的明文。
    • 同一个字符串,每次加密的结果是一样的。
    • 数据库中存的是加密后的密文。用户输入的密码,系统会进行加密后再与数据库中密文比较。
    • 为了加密的数据 更加的安全,我们需要“加盐” + “多次散列”。在这里插入图片描述
  • 2)为了实现用户让输入的明文密码自动的(按照我的加密规则)进行MD5加密,加密后与数据库的密文进行比对。我们要做一些配置才能达到这样的目的。
  • 在这里插入图片描述在这里插入图片描述
6、授权
  • 0)权限格式的定义:

资源:权限,资源:权限
user:create,user:update

  • 1)方式一:用户的权限信息写在了**.ini文件中**(实际开发是写在数据库中的)
    .ini配置文件
    -
    具体的操作:
    在这里插入图片描述
  • 2)方式二:在自定义realm中操作
  • 在这里插入图片描述在这里插入图片描述
### Apache Shiro 权限管理教程与最佳实践 Apache Shiro 是一个强大且易用的 Java 安全框架,用于执行身份验证、授权、密码管理和会话管理。Shiro 的权限管理功能是其核心之一,能够帮助企业快速实现安全控制。 #### 1. 权限管理基础 Shiro 提供了多种权限管理方式,包括基于角色的访问控制(RBAC)和基于权限字符串的细粒度控制。以下是一些关键概念: - **Subject**:表示当前用户或主体,提供身份验证和权限验证的功能[^4]。 - **Realm**:负责连接数据源(如数据库、LDAP)进行用户身份验证和权限验证的组件,可以看作是一个专门用于安全的 DAO(数据访问对象)[^3]。 - **SecurityManager**:核心接口,负责协调所有安全相关的操作(认证、授权、会话管理)[^2]。 #### 2. 权限管理的实现方式 Shiro 支持多种权限管理方式,以下是常见的几种: - **基于角色的访问控制(RBAC)**: - 用户被分配到特定的角色,角色具有一定的权限集合。 - 示例代码如下: ```java if (subject.hasRole("admin")) { // 执行管理员操作 } ``` - **基于权限字符串的细粒度控制**: - 使用权限字符串定义资源及其操作类型。 - 权限字符串通常采用点分隔的形式,例如 `user:create` 表示创建用户。 - 示例代码如下: ```java if (subject.isPermitted("user:create")) { // 允许创建用户 } ``` #### 3. 权限配置的最佳实践 在实际项目中,Shiro 的权限配置需要结合具体的业务需求进行设计。以下是一些最佳实践: - **清晰的权限结构**: - 使用层次化的权限字符串,例如 `module:action:resource`。 - 示例:`system:user:create` 表示系统模块下的用户创建操作。 - **自定义 Realm**: - 如果使用数据库存储用户信息和权限信息,可以通过自定义 Realm 实现数据加载。 - 自定义 Realm 示例代码: ```java public class CustomRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 加载用户角色和权限 info.addRole("admin"); info.addStringPermission("user:create"); return info; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal(); // 验证用户凭据 return new SimpleAuthenticationInfo(username, "password", getName()); } } ``` - **缓存机制**: - 在生产环境中,建议启用缓存以减少对数据库的频繁访问。 - 配置 EhCache 或其他缓存工具来加速权限验证过程。 - **过滤器授权**: - 使用 Shiro 提供的过滤器对 URL 进行权限控制。 - 示例配置: ```properties [urls] /admin/** = authc, roles[admin] /user/** = authc, perms[user:create] ``` #### 4. 常见问题及解决方案 - **用户登录后无法获取权限信息**: - 确保在自定义 Realm 中正确实现了 `doGetAuthorizationInfo` 方法。 - 检查是否启用了缓存,并确保缓存中的权限信息是最新的。 - **权限字符串设计不合理**: - 设计权限字符串时应考虑未来的扩展性,避免过于复杂或冗长。 - **性能问题**: - 在高并发场景下,建议优化数据库查询逻辑并启用缓存。 ```java // 示例:手动授权 if (!SecurityUtils.getSubject().isPermitted("user:create")) { throw new UnauthorizedException("没有权限创建用户"); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值