我的shiro之旅: 十一 shiro的权限设计

使用 Shiro 设计基于用户、角色、权限的通用权限管理系统 一、前言 在大型的信息管理系统中,经常涉及到权限管理系统 下面来个 demo,很多复杂的系统的设计都来自它 Coding(github)地址:https://git.coding.net/larger5/urp.git https://git.coding.net/larger5/urp.git 2018.4.3 版本0.5 在 SpringBoot 中使用 Shiro+MySQL... 阅读详情

博客已移至 http://blog.gogl.top

在这里,介绍一个简单,基本的权限设计。其中包括3个类,有User,Role,Auth。下面是类信息。

 

import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import com.concom.lang.helper.PasswordEncoder;

/**
 * @author Dylan
 * @time 2013-8-5
 */
public class User implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = -5394552769206983498L;

	private Long id;
	/**
	 * 用户名
	 */
	private String username;
	/**
	 * 密码
	 */
	private String password;

	/**
	 * 角色
	 */
	private Set<Role> roles = new HashSet<Role>();
	/**
	 * 权限
	 */
	private Set<Auth> auths = new HashSet<Auth>();

	/**
	 * 用于转换role
	 */
	private Map<String, Integer> roleTrans = new HashMap<String, Integer>();
	/**
	 * 用于转换auth
	 */
	private Map<String, Integer> authTrans = new HashMap<String, Integer>();

	public User() {
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	/**
	 * Returns the username associated with this user account;
	 * 
	 * @return the username associated with this user account;
	 */
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	/**
	 * Returns the password for this user.
	 * 
	 * @return this user's password
	 */
	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Set<Role> getRoles() {
		return roles;
	}

	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}

	public Map<String, Integer> getRoleTrans() {
		return roleTrans;
	}

	public void setRoleTrans(Map<String, Integer> roleTrans) {
		this.roleTrans = roleTrans;
	}

	public Set<Auth> getAuths() {
		return auths;
	}

	public void setAuths(Set<Auth> auths) {
		this.auths = auths;
	}

	public Map<String, Integer> getAuthTrans() {
		return authTrans;
	}

	public void setAuthTrans(Map<String, Integer> authTrans) {
		this.authTrans = authTrans;
	}

	public User beforeCreate() {
		translateRole();
		translateAuth();
		return this;
	}

	/**
	 * 将装有role id的Map的值注入到role中
	 */
	private void translateRole() {
		Map<String, Integer> roleIds = getRoleTrans();
		if (roleIds.isEmpty()) {
			return;
		}
		getRoles().clear();
		for (String key : roleIds.keySet()) {
			Role role = new Role();
			role.setId(roleIds.get(key));
			getRoles().add(role);
		}
	}

	/**
	 * 将装有auth id的Map的值注入到auth中
	 */
	private void translateAuth() {
		Map<String, Integer> authIds = getAuthTrans();
		if (authIds.isEmpty()) {
			return;
		}
		getAuths().clear();
		for (String key : authIds.keySet()) {
			Auth auth = new Auth();
			auth.setId(authIds.get(key));
			getAuths().add(auth);
		}
	}

	/**
	 * @return
	 */
	public Set<String> getRolesAsString() {
		Set<String> roles = new HashSet<String>();
		for (Role role : getRoles()) {
			roles.add(role.getCode());
		}
		return roles;
	}

	/**
	 * 
	 * @return
	 */
	public Set<String> getAuthAsString() {
		Set<String> auths = new HashSet<String>();
		for (Auth auth : getAuths()) {
			auths.add(auth.getCode());
		}
		return auths;
	}

	public boolean hasRoles() {
		return !getRoles().isEmpty();
	}

	public boolean hasAuths() {
		return !getAuths().isEmpty();
	}

	public User encodePassword() {
		setPassword(PasswordEncoder.encode(getPassword()));
		return this;
	}

}

 

 

 

 

 

 

import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * @author Dylan
 * @time 2013-8-5
 */
public class Role implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 6769720272431073142L;

	private Integer id;

	private String code;

	private String name;

	private Set<Auth> auths = new HashSet<Auth>();

	private Map<String, Integer> authTrans = new HashMap<String, Integer>();

	public Role() {
	}

	public Role(String name) {
		this.name = name;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public Set<Auth> getAuths() {
		return auths;
	}

	public void setAuths(Set<Auth> auths) {
		this.auths = auths;
	}

	public Map<String, Integer> getAuthTrans() {
		return authTrans;
	}

	public void setAuthTrans(Map<String, Integer> authTrans) {
		this.authTrans = authTrans;
	}

	public Role beforeCreate() {
		translateAuths();
		return this;
	}

	private void translateAuths() {
		Map<String, Integer> authIds = getAuthTrans();
		if (authIds.isEmpty()) {
			return;
		}
		getAuths().clear();
		for (String key : authIds.keySet()) {
			Auth auth = new Auth();
			auth.setId(authIds.get(key));
			getAuths().add(auth);
		}

	}

	/**
	 * @return
	 */
	public Set<String> getAuthsAsString() {
		Set<String> auths = new HashSet<String>();
		for (Auth auth : getAuths()) {
			auths.add(auth.getCode());
		}
		return auths;
	}

	public boolean hasAuth() {
		return !getAuths().isEmpty();
	}

}

 

