shiro框架实现权限管理
在进行权限管理前,我们经常遇到的问题便是有些页面你直接用url就可以访问,不管你登录没登录,还有就是你在页面中跳转的时候你无法批判你是否有这个权限使用,当然这个时候大部分人所想的是在访问前判断一下用户有没有这个权限,当然这也是一种方法,但是,这种解决方式需要在我们测试好的代码上动刀,不仅凭空增加了工作量,而且大大增加了代码的风险,这里我大致讲解一下 shiro这个安全框架,我们用它来弄权限管理
权限管理1.1 什么是权限管理
基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。
权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问
1.2 用户身份认证
1.2.1 概念
身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。
最常见的就是系统登录需要账号,密码,手机的指纹解锁需要对应的指纹
1.2.2 用户名密码身份认证流程
1.2.3 关键对象
上边的流程图中需要理解以下关键对象:
Subject:主体
访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体;
Principal:身份信息
是主体(subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(Primary Principal)。
credential:凭证信息
是只有主体自己知道的安全信息,如密码、证书等。
1.3 授权
1.3.1 概念
授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。
1.3.2 授权流程
下图中橙色为授权流程。
1.3.3 关键对象
授权可简单理解为who对what(which)进行How操作:
Who,即主体(Subject),主体需要访问系统中的资源。
What,即资源(Resource),如系统菜单、页面、按钮、类方法、系统商品信息等。资源包括资源类型和资源实例,比如商品信息为资源类型,类型为t01的商品为资源实例,编号为001的商品信息也属于资源实例。
How,权限/许可(Permission),规定了主体对资源的操作许可,权限离开资源没有意义,如用户查询权限、用户添加权限、某个类方法的调用权限、编号为001用户的修改权限等,通过权限可知主体对哪些资源都有哪些操作许可
1.4 基于url拦截
Shiro过滤器&标签简介
判断 sesion中是否有 user 判断账户密码是否正确
(1)分析
需要过滤器控制 没有权限下访问链接
需要标签控制 没有权限下 界面元素的隐藏
》anon代表不认证也可以访问,通常对静态资源进行放行
》authc代表必须通过认证才可以访问,通常对动态资源(controller,jsp页面)进行拦截,如果用户没有认证,Shiro会自动跳转到login.jsp页面
Shiro登陆认证-判断session中的user
(1)过滤器
在项目中使用认证过滤器拦截资源(该拦截的拦截,该放行的放行)
(2)authc认证过滤器
必须认证才能访问,如果未认证跳登录页
(3)anon过滤器
放行,不需要拦截认证
(4)拦截路径问题
/*
/**
applicationContext-shiro.xml
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><!--注入SecurityManager--><property name="securityManager" ref="securityManager"/><property name="filterChainDefinitions"><value><!-- 如果请求提静态资源 anon 不要求session中有user,直接可以访问-->/css/**=anon/img/**=anon/plugins/**=anon<!-- 如果请求login.do方法 anon-->/system/user/login-shiro.do=anon<!-- 如果除以上之后的xxx.do 要求登录 authc查询session中是否有user-->/**=authc</value></property><!--如果 session就是没有user,表示未登录,页面转到login-shiro.jsp --><property name="loginUrl" value="/login-shiro.jsp"/></bean>
Shiro登录认证-用户密码判断
Shiro登陆认证三种结果
(1)正确
无异常
User user = (User)subject.getPrincipal()//获取user对象
(2)用户不存在
程序抛出UnknownAccountException异常
(3)用户密码出错
程序抛出IncorrectCredentialsException异常
Shiro登陆认证login方法
1) 获取Subject对象
Subject subject = SecurityUtils.getSubject();
(2)调用Subject的认证方法 : login 本质:AuthRealm的认证方法
subject.login(token);
(3)登录的结果
正确
用户不存在
用户密码出错
UserController
userController通地subject连接到securitymanager,再由securityManager去调用realm
//${path}/system/user/login-shiro.do@RequestMapping(path = "/login-shiro", method = {RequestMethod.GET, RequestMethod.POST})public String loginShiro(String email,String password) {//根据 email查询对应的用户l.info("loginShiro email " + email);l.info("loginShiro password " + password);//使用shiro框架进行认证 结果也是三种可能 正确 没有异常,用户不存在 UnknownAccountException,密码出错 IncorrectCredentialsException//本质是需要调用realm进行查找用户Subject subject = SecurityUtils.getSubject();//获取连接//1:先获取subject 表示对securitymanager连接//2:调用 securitymanager//3:再调用realm//难验信息UsernamePasswordToken token = new UsernamePasswordToken(email, password);//身份验证try {subject.login(token);//正确 --realm//正确l.info("正确");//保存用户信息//要求访问realm返回一个user对象User user = (User) subject.getPrincipal();// --realmsession.setAttribute("loginUser",user);//一个 Module对象 就是左侧栏上的一个菜单项List<Module> menus = iModuleService.findModulesByUser(user);session.setAttribute("menus",menus);l.info("login menus "+menus);//跳到主页return "redirect:/home/toMain.do";} catch (UnknownAccountException e) {//用户不存在e.printStackTrace();l.info("用户不存在");request.setAttribute("error","用户不存在");return "forward:/login-shiro.jsp";}catch (IncorrectCredentialsException e){//密码出错e.printStackTrace();l.info("密码不对");request.setAttribute("error","邮箱或者密码不对");return "forward:/login-shiro.jsp";}}
AuthRealm
//认证(登录账号密码)//subject.login(token);//参1 接受 subject.login(token); 方法的值 authenticationToken@AutowiredIUserService userService;@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {l.info("AuthRealm doGetAuthenticationInfo 函数执行了");//响应login方法和getPrincipal方法的调用UsernamePasswordToken usernamePasswordToken= (UsernamePasswordToken) token;String email = usernamePasswordToken.getUsername();l.info("doGetAuthenticationInfo --"+email);//调service读daoUser user = userService.findUserByEmail(email);l.info("doGetAuthenticationInfo --"+user);if (user == null) {//用户不存在return null;//-->系统会将null转成UnknownAccountException抛出} else {//用户存在的//AuthenticationInfo 返回给 User user = (User) subject.getPrincipal();/*** 参数一:principal,存放用户登录信息,subject.getPrincipal()获取* 参数二:数据库的密码* 参数三:realm的别名,只有在多个Realm的时候才会用,一般不用*/AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), "");return info;}}
shiro框架实现权限管理相关推荐
- Shiro角色和权限管理
Shiro角色和权限管理 在resources下创建shiro.ini文件,用于存储数据,也可以将数据存于数据库,这里我采用shiro.ini文件,内容如下: [users] zhangsan=z3, ...
- Yii2.0 后台UI框架以及权限管理扩展实现权限菜单管理
Yii2.0 后台UI框架以及权限管理扩展实现权限菜单管理 一.安装后台框架ui 二.安装权限管理扩展 三.实现权限菜单管理 一.安装后台框架ui composer require dmstr/yii ...
- shiro框架---解决权限限制问题
shiro简介 Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证,授权,企业会话管理和加密(核心功能). 以下是你可以用 Apache Shiro所做的事情: 1. ...
- Spring框架之权限管理
权限管理 回顾 课前测: 模拟controller, dao,service层,使用bean.xml配置. 本章内容 表间关系: 我们在这里员工和角色考虑多对一关系(实际开发是多对多) 权限管理流程: ...
- 浅谈基于SSM框架的权限管理(代码)
pom.xml的配置 <spring.security.version>5.0.1.RELEASE</spring.security.version><dependenc ...
- Shiro框架在项目中的应用
1.Shiro 框架简介 Shiro 概述 Shiro 是Apache公司推出一个权限管理框架,其内部封装了项目中认证,授权,加密,会话等逻辑操作,通过Shiro框架可以简化我们项目权限控制逻辑的代码 ...
- shiro权限管理的框架、加密、授权
shiro权限管理的框架 1.权限管理的概念 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且 ...
- ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理
在前面两篇随笔<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>和<ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程>开始 ...
- 毕业设计-基于SSM框架大学教务管理平台项目开发实战教程(附源码)
文章目录 1.项目简介 2.项目收获 3.项目技术栈 4.测试账号 5.项目部分截图 6.常见问题 毕业设计-基于SSM框架大学教务管理平台项目实战教程-附源码 课程源码下载地址:https://do ...
- shiro框架的密码校验(二)
其他的的内容在这里 shiro框架简单介绍以及使用(一) shiro框架的权限设定(三) shiro框架的密码校验进阶(四)多登陆方式实现思路 上一篇简单介绍了一下shiro框架和账号验证,这篇简单写 ...
最新文章
- 研究生要这样度过!(转)
- 预测人民币在2006年最终的收盘价
- 官宣!“一流大学”,异地落户!
- 非对称加密, 助记词, PIN, WIF
- cdn对动态网站有作用吗_网站选择cdn加速有什么作用?
- listctrl 优化_上海SEO整站优化公司_新站整站快速排名优化
- generator tar.gz file in windows
- webuploader上传多张照片的基本功能
- Win7 下 VS2005 不能断点调试解决办法
- 浙大版c语言程序设计第三版答案
- Android音视频学习路线
- Fluent 安装过程
- android模拟器中关闭应用进程
- 解决onenote同步慢的问题
- flutter packages get 慢 解决方案
- Python开HTTP服务器
- C++ API 设计 07 第二章
- html中将文字设置成红色,怎样用css将文字改为红色?
- 马斯克放大招!直逼高铁时速的240km h汽车隧道挖成了!
- 超融合基础架构容灾 -Nutanix Metro Availability + VMwareHA容灾
热门文章
- wonderware配置-Intouch读取Historian数据 8
- viper4android md,【xposed】微信主题模块(MDWechat)v3.5.0
- 制作u盘运行kali linux系统,U盘的进阶用法----打造U盘启动盘+USB KALI Linux+普通U盘。...
- 20189222 《网络攻防实践》安全工具、库的简介以及使用教程
- Cisco模拟器教程
- 织梦dedecms采集规则,东方资讯娱乐新闻采集规则
- jdk6版本下载地址
- 【软件安装】CuteFTP Pro安装过程(含安装包)
- Magnific Popup – 免费的响应式 jQuery Lightbox 插件
- could not open `C:\Program Files\Java\jre7\lib\amd64\jvm.cfg' 的解决办法: