细说shiro之一:shiro简介

一. Shiro是什么
Shiro是一个Java平台的开源权限框架,用于认证和访问授权。具体来说,满足对如下元素的支持:
- 用户,角色,权限(仅仅是操作权限,数据权限必须与业务需求紧密结合),资源(url)。
- 用户分配角色,角色定义权限。
- 访问授权时支持角色或者权限,并且支持多级的权限定义。
Q:对组的支持?
A:shiro默认不支持对组设置权限。
Q:是否可以满足对组进行角色分配的需求?
A:扩展Realm,可以支持对组进行分配角色,其实就是给该组下的所有用户分配权限。
Q:对数据权限的支持? 在业务系统中定义?
A:shiro仅仅实现对操作权限的控制,用于在前端控制元素隐藏或者显示,以及对资源访问权限进行检查。数据权限与具体的业务需求紧密关联,shiro本身无法实现对数据权限的控制。
Q:动态权限分配?
A:扩展org.apache.shiro.realm.Realm,支持动态权限分配。
Q:与Spring集成?
A:可以支持与Spring集成,shiro还支持jsp标签。
二. 系统架构
在shiro架构中,有3个最主要的组件:Subject,SecurityManager,Realm。
Subject本质上就是当前访问用户的抽象描述。
SecurityManager是Shiro架构中最核心的组件,通过它可以协调其他组件完成用户认证和授权。实际上,SecurityManager就是Shiro框架的控制器。
Realm定义了访问数据的方式,用来连接不同的数据源,如:LDAP,关系数据库,配置文件等等。
三. 如何使用Shiro
Shiro作为一个完善的权限框架,可以应用在多种需要进行身份认证和访问授权的场景,例如:
1. 在独立应用中使用shiro
http://www.cnblogs.com/nuccch/p/6780550.html 细说shiro之三:在独立应用中使用shiro
2. 在web应用中使用shiro
http://www.cnblogs.com/nuccch/p/6785167.html 细说shiro之四:在web应用中使用shiro
3. 在spring框架中集成shiro
http://www.cnblogs.com/nuccch/p/6790408.html 细说shiro之五:在spring框架中集成shiro
四. Shiro原理
1. 认证
通过调用Subject.login(token)方法开始用户认证流程。
Subject currentUser = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
token.setRememberMe(true);
try {
currentUser.login(token);
} catch (UnknownAccountException e) {
logger.error(String.format("user not found: %s", username), e); // 用户不存在
} catch (IncorrectCredentialsException e) {
logger.error(String.format("incorrent credentials: %s", username), e); // 密码不正确
} catch (ConcurrentAccessException e) {
logger.error(String.format("user has been authenticated: %s", username), e); // 用户重复登录
} catch (AccountException e) {
logger.error(String.format("account except: %s", username), e); // 其他账户异常
}
shiro用户认证时序图:
2. 授权
shiro访问授权有3种实现方式:api调用,java注解,jsp标签。
(1)在独立应用程序中访问授权通过api调用实现
String role = "schwartz";
Subject currentUser = SecurityUtils.getSubject();
if(currentUser.hasRole(role)) {
//用户属于角色schwartz
}else{
//用户不属于角色schwartz
}
(2)在spring框架中可以通过java注解
@RequiresPermissions(value={"log:manage:*"})
public ModelAndView home(HttpServletRequest req) {
ModelAndView mv = new ModelAndView("home");
return mv;
}
(3)在JSP页面中还可以直接使用jsp标签
<!-- 使用shiro标签 -->
<shiro:hasPermission name="log:manage:*">
<a href="<%=request.getContextPath()%>/user/home">操作日志审计</a><br/>
</shiro:hasPermission>
shiro访问授权时序图:
五. 注意事项
1.org.apache.shiro.realm.jdbc.JdbcRealm如果需要在授权时开启权限检查,必须设置permissionsLookupEnabled为true,否则只检查角色。
2.用户退出登录时,Shiro用户必须执行logout(),必须要注销Session信息,避免影响下一次用户认证和授权。
SecurityUtils.getSubject().logout();
req.getSession().invalidate();
3.如果在数据库中存储的用户密码为编码值(如MD5加密),则在发送登录请求时传递的密码参数也必须是MD5加密结果,否则认证失败。
4.shiro框架只能控制操作权限,不能控制数据权限。数据权限与具体的业务紧密关联,无法通过一个通用的框架完成,通常都是利用关系数据库查询过滤实现。
对操作权限的控制有2层含义,其一:用户在前端只能看到对应权限的元素;其二:在后端对用户操作进行权限检查。
细说shiro之一:shiro简介的更多相关文章
- Shiro权限框架简介
http://blog.csdn.net/xiaoxian8023/article/details/17892041 Shiro权限框架简介 2014-01-05 23:51 3111人阅读 评论 ...
- Shiro (Shiro + JWT + SpringBoot应用)
Shiro (Shiro + JWT + SpringBoot应用) 目录 Shiro (Shiro + JWT + SpringBoot应用) 1.Shiro的简介 2.Shiro + JWT + ...
- SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能
SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能. 第一步:配置web.xml <!-- 配置Shiro过滤器,先让Shiro ...
- Shiro安全框架-简介
1. 简介 Apache Shiro是Java的一个安全框架.功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案. 实际上,Shiro的主要功能 ...
- 【shiro】shiro学习笔记1 - 初识shiro
[TOC] 认证流程 st=>start: Start e=>end: End op1=>operation: 构造SecurityManager环境 op2=>operati ...
- 菜鸟手把手学Shiro之shiro认证流程
一.使用的spring boot +mybatis-plus+shiro+maven来搭建项目框架 <!--shiro--> <dependency> <groupId& ...
- shiro整合shiro多验证登录(账号密码登录和使用手机验证码登录)
1. 首先新建一个shiroConfig shiro的配置类,代码如下: @Configuration是标识这个类是一个配置文件,在启动时会加载这个类里面的内容,这个配置文件的位置的一定一定一定不能 ...
- shiro框架学习-2-springboot整合shiro及Shiro认证授权流程
1. 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- 菜鸟手把手学Shiro之shiro授权流程
一.首先我们从整体去看一下授权流程,然后再根据源码去分析授权流程.如下图: 流程如下: 1.首先调用 Subject.isPermitted*/hasRole*接口,其会委托给 SecurityMan ...
随机推荐
- 【比赛】NOIP2018 铺设道路
原题,而且还是CCF自己的 考虑对于一段最长不上升序列,无论如何都至少有序列第一个数的贡献,可以知道,这个贡献是可以做到且最少的 然后对于序列最后一位,也就是最小的那一个数,可以和后面序列拼起来的就拼 ...
- 【BZOJ1185】[HNOI2007]最小矩形覆盖(凸包,旋转卡壳)
[BZOJ1185][HNOI2007]最小矩形覆盖(凸包,旋转卡壳) 题面 BZOJ 洛谷 题解 最小的矩形一定存在一条边在凸包上,那么枚举这条边,我们还差三个点,即距离当前边的最远点,以及做这条边 ...
- Zabbix使用netstat监控会话
原文链接 TCP的连接状态对于我们web服务器来说是至关重要的,尤其是并发量ESTAB:或者是syn_recv值,假如这个值比较大的话我们可以认为是不是受到了攻击,或是是time_wait值比较高的话 ...
- 一文看懂npm、yarn、pnpm之间的区别
文作者对比了当前主流的包管理工具npm.yarn.pnpm之间的区别,并提出了合适的使用建议,以下为译文: NPM npm是Node.js能够如此成功的主要原因之一.npm团队做了很多的工作,以确保n ...
- http 请求头和响应头
客户端发送请求过程带着的数据: 1.请求地址 2.请求方式 3.请求头 request headers 4.请求参数 https://www.juhe.cn/ 130.... 1a2b....pei ...
- JS引用类型
a,b都是引用类型,它们实际上指向同一个内存空间,同呼吸共命运
- appium 切换native/ webview,findby,还有页面元素定位一直小于0的问题的解决
之前一直有个bug没有解决. 今天,终于解决了. 疑问过程: app是混合应用,项目做了H5优化之后,以前的用例执行总会失败,体现在原来的一个元素点击无反馈 排查原因:1.项目做了H5优化,2.测试的 ...
- Gym102082 G-What Goes Up Must Come Down(树状数组)
Several cards with numbers printed on them are lined up on the table. We’d like to change their orde ...
- 对manacher的一点感性理解
因为总是忘掉板子所以这里贴一下我个人对\(manacher\)的感性理解. 可能不够严谨求轻喷\(QwQ\) char ch = getchar (); s[0] = s[1] = '#'; whil ...
- php小项目踩坑以及其中的注意点(第二篇)
用户登录页面 1.通过数据库验证用户名和密码(可以将里面要用到的数据库信息,放入到一个config文件中) <?php define('DB_HOST','localhost'); define ...