import java.io.Serializable;

/**
 * @author Dylan
 * @time 2013-8-5
 */
public class Auth implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1554690122999348374L;
	
	private Integer id;
	/**
	 * 权限代码
	 */
	private String code;
	/**
	 * 权限名称
	 */
	private String name;
	
	public Auth(){}
	
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}


     因为在User里面设置的roles,auths为Set类型,Role里面设置的auths为Set类型,在jsp页面编辑注入到实体里的时候会有问题,所以均添加了Trans字段和对应的方法,目的是用于转换。

 

     前面的文章已经介绍过realm的编写。如果对realm不了解可以看看前面的文章。在realm中我们会覆写doGetAuthorizationInfo方法,shiro在第一次需要认证权限的时候会调用这个方法,并把权限信息放到缓存中。在这个方法里,我们调用了SimpleAuthorizationInfo的addRoles方法把用户的角色添加到了info中,调用addStringPermissions方法把用户的权限信息添加到info中。这样,shiro就可以从中取出角色码和权限码进行配对。下面再简单给出doGetAuthorizationInfo方法的实现。

 

@Override  
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  
          
        String username = (String)getAvailablePrincipal(principals);  
        User user = userService.getByUsername(username);  
          
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();  
        Set<String> rolesAsString = user.getRolesAsString();  
        info.addRoles(rolesAsString);  
        if(user.hasAuths()){  
            info.addStringPermissions(user.getAuthAsString());  
        }  
        for(Role role : user.getRoles()){  
            info.addStringPermissions(role.getAuthsAsString());  
        }  
        return info;  
    }  

 

 

 

 

 

 

 

Shiro实现权限管理之表结构设计 起步 表设计 开发用户-角色-权限管理系统,首先我们需要知道用户-角色-权限管理系统的表结构设计。 在用户-角色-权限管理系统找那个一般会涉及5张表,分别为: 1.sys_users用户表 2.sys_roles角色表 3.sys_permissions权限表(或资源表) 4.sys_users_roles用户-角色关联表 5.sys_roles_permissions角色-权限关... 阅读详情

相关推荐

Shiro权限框架之数据库表设计

使用Shiro作为权限框架,我们一般用到 5 张表: 用户表 (user) 角色表 (role) 权限表 (permission) 用户 - 角色关联表 (user_role ;一对多的关系,一个角色对应多个用户) 角色- 权限关联表 (role_permission ;多对多关系) 创建表: drop table if exists sys_users; drop table ...

雩风初拾 1476

Shiro 权限管理

一共5个表 用户表 角色表 权限表 用户角色中间表 角色权限中间表 权限验证 通过角色来判断有没有权限。 比如 if 用户有在用户角色中间表中有经理的角色, 就可以查看工资。这中判断比较笼统。适合比如实现不同的角色登录以后看到不同的菜单。 通过权限标识来判断, 这个就需要查出用户拥有的具体权限。 这个权限控制比较细致。 适合细致的,比如部门公司的管理员,只能修改该部门下的员工资料。 Shi...

心猿意码 5245

Shiro 权限框架搭建

1 项目框架 spring+springMVC (Dao层框架对本次shiro框架集成无影响) 2 设计思路 提供给北辰会展中心一套基于shiro 框架开发的权限管理系统, 实现自定义角色并赋予角色相应的权限,来控制用户访问功能, 例如广告的增加,删除,发布,修改等等; 3 shiro 主要功能 1) 权限管理 : 给用户分配角色 , 也可以给用户分配权限 或者把权限绑定到角...

追梦的郑某艺 1314

Shiro权限控制+整合shiro

Shiro权限控制 0.1传统的权限认证方式 特点:为每个人单独的分配权限模块,能够实现权限控制,但是当公司人员庞大之后,非常难管理 上述权限控制如何设计表? 关系:员工和菜单权限的关系:多对多 员工id 菜单名称 1 取派管理 2 快递员管理 2 运单管理 好处:可以方便的 实现权限控制 缺陷:比如当修改权限的时候,公司统一的给组长级别的人 加一个“计算工资”权限,...

Armymans的博客 2万+

从零配置华为S5720交换机VLAN:Web界面与命令行双模式详解(附拓扑图)

本文详细解析华为S5720交换机VLAN配置的全过程,涵盖Web界面与命令行(CLI)双模式操作指南。从基础环境准备到多交换机环境配置同步,特别针对S5720-52X系列交换机的VLANif接口、端口分配策略及交换机堆叠技术进行深入讲解,并附实用拓扑图与配置示例,助力企业网络管理员高效完成VLAN部署。

happy2的博客 1370

spoon工具的常用基础操作

先创建一个作业,这个作业流程,包括进行设置变量转换,查询结果输出转换,方便后续循环。整个流程写完后,执行作业5_执行整个流程,成功后,可以在数据库查看结果。,新建一个转换,excel表输入然后复制记录到结果,保存转换文件。这三个用户下 都有一张emp表 分别是 三个部门的用户信息。,新建一个数据库连接,变量命名用户名和密码。成功执行后,可以到保存的excel位置进行查看。emp表输入,可以进行预览查看数据有没有过来。输出到一直excel表,运行结果输出。,新建一个转换,拖拽。

qq_43583887的博客 5831

Shiro的认证和权限控制

Shiro的权限和权限

宏微的博客 3万+

【Python爬虫】爬取企业专利信息

本来是个美好的周末的,但是周五晚上领导给了一个公司名称的Excel,让把这些公司的专利信息爬取下来。本文记录了爬取企业专利信息的心酸过程。码字不易,喜欢请点赞!!! 一、找寻目标网页 在接到这个任务之后,我的内心是拒绝的。但是又不能不干。因此首先我需要先找到有公司专利信息的地方。在一番查找和问了问朋友之后,我知道中国专利网、国家知识产权网、Incopat、天眼查、企查查这些网站上面都有企业的专利...

Asher117的博客 2万+

Springboot 整合Shiro 轻量级权限框架,从数据库设计开始带你快速上手shiro

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》

2401_83641443的博客 671

海康工业相机LabVIEW二次开发实战——参数配置优化与图像高效存储

本文详细介绍了海康工业相机在LabVIEW平台上的二次开发实战,重点解析了相机参数配置的优化方法与图像高效存储策略。通过剖析曝光、增益、触发模式等核心参数的设置逻辑,并结合生产者-消费者设计模式,指导开发者构建稳定、高效的图像采集与异步存储流程,有效提升工业视觉项目的开发效率与系统稳定性。

weixin_29306317的博客 221

基于dify平台批量分析excel格式信息

如何以表格形式批量输入一些信息,然后让大模型以对话应用形式逐条进行推理分析?请逐行分析以下数据,给出推理结果:{{input}}这里提供一个分步解决方案,结合。

knightissocool的博客 8011

4.Shiro基本表设计

Shiro五张表 在Web应用中,对安全的控制主要有角色、资源、权限(什么角色能访问什么资源)几个概念,一个用户可以有多个角色,一个角色也可以访问多个资源,也就是角色可以对应多个权限 数据库设计,至少需要建5张表:用户表、用户-角色表、角色表、角色-资源表、资源表 ①一个用户对应一个或者多个角色。 ②一个角色对应一个或者多个权限。 ③一个权限对应能够访问对应的API或URL资源。 (1)用户表 用户表中至少包含以上的字段,主键id、用户名username、密码password、盐值salt(因为密码

相互学习 共同进步 2539

SpringBoot 指标监控——Actuator

1、 访问:localhost:8000/actuator 设置健康监控显示具体情况 metrics http://localhost:8000/actuator/metrics/jvm.gc.live.data.size 定制化health信息 //利用构造器,在注册中心中添加cityService.saveCity.count指标 public CityServiceImpl(MeterRegistry meter...

weixin_44302046的博客 4630

最全Shiro教程,一篇学会Shiro权限管理

声明:本文是博主观看bilibili上Java涛哥视频学习的Shiro框架所整理笔记,学完思路清晰,原文代码大致相同,原视频链接附上,方便以后学习查看。 Shiro ​ Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。 一、权限管理 不同身份的人进入系统所完成的操作不同,如下图,当一个系统包含左侧所有菜单功能时,要求不同人员登录展示不

老达摩的博客 3万+

基于YOLOv8的农作物病虫害检测系统设计与实现

国内如中国农业大学的科研团队采用改进的Faster R-CNN模型对小麦病害进行检测,取得了较好的效果。农作物病虫害是影响农业生产的重要因素之一,每年因病虫害导致的农作物减产高达20%-40%。YOLO(You Only Look Once)系列算法作为目标检测领域的代表性模型,以其高效、准确的特点在众多领域得到广泛应用。YOLOv8作为该系列的最新版本,在精度和速度上都有显著提升,非常适合农作物病虫害检测这类需要实时处理的应用场景。然而,现有研究仍存在一些不足:一是模型复杂度高,难以部署到移动设备;

YOLO 794

Ghost卷积原理与构建YOLOv11的GhostNet变体

本文探讨了在边缘设备部署YOLOv11时使用Ghost卷积进行模型轻量化的实践经验。针对Jetson Nano的4GB内存限制,作者通过替换Backbone中的3x3标准卷积为Ghost卷积,实现了参数减少28%、推理速度提升38%,仅损失1.1%mAP的优化效果。文章详细介绍了Ghost卷积的实现原理、在YOLOv11中的具体替换策略,以及训练调参和部署优化的关键技巧。作者强调轻量化是计算效率与模型性能的权衡,建议工程团队保留原模型和Ghost变体两个版本,根据实际需求灵活切换。Ghost卷积的核心价值在

as1225120794的博客 169

Shiro系列十一:权限标签

 Shiro 提供了 JSTL 标签用于在 JSP 页面进行权限控制,如根据登录用户显示相应的页面按钮。 需要在JSP 中导入 shiro 的标签库:<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> 一、常用标签 guest 标签:用户没有身份验证时显示相应信息,即游客访问信息。 user 标签:用户已经经...

苍穹尘的博客 2793

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Shiro权限控制(三):Shiro注解权限验证

一、目标 通过注解方式实现URL的权限验证 二、前言 在前面的一篇博文中《Shiro权限控制之自定义Filter(二)》,我们的权限验证是配置在shiro配置文件中的,即在spring-shiro-web.xml中的ShiroFilterFactoryBean的filterChainDefinitions属性中,如下 <!-- Shiro的web过滤器 --> <...

kity9420的专栏 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

shiro注解权限控制-5个权限注解

shiro注解权限控制-5个权限注解Shiro共有5个注解,接下来我们就详细说说吧 RequiresAuthentication: 使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在当前session中已经过认证。RequiresGuest: 使用该注解标注的类,实例,方法在访问或调用时,当前Subject可以是“gust”身份,不需要经过认证或者在原先的session中

头发没掉完,就得接着干! 5万+

我的shiro之旅: 九 shiro 清理缓存的权限信息

博客已移至 http://blog.gogl.top 在文章八讲到了shiro缓存权限信息然后达到共享目的,不过存在一个问题,当用户的权限发生改变的时候,需要用户重新登录,从新缓存用户权限信息。这篇文章将介绍在改变用户的权限时,如何清理用户的权限。我这里写了一个帮助类,先贴也代码。   package com.concom.security.infrastructure.helper; ...

Dylan的博文 2万+

权限框架之Shiro详解

文章大纲 一、权限框架介绍 二、Shiro基础介绍 三、Spring Boot整合Shiro代码实战 四、项目源码与资料下载 五、参考文章 一、权限框架介绍 1. 什么是权限管理   权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。   权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。 1.1 用户身份认证   身份.

Dream_ling的博客 6431

Shiro权限认证

一、权限认证核心要素 权限认证顾名思义,就是在应用系统中,控制谁能访问哪些资源。核心要素有仨:权限、角色、用户   权限:即操作资源的权利,如访问某个url,对某个模块数据进行增删改查   角色:权限的集合,一种角色可以包含多种权限。例如操作员角色可查看系统账单、进行结账操作多种权限。   用户:也就是身份认证中提到的subject一角。  二、授权 shiro授权的方式通常有三种

Think In JAVA—Max 6568

Shiro框架01之什么是shiro+shiro的架构+权限认证

1. 什么是shiroshiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单。shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统,分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro。2. 在应用程序角度来观察如何使用Shiro完成工作。

全栈 1万+

Shiro(七):shiro 注解权限控制-5个权限注解

shiro提供了相应的注解用于权限控制,如果使用这些注解就需要使用aop的功能来进行判断。shiro提供了spring aop集成,用于权限注解的解析和验证 shiro注解权限控制-5个权限注解 Shiro共有5个注解,接下来我们就详细说说吧 1.@RequiresAuthentication: 使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须通过login 进行了身份验证;即 Subject.isAuthenticated() 返回 true 2.@RequiresUser: 表

12程序猿的博客 4737
上一篇: 我的shiro之旅: 十 自定义shiro的SessionIdCookie
下一篇: 我的shiro之旅: 十二 shiro 踢出用户(同一用户只能一处登录)
LHacker
博客等级 码龄17年 162粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